2013-01-16 3 views
3

나는 이것을 아무렇게나 보내지 않으려 고 노력하면서 몇 시간을 보낸 후에 이것을 게시 하겠지만. 첫째, WinForms에서의 데이터 바인딩이 최선이 아니라는 것을 완전히 알고 있습니다. 그것은 대부분의 시나리오에서 효과가 있다고 말했습니다.DataGridView를 사용하여 WinForms 데이터 바인딩

제 시나리오에서는 제 양식의 마스터 인 제본 소스가 있습니다. 이 바인딩 원본에 사용되는 개체에는 몇 가지 간단한 속성과 두 개의 바인딩 목록이 속성으로 있습니다. 이 클래스와 바인딩 목록의 클래스 형식은 모두 INotifyPropertyChanged를 구현합니다. 내 양식에는 바인딩 목록 속성의 내용을 표시하는 두 개의 DataGridView가 있습니다.

이 또한 디자인 타임에 데이터 바인딩을 통해 수행됩니다. 데이터 소스로 기본 바인딩 소스를 사용하고 데이터 멤버로 각각의 바인딩 목록 속성을 사용하는 각각에 대해 두 개의 바인딩 소스가 있습니다.

지금까지는 이것을 상당히 표준적인 것으로 생각했습니다.

이 목록에있는 내용을 업데이트하려면 새 항목을 만드는 양식을 표시하는 단추가 있습니다. 그런 다음 BindingList.Add()를 사용하여 목록에 추가합니다.

코드에서 디버깅 할 경우 항목이 목록에 있지만 그리드가 업데이트되지 않습니다. 그러나 목록 바인딩 소스 중 하나만 사용하는 폼에 목록 상자를 추가하면 두 그리드 모두 예상대로 새로 시작됩니다.

불분명 한 점이 있으면 사과드립니다. 혼란스러운 상황에서 가능한 한 최선을 다해 설명하려고 노력했습니다.

숨겨진 목록 상자를 사용하고 싶지 않으므로 어떤 생각이 도움이 될 것입니다.

+0

내가 모르는 를 Form1_Load IMPL을 변경하지만 모든 경우에 이해하지 못했다 당신에게

편집

도움이되기를 바랍니다 개체 바인드 된 구현 *** INotifyPropertyChanged *** – alexb

+0

예, 데이터 바인딩되는 모든 개체는 INotifyPropertyChanged를 구현합니다. –

답변

3

이 코드는 모델

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(); 
     } 
    } 
} 

두 격자를 새로 고칠 수 나를

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() }); 
} 

을 위해 잘 작동합니다.

나는 이것이 내가 나를하거나하지의 경우

+0

본질적으로 동일한 시나리오가 있지만 유일한 차이점은 데이터 원본을 그리드를 바인딩 목록으로 사용하는 대신 BindingSource의 다른 부분이 양식의 다른 요소에 사용되므로 BindingSource로 설정했습니다. 또한, 단위 테스트를 위해 잘 작동하지 않기 때문에 양식의 코드 양을 제한하려고합니다. 그러나 제안에 감사드립니다. –

+0

좋아, BindingSource에 대한 나의 예를 편집했다. 코딩했는지는 모르겠지만 BindingList이거나 ObservableCollection 일 수 있다는 점을 중요하게 생각합니다. 어린이 할당뿐만 아니라 추가 사항을 알릴 필요가 있기 때문입니다. – alexb

관련 문제