2009-09-06 5 views
1

Le code suivant lève une exception InvalidOperationException avec le message ci-dessus et je ne comprends pas pourquoi. Mon code appelle la méthode suivante lorsque l'utilisateur peut avoir apporté des modifications à la source de données sous-jacente de datagridview. L'objectif est de mettre à jour l'affichage avec les données modifiées et de conserver la colonne et l'ordre de tri.L'opération ne peut être effectuée que sur les cellules appartenant à un contrôle DataGridView

 
private void ReloadDataGridBindingListFromDatabase() 
     { 
      DataGridView dgv = myDataGridViewControl; 
      DataGridViewColumn sortedColumn = dgv.SortedColumn; 
      SortOrder sortOrder = dgv.SortOrder; 

      //do stuff here to refresh dgv.DataSource 

      if (sortedColumn != null) 
      { 
       //this line throws an exception 
       sortedColumn.HeaderCell.SortGlyphDirection = sortOrder; 
      } 

      //etc. 
     } 

De toute évidence, sortedColumn.HeaderCell est une cellule qui appartient à un contrôle DataGridView. Alors pourquoi je reçois cette exception?

Un grand merci pour votre contribution.

Répondre

1

Peu importe. Il est devenu clair pour moi que la reliaison de la source de données de datagridview détruit toutes les colonnes de la vue de données et en crée de nouvelles. Donc, je ne peux pas accrocher à une référence de colonne à travers la reliure.

2

je suis tombé sur cette erreur lorsque: En utilisant l'exemple de Microsoft DataGridViewAutoFilterColumnHeaderCell et Réglage de la DataSource du DataGridView en cas OnLoad d'une fenêtre.

Il apparaît si vous liez un DataGridView à un DataTable dont DefaultView a une condition de tri dont l'un des DataGridViewAutoFilterColumn de vous pouvez obtenir cette erreur. Donc, pour contourner le problème avant de régler votre DataSource, effacez l'ordre de tri sur le DataTableDefaultView.

par exemple:

// Without this line if the sort included a column that is an 
// auto filter column you will get an error 
table.DataView.Sort = ""; 

dataGridView.DataSource = new BindingSource(table, null); 

====================

J'ai essayé la solution proposée ci-dessus - il ne fonctionne pas pour moi exactement, mais cela m'a mis sur la bonne voie. J'offre ma solution (très similaire).

myBindingSource.DataSource = myAlreadyFilledDataTable 
    myBindingSource.RemoveSort() 
    myDataGridView.DataSource = myBindingSource 
Questions connexes