0

J'ai lié 2 niveaux de données à MS DataGridView. La table enfant qui est remplie via la propriété Complex n'est pas visible. Y at-il une personnalisation que je dois faire pour activer la vue de la table imbriquée dans DataGridView S'il vous plaît se référer à l'exemple ci-joint.Comment charger 2 éléments de niveau à DataGridview?

Voici ma classe 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)); 
     } 
    } 

} 

Et voici le code de chargement de source de données pour DataGridView.

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

et moi avons aussi une question, Lorsque vous travaillez avec les données de propriété complexes DataGridView, je l'ai mis en œuvre INotifyPropertyChanged de notifier les modifications de propriétés à la source de données liée de la grille. Bien que la table enfant ne soit pas visible, j'ai modifié certaines valeurs de propriété des propriétés de classe enfant, l'événement PropertyChanged pour la classe enfant est toujours null, donc la propriété modifiée n'est pas notifiée. Mais pour la classe parente, la propriété modifiée est toujours notifiée.

Pour résoudre le PropertyChanged devient null pour la classe enfant, j'ai accroché l'événement PropertyChanged pour les données de classe enfant, tout en créant des valeurs pour la liste de table enfant. Par ce biais, les propriétés sont notifiées correctement.

Voici ma question est, Y at-il une raison spécifique ou une nécessité de hooker l'événement PropertyChanged pour la classe enfant? Parce qu'aucun raccordement n'est fait pour les propriétés de classe de niveau parent. et comment afficher la table enfant dans DataGridView avec ma source de données?

S'il vous plaît laissez-moi savoir la nécessité d'accrocher l'événement PropertyChanged.

Répondre

0

Windows Forms DataGridView ne prend pas en charge la liaison pour les objets imbriqués. Vous devrez étendre le contrôle d'origine pour le soutenir, alors je vous suggère de jeter un oeil à l'article suivant:

DataGridView: How to bind nested objects

Le code source de l'article se trouve sur GitHub.

Si l'article ci-dessus ne fonctionne pas pour vous, recherchez Nested Windows Forms DataGridView sur votre moteur de recherche préféré. Il y a beaucoup de ressources similaires puisque le problème que vous avez est très commun.

Modifier: J'ai raté votre question sur l'événement PropertyChanged. Vous devez implémenter INotifyPropertyChanged dans les deux classes pour qu'il fonctionne correctement.