0

Я ограничил 2 уровня данных в MS DataGridView. Детский стол, который заполняется через свойство Complex, не отображается. Есть ли какая-либо настройка, которую я должен сделать, чтобы включить вложенное представление таблицы в DataGridView. Пожалуйста, обратитесь к прилагаемому образцу.Как загрузить 2 уровня предметов в DataGridview?

Вот мой класс DataSource.

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

} 

А вот источник данных код загрузки для DataGridView.

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

А также у меня есть еще один вопрос, при работе со сложными данными собственности в DataGridView я реализовал INotifyPropertyChanged уведомлять об изменениях свойств в связанный источник данных сетки. Хотя дочерняя таблица не отображается, я изменил некоторые значения свойств дочернего класса, событие PropertyChanged для дочернего класса всегда равно null, поэтому свойство изменено не уведомлено. Но для родительского класса измененное свойство всегда уведомляется.

Чтобы решить проблему PropertyChanged, значение null для дочернего класса, я подключил событие PropertyChanged для данных дочернего класса при создании значений для списка дочерних таблиц. Таким образом, свойства уведомляются должным образом.

Здесь мой вопрос: существует ли какая-либо конкретная причина или необходимость подключить событие PropertyChanged для дочернего класса? Потому что для свойств класса родительского уровня не выполняется никакой привязки. и как показать дочерний стол в DataGridView с моим источником данных?

Пожалуйста, дайте мне знать о необходимости подключения события PropertyChanged.

ответ

0

Windows Forms DataGridView не поддерживает привязку для вложенных объектов. Вы должны будете продлить первоначальный контроль, чтобы поддержать его, поэтому я предлагаю вам взглянуть на следующие статьи:

DataGridView: How to bind nested objects

Исходный код для этой статьи можно найти на GitHub.

Если вышеуказанная статья не работает для вас, просто найдите Nested Windows Forms DataGridView в вашей любимой поисковой системе. Есть много похожих ресурсов, так как проблема, которую вы имеете, очень распространена.

Редактировать: Я пропустил ваш вопрос о событии PropertyChanged. Вам необходимо реализовать INotifyPropertyChanged в обоих классах, чтобы он работал правильно.