2010-09-22 5 views
0

Je suis un peuplant datagridview avec des objets comme celui-ci:DataSource Datagridview est nul

 foreach (NavField field in this.Fields) 
     { 
      DataGridViewColumn column = new DataGridViewColumn(); 
      column.HeaderText = field.Caption; 
      column.Name = field.FieldNo.ToString(); 
      column.ValueType = field.GetFieldType(); 
      column.CellTemplate = new DataGridViewTextBoxCell(); 

      grid.Columns.Add(column); 
     } 

     int count = 0; 
     foreach (NavRecord record in this.Records) 
     { 
      grid.Rows.Add(); 
      foreach (NavItem item in record.items) 
      { 
       //Adding the rows 
       grid.Rows[count].Cells[item.FieldNo.ToString()].Value = item.RecordValue; 

      } 
      count++; 
     } 

Mais la source de données de la grille reste nulle. Existe-t-il une autre solution pour remplir la grille ou mettre à jour la source de données?

Répondre

0

Créez DataTable et liez-le à DataGrid.

dataGrid.DataSource = dataTable 
+0

Dans la deuxième boucle, j'ai d'autres conditions à remplir pour ajouter la ligne (que je n'ai pas incluse dans la question). De plus, les lignes sont mappées sur les champs selon certaines conditions, pas seulement l'index de la colonne. Pour la source de données, j'ai pensé que nous pouvions pousser le datagridview vers la source de données. Est-ce possible? Je n'ai pas utilisé datatable car la datable ne correspond pas correctement à la vue de données, il y a des choses comme le texte d'en-tête qui est une légende dans les colonnes datatable ou hide qui est fait différemment. –

1

La source de données est nulle car vous ne l'avez jamais définie.

Vous pouvez simplement définir grid.DataSource = this.Records et ignorer complètement la deuxième boucle foreach. Cela nécessiterait que vous définissiez également le DataPropertyName de chaque colonne que vous ajoutez à la grille.

Cela peut ne pas fonctionner avec votre classe personnalisée NavRecord sans quelques modifications, cependant (ne peut pas dire avec certitude, sauf si vous postez le code pour cela aussi bien).

foreach (NavField field in this.Fields) 
{ 
    DataGridViewColumn column = new DataGridViewColumn(); 
    column.HeaderText = field.Caption; 
    column.Name = field.FieldNo.ToString(); 
    column.ValueType = field.GetFieldType(); 
    column.CellTemplate = new DataGridViewTextBoxCell(); 
    // added: 
    column.DataPropertyName = field.FieldNo.ToString(); 

    grid.Columns.Add(column); 
} 

grid.DataSource = this.Records; 

Oh, et vous pouvez définir grid.AutoGenerateColumns = false; autrement chaque colonne peut apparaître deux fois lors de l'utilisation de cette approche.

+0

Grid.Rows et Grid.Columns sont différents des lignes et des colonnes DataTable. Lorsque vous manipulez Grid.Rows et Grid.Columns, vous manipulez uniquement la mise en page. Si vous liez des données à DataGrid, vous devez définir des données comme Bernhof l'a dit –

+0

Dans la deuxième boucle, j'ai d'autres conditions à remplir pour ajouter la ligne (que je n'ai pas incluse dans la question). De plus, les lignes sont mappées sur les champs selon certaines conditions, pas seulement l'index de la colonne. Pour la source de données, j'ai pensé que nous pouvions pousser le datagridview vers la source de données. Est-ce possible? –

+0

Je ne suis pas sûr de ce que vous voulez dire en poussant le datagridview vers la source de données - pourriez-vous élaborer? – bernhof

Questions connexes