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.