[英]Databound Windows Forms control does not recognize change until losing focus
[英]C# Databound Windows Forms control does not retain value unless you leave the field
我看到數據綁定Windows窗體控件中的答案在失去焦點之前無法識別更改 。
但這並沒有完全回答我的問題。 我有完全相同的情況。 在ToolStrip_click上,我瀏覽了所有控件並強制執行“WriteValue()”,但它仍然會在保存之前恢復到之前的值。 任何人都可以建議我如何解決這個問題? 我錯誤地實現了這個嗎?
(參見當前(非工作)解決方案的代碼。)
private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
// Make sure that all items have updated databindings.
foreach (Control C in this.Controls)
{
foreach (Binding b in C.DataBindings)
{
// Help: this doesn't seem to be working.
b.WriteValue();
}
}
}
代碼現在變得更加簡單,但它是一個相當大的黑客。 我很高興知道是否有更“適當”的解決方案。
private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
// Make sure that all text fields have updated by forcing everything
// to lose focus except this lonely little label.
label44.Focus();
}
問題可能是您的數據綁定控件設置為在驗證時更新。
您需要將每個數據綁定控件的DataSourceUpdateMode設置為DataSourceUpdateMode.OnPropertyChanged。 例如,數據綁定文本框:
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text",
this.someBindingSource, "SomeProperty", true,
System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
您還可以通過以下方式在設計器中設置數據源更新模式:
選擇控件並轉到屬性窗口 - >(DataBindings) - >(高級)
- >將下拉列表中的[數據源更新模式]設置為OnPropertyChanged。
干杯
單擊時,ToolStripButton不會獲取焦點。 您可以添加一些代碼(暫時)聚焦另一個控件。 您可以聚焦標簽(作為中性假人)。
你有什么約束力? 如果它是DataSet,DataTable等,或者更好的是BindingSource,你應該調用EndEdit:
private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
// Assuming that you are binding to bindingSource1:
bindingSource1.EndEdit();
}
我在我的表單上實現了一個ISave
接口來處理臟狀態和保存, 每當檢查臟狀態時(無論何時調用IsDirty),我總是在綁定源上使用EndEdit:
interface ISave
{
bool IsDirty;
bool Save(bool force);
}
使用此接口,當應用程序正在關閉時,我可以輕松地遍歷打開的MdiChild窗口,通過將子窗體轉換為ISave
並檢查IsDirty
的值來查看是否已保存任何信息。 在這里,我在適當的綁定源或綁定控件(例如,網格)上調用EndEdit。
並原諒漫步,但我認為這可能會有所幫助。 其余的工作如下:
Save()
采用“force”參數,因此我可以在表單中添加“保存並關閉”按鈕(保存用戶額外點擊或確認是否要保存更改)。 如果force為false,則Save()
方法負責詢問用戶是否要保存。 如果確實如此,則假定用戶已經確定他們肯定想要保存他們的信息,並且會跳過此確認。
如果繼續執行調用代碼(可能是Form_Closing事件)是安全的,則Save()
返回bool- true。 在這種情況下,(如果force為false),給定YesNoCancel MessageBox,用戶選擇Yes或No並且save本身不會拋出錯誤。 或者,如果用戶選擇“ 取消”或出現錯誤(換句話說,告訴調用代碼取消表單關閉), Save()
將返回false。
如何處理錯誤取決於您的異常捕獲約定 - 這可以在Save()
方法中捕獲並顯示給用戶,或者可能在諸如FormClosing的事件中,其中e.Cancel
將設置為true。
與表單結束事件一起使用時,它看起來像這樣:
private void form1_FormClosing(object sender, CancelEventArgs e)
{
if (IsDirty)
e.Cancel = !Save(false);
}
與“保存並關閉”按鈕強制保存一起使用時,它看起來像這樣:
private void btnSaveAndClose_Click(object sender, EventArgs e)
{
if (IsDirty)
if (Save(true))
Close();
}
無論如何,比你要求的多一點,但我希望這有幫助!
這讓我過去很難過。 除了將DataSourceUpdateMode設置為OnPropertyChanged之外,數據源中的基礎列不能只讀。
在DataTable中檢查您的列:
dataTable.Columns("ColumnName").ReadOnly
我甚至創建了一個函數,將所有列設置為不是ReadOnly,它不止一次派上用場:
Public Function MakeReadOnlyFalse(ByVal dt As DataTable) As DataTable
For Each col As DataColumn In dt.Columns
If col.ReadOnly Then
col.ReadOnly = False
End If
Next
Return dt
End Function
嘗試這個:
private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
// Make sure that all items have updated databindings.
foreach (Control C in this.Controls)
{
C.SuspendLayout();
foreach (Binding b in C.DataBindings)
{
// Help: this doesn't seem to be working.
b.WriteValue();
}
C.ResumeLayout();
}
}
對我來說這是最糟糕的。 如果我在更改組合框上將更新源模式設置為OnPropertyChanged,它的行為就像我將其設置為Onvalidation模式一樣! 綁定在wpf中要好得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.