0

Ich habe 2 Datenebenen an die MS DataGridView gebunden. Die untergeordnete Tabelle, die über die Complex-Eigenschaft aufgefüllt wird, ist nicht sichtbar. Gibt es irgendeine Anpassung, die ich tun muss, um die geschachtelte Tabellenansicht in DataGridView zu aktivieren. Bitte beachten Sie das beigefügte Beispiel.Wie werden 2-Level-Elemente in DataGridview geladen?

Hier ist meine DataSource-Klasse.

public class Level1 : INotifyPropertyChanged 
{ 
    bool a; 
    bool dispatch, abandon; 
    List<Level2> sample2data = new List<Level2>(); 

    // private Sample2 sampleval; 
    public Level1(bool value, bool disp, bool aban, List<Level2> val) 
    { 
     a = value; 
     dispatch = disp; 
     abandon = aban; 
     sample2data = val; 

    } 
    public bool Status 
    { 
     get { return a; } 
     set { a = value; OnPropertyChanged("A"); } 
    } 

    public bool Dispatch 
    { 
     get { return dispatch; } 
     set 
     { 
      dispatch = value; 
      sample2data.ForEach(item => item.SampleA = false); 
      OnPropertyChanged("Dispatch"); 
     } 

    } 
    public bool Abandon 
    { 
     get { return abandon; } 
     set { abandon = value; sample2data.ForEach(item => item.SampleB = true); OnPropertyChanged("Abandon"); } 
    } 

    public List<Level2> Sample2 
    { 
     get { return sample2data; } 
     set 
     { 
      sample2data = value; OnPropertyChanged("Sample2"); 
     } 
    } 

    public void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

public class Level2 : INotifyPropertyChanged 
{ 
    public Level2() 
    { 

    } 
    public bool _a, _b; 
    public bool SampleA 
    { 
     get { return _a; } 
     set { _a = value; OnPropertyChanged("SampleA"); } 
    } 
    public bool SampleB 
    { 
     get { return _b; } 
     set { _b = value; OnPropertyChanged("SampleB"); } 
    } 
    public bool SampleC 
    { 
     get; 
     set; 
    } 
    public void OnPropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
} 


class Data 
{ 
    public List<Level1> level1Data = new List<Level1>(); 
    public List<Level2> level2Data = new List<Level2>(); 
    public List<Level1> Level1Data 
    { 
     get { return level1Data; } 
     set { level1Data = value; } 
    } 
    public List<Level2> Level2Data 
    { 
     get { return level2Data; } 
     set { level2Data = value; } 
    } 
    public Data() 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      var newLevel2data = new Level2 
      { 
       SampleC = false 
      }; 
      level2Data.Add(newLevel2data); 
     } 
     for (int i = 0; i < 5; i++) 
     { 
      level1Data.Add(new Level1(false, false, false, level2Data)); 
     } 
    } 

} 

Und hier ist der Code zum Laden Datenquelle für DataGridView.

BindingSource bindingSource = new BindingSource(); 
bindingSource.DataSource = new Data(); 
this.dataGridView1.DataSource = bindingSource; 
this.dataGridView1.DataMember = "Level1Data"; 

Und auch ich noch eine Frage haben, wenn mit den komplexen Eigenschaftsdaten in DataGridView arbeiten, habe ich INotifyPropertyChanged implementiert, um die Eigenschaftsänderungen an den gebundenen Datenquelle des Gitters zu informieren. Obwohl die untergeordnete Tabelle nicht sichtbar ist, habe ich einige Eigenschaftswerte der untergeordneten Klasseneigenschaften geändert. Das Ereignis PropertyChanged für die untergeordnete Klasse ist immer null, sodass die geänderte Eigenschaft nicht benachrichtigt wird. Für die Elternklasse wird die geänderte Eigenschaft jedoch immer benachrichtigt.

Zum Auflösen der PropertyChanged wird Null für untergeordnete Klasse, ich habe das PropertyChanged Ereignis für untergeordnete Klassendaten verknüpft, während Werte für untergeordnete Tabellenliste erstellt. Dadurch werden die Eigenschaften ordnungsgemäß gemeldet.

Hier meine Frage ist, gibt es einen bestimmten Grund oder Notwendigkeit, das PropertyChanged-Ereignis für die untergeordnete Klasse haken? Da keine Verbindung für Klasseneigenschaften der übergeordneten Ebene hergestellt wird. und wie zeige ich die untergeordnete Tabelle in DataGridView mit meiner Datenquelle an?

Bitte lassen Sie mich wissen, die Notwendigkeit, das PropertyChanged Ereignis zu hängen.

Antwort

0

Windows Forms DataGridView unterstützt keine Bindung für verschachtelte Objekte. Sie werden die ursprünglichen Steuer verlängern müssen, sie zu unterstützen, so empfehle ich Ihnen einen Blick auf die folgenden Artikel in Anspruch zu nehmen:

DataGridView: How to bind nested objects

Der Quellcode für den Artikel auf GitHub finden. Wenn der obige Artikel für Sie nicht funktioniert, suchen Sie einfach nach Nested Windows Forms DataGridView auf Ihrer bevorzugten Suchmaschine. Es gibt viele ähnliche Ressourcen, da das Problem, das Sie haben, sehr häufig ist.

Bearbeiten: Ich habe Ihre Frage über die PropertyChanged Veranstaltung verpasst. Sie müssen INotifyPropertyChanged in beiden Klassen implementieren, damit es ordnungsgemäß funktioniert.