2013-01-16 47 views
3

我雖然我會發布這個花費了幾個小時試圖解決後,我無處可去。首先,我完全知道WinForms中的數據綁定並不是最好的。這表示它在大多數情況下都能正常工作。WinForms DataBinding與DataGridView

在我的場景中,我有一個綁定源,它是我的窗體的主人。用於此綁定源的對象也具有一些簡單屬性和兩個綁定列表作爲屬性。這個類和綁定列表的類類型都實現INotifyPropertyChanged。在我的表單中,我有兩個DataGridView用於顯示綁定列表屬性的內容。

這也是通過設計時的數據綁定完成的。我有兩個綁定源,每個使用主綁定源作爲數據源,然後使用各自的綁定列表屬性作爲數據成員。

到目前爲止,我會認爲這是相當標準的。

要更新這些列表中的內容,我有按鈕來顯示創建一個新項目的表單,然後使用BindingList.Add()將其添加到列表中。

現在在代碼中,如果您調試,項目在列表中,但是,網格不會更新。 但是,如果我將列表框添加到只使用其中一個列表綁定源的窗體,那麼兩個網格都會按預期方式開始刷新。

我很抱歉,如果有任何不清楚的地方,我儘量以最好的方式解釋一下這個令人困惑的情況。

任何想法都會有幫助,因爲我真的不想使用隱藏列表框。

+0

我不知道這是否只是我或沒有,但我沒有,如果所有的理解對象綁定實現*** INotifyPropertyChanged *** – alexb

+0

是的,所有正在數據綁定的對象實現INotifyPropertyChanged –

回答

3

此代碼工作正常,我

BindingList<Foo> source; // = ... 
private void Form1_Load(object sender, EventArgs e) 
{ 
    this.dataGridView1.DataSource = new BindingSource { DataSource = source }; 
    this.dataGridView2.DataSource = new BindingSource { DataSource = source, DataMember = "Children" }; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    source.Add(new Foo { X = Guid.NewGuid().ToString() }); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    source[0].Children.Add(new FooChild { Y = Guid.NewGuid().ToString() }); 
} 

與模型

public class Foo : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    string x; 
    public string X 
    { 
     get { return x; } 
     set 
     { 
      x = value; 
      this.NotifyPropertyChanged(); 
     } 
    } 

    BindingList<FooChild> children; 
    public BindingList<FooChild> Children 
    { 
     get { return children; } 
     set 
     { 
      children = value; 
      this.NotifyPropertyChanged(); 
     } 
    } 
} 

public class FooChild : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    string y; 
    public string Y 
    { 
     get { return y; } 
     set 
     { 
      y = value; 
      this.NotifyPropertyChanged(); 
     } 
    } 
} 

兩個網格得到刷新。

我希望這有助於你

編輯

我改變了Form1_Load的 IMPL

+0

我基本上有相同的情況,唯一的區別是,而不是設置數據源網格作爲綁定列表,我將其設置爲BindingSource,因爲BindingSource的其他部分用於表單的其他元素。此外,我試圖限制表單中的代碼量,因爲它在單元測試中效果不佳。但謝謝你的建議。 –

+0

好的,我編輯了BindingSource的示例。我不知道你是否編碼,但我覺得你的Children屬性是BindingList或ObservableCollection很重要,因爲你不僅要通知兒童指定,而且還要添加 – alexb