簡體   English   中英

除非您離開字段,否則C#Databound Windows窗體控件不會保留值

[英]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,用戶選擇YesNo並且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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM