Index de la ligne actuellement sélectionnée dans DataGridView


96

C'est si simple. Comment puis-je obtenir l'index du actuellement sélectionné Rowd'un DataGridView? Je ne veux pas l' Rowobjet, je veux l'index (0 .. n).

Réponses:


165

Il existe la RowIndexpropriété de la CurrentCellpropriété du DataGridView.

datagridview.CurrentCell.RowIndex

Gérez l' SelectionChangedévénement et recherchez l'index de la ligne sélectionnée comme ci-dessus.


1
Parfait. Cela semble le plus simple / le plus rapide, même sur SelectedRows [0] .Index. Serait-ce une bonne hypothèse?
ErikE

Hmm, je n'ai pas pensé à la sélection de plusieurs lignes. Je ne suis pas sûr du comportement de la cellule actuelle dans ce cas.
fletcher

1
Si cela ressemble à Excel, la liste sélectionnée peut comporter plusieurs lignes / colonnes, mais il n'y a qu'une seule cellule actuelle / active. Je ne me soucie que de la ligne actuelle, donc cela devrait bien fonctionner.
ErikE

18
Je sais que ce message est ancien, mais il pourrait aider quelqu'un d'autre: CurrentCellrenvoie la cellule "active", qui est différente de "Sélectionné". Même s'il y a plusieurs lignes sélectionnées, la cellule active peut être ailleurs et il ne peut y avoir qu'une seule cellule active
Luke Marlin

3
Et aussi, même si vous désélectionnez tout dans la vue de la grille de données, l'une des cellules sera toujours active, vous ne pouvez donc pas vous fier à ce que ce soit nul ou quelque chose comme ça car aucune ligne n'est sélectionnée.
Daniel Gray

37

Utilisez la propriété Index dans la collection SelectedRows de votre DGV:

int index = yourDGV.SelectedRows[0].Index;

Pensez-vous que c'est mieux ou DGV.CurrentCell.RowIndex?
ErikE

4
La cellule actuelle peut ne pas être sélectionnée dans certains cas, c'est donc la meilleure façon de procéder.
Little Endian

1
@thethuthinnang lorsque vous n'avez sélectionné aucune ligne, la solution de @JayRiggs lancera l'erreur d'index deux. Vous feriez mieux de l'envelopper avec unif
Allan Ruin

7
dataGridView1.SelectedRows[0].Index;

Ou si vous souhaitez utiliser LINQ et obtenir l'index de toutes les lignes sélectionnées, vous pouvez faire:

dataGridView1.SelectedRows.Select(r => r.Index);

Utile (IndexOf n'était pas encore vraiment "sur mon radar"), mais rond-point car obtenir la ligne n'est pas nécessaire. La méthode .Index est ce que je recherchais.
ErikE


3

essayez ceci, cela fonctionnera ... cela vous donnera l'index de l'index de ligne sélectionné ...

int rowindex = dataGridView1.CurrentRow.Index;
MessageBox.Show(rowindex.ToString());

2

essaye ça

bool flag = dg1.CurrentRow.Selected;

if(flag)
{
  /// datagridview  row  is  selected in datagridview rowselect selection mode

}
else
{
  /// no  row is selected or last empty row is selected
}

Merci, exactement ce dont j'avais besoin pour déterminer la valeur cachée d'une ligne sélectionnée lors de l'utilisation d'un contrôle qui n'était pas associé à la grille.
orgtigger

2

J'ai modifié la réponse de @JayRiggs, et cela fonctionne. Vous en avez besoin ifcar parfois, SelectedRows peut être vide, l'opération d'indexation lèvera une exception.

if (yourDGV.SelectedRows.Count>0){
    int index = yourDGV.SelectedRows[0].Index;
}

1

Essayez DataGridView.CurrentCellAddress .

Renvoie: un point qui représente les index de ligne et de colonne de la cellule actuellement active.

EG Sélectionnez la première colonne et la cinquième ligne, et vous reviendrez: Point (X = 1, Y = 5)


PS depuis que j'ai demandé l'index des lignes, les choses auraient été moins difficiles dans notre relation si vous aviez dit DataGridView.CurrentCellAddress.Y... :)
ErikE

Je pense qu'à ce stade, toutes ces réponses sont valables, c'est à vous de décider laquelle vous voulez choisir la plus propre à vos fins. Je suggérerais de taper les différentes implémentations et de regarder l'IL dans .NET Reflector ( red-gate.com/products/reflector ) si vous voulez vraiment voir quel code est généré pour chacune, mais comme beaucoup le diront, c'est micro -optimisation. C'est vraiment ce qui est le plus clair dans l'intention. PS Note prise pour être plus claire à l'avenir.
Kilanash

1

Essayez-le:

int rc=dgvDataRc.CurrentCell.RowIndex;** //for find the row index number
MessageBox.Show("Current Row Index is = " + rc.ToString());

J'espère que cela vous aidera.


3
Merci de votre contribution, mais votre réponse est un double de la réponse sélectionnée (et la plus votée) qui a donné la solution datagridview.CurrentCell.RowIndex. Mes excuses, je vais recommander que ce message soit supprimé en tant que duplicata complet.
ErikE

0

Vous pouvez essayer ce code:

int columnIndex = dataGridView.CurrentCell.ColumnIndex;
int rowIndex = dataGridView.CurrentCell.RowIndex;

0

J'ai utilisé si on clique sur obtenir la valeur de la ligne:

private void dataGridView_Product_CellClick(object sender, DataGridViewCellEventArgs e){
    int rowIndex;
    //rowIndex = e.RowIndex; //Option 1
    //rowIndex= dataGridView_Product.CurrentCell.RowIndex; //Option 2
    rowIndex = dataGridView_Product.CurrentRow.Index; //Option 3
}

-1

Essayez ce qui suit:

int myIndex = MyDataGrid.SelectedIndex;

Cela donnera l'index de la ligne actuellement sélectionnée.

J'espère que cela t'aides

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.