J'ai une DataGridView
à partir d'une base de données.
J'essaie d'obtenir le contenu de la ligne sélectionnée dans l'événement RowEnter
. J'ai défini le mode de sélection de la grille sur FullRowSelect
J'ai essayé ce qui suit:
int orderId = (int)dgUnprocessedCards.Rows[dgUnprocessedCards.SelectedCells[0].RowIndex].Cells[0].Value;
cela continue à jeter l'erreur
Index était hors de portée. Doit être non négatif et inférieur à la taille de la collection.
Toute aide est appréciée.
Je viens d’essayer cela dans un exemple d’application datagridview et cela fonctionne parfaitement; il doit donc y avoir quelque chose dont vous ne nous avez pas parlé.
La première chose à faire est de diviser votre déclaration en une déclaration plus petite afin que vous puissiez voir exactement où se situe l’échec.
Vous pouvez réécrire le code ci-dessus en quelque chose comme ceci à des fins de débogage:
var cellindex = dgUnprocessedCards.SelectedCells[0].RowIndex;
var cellcollection = dgUnprocessedCards.Rows[cellindex].Cells[0];
int orderId = (int)dgUnprocessedCards.Value;
En outre, vous devriez être capable de faire ce qui suit pour obtenir ce que vous voulez:
int orderId = (int)dataGridView1.SelectedRows[0].Cells[0].Value;
Cela utilise la collection SelectedRows qui est un peu plus concise et je dirais le moyen le plus habituel d’accéder aux éléments sélectionnés à partir de la fenêtre de données.
Enfin, vous souhaiterez probablement vérifier votre distribution de la valeur, car celle-ci ne sera pas nécessairement un entier. Quelque chose comme:
int orderid;
if (!int.TryParse(cellcollection.Value.ToString(), out orderid))
{
// Some logic to deal with the fact that Value was not an int
}
Quand l'événement SelectionChanged est-il déclenché?
À présent, comme vous l'avez dit, votre sélection a changé d'événement et s'est déclenchée lors du chargement des données dans la grille. Cela ne semble pas poser de problème dans ma version de test, mais pourrait faire partie de votre problème.
La raison pour laquelle cela se produit ne devrait pas être liée au type de source de données que vous utilisez, mais au moment où vous attachez la sélection du gestionnaire d'événements modifié. Cela est dû au fait que la liaison de données provoque la levée d'un événement de sélection modifiée.
Si vous ajoutez un gestionnaire d'événements à l'événement DataBindingComplete et y attachez vos gestionnaires d'événements SelectionChanged ou RowEnter, vous ne devez pas voir le gestionnaire appelé lors de la liaison de données.
void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
this.dataGridView1.RowEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_RowEnter);
this.dataGridView1.SelectionChanged += new System.EventHandler(this.dataGridView1_SelectionChanged);
}
Notez que vous devrez supprimer l'attachement d'événement généré par le concepteur et référencer les méthodes générées par le concepteur pour que cela fonctionne.
Cela fonctionne aussi:
int orderId = (int)dgUnprocessedCards.SelectedCells[0].OwningRow.Cells[0].Value;
Ce que j'ai essayé de faire a bien fonctionné, mais la liaison a appelé l'événement de modification de sélection. J'ai donc fait ce que David Hall avait suggéré (attacher et détacher l'événement) et je l'ai également mis dans un bloc catch try et maintenant cela fonctionne parfaitement.