Índice da linha atualmente selecionada em DataGridView

96

É simples assim. Como faço para obter o índice do selecionado no momento Rowde um DataGridView? Não quero o Rowobjeto, quero o índice (0 .. n).

ErikE
fonte

Respostas:

165

Existe a RowIndexpropriedade para a CurrentCellpropriedade para o DataGridView.

datagridview.CurrentCell.RowIndex

Manipule o SelectionChangedevento e encontre o índice da linha selecionada como acima.

fletcher
fonte
1
Perfeito. Isso parece mais simples / rápido, mesmo em SelectedRows [0] .Index. Isso seria uma boa suposição?
ErikE
Hmm, eu não pensei em várias linhas sendo selecionadas. Não tenho certeza do comportamento da célula atual neste caso.
fletcher
1
Se for semelhante ao Excel, a lista selecionada pode ter várias linhas / colunas, mas há apenas uma célula atual / ativa. Eu só me importo com a linha atual, então isso deve funcionar bem.
ErikE
18
Sei que este post é antigo, mas pode ajudar alguém: CurrentCellretorna a célula "ativa", que é diferente de "Selecionado". Mesmo se houver várias linhas selecionadas, a célula ativa pode estar em outro lugar, e pode haver apenas uma célula ativa
Luke Marlin,
3
E também, mesmo se você desmarcar tudo na visualização da grade de dados, uma das células ainda estará ativa, então você não pode contar com isso sendo nulo ou algo parecido para não haver nenhuma linha selecionada.
Daniel Gray
37

Use a propriedade Index na coleção SelectedRows do DGV:

int index = yourDGV.SelectedRows[0].Index;
Jay Riggs
fonte
Você acha que isso é melhor ou DGV.CurrentCell.RowIndex?
ErikE
4
A célula atual pode não ser selecionada em alguns casos, então este é o melhor caminho a seguir.
Little Endian de
1
@thethuthinnang quando você não selecionou nenhuma linha, a solução de @JayRiggs lançará o erro de índice dois. É melhor você embrulhar com umif
Allan Ruin
7
dataGridView1.SelectedRows[0].Index;

Ou, se você quiser usar LINQ e obter o índice de todas as linhas selecionadas, poderá fazer:

dataGridView1.SelectedRows.Select(r => r.Index);
Justin Niessner
fonte
Útil (IndexOf não estava realmente "no meu radar" ainda), mas rotunda, uma vez que obter a linha não é necessário. O método .Index é o que eu estava procurando.
ErikE de
3

tente fazer isso vai funcionar ... vai lhe dar o índice do índice da linha selecionada ...

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

tente isso

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
}
HyperNova
fonte
Obrigado, exatamente o que eu precisava para determinar qual era o valor oculto de uma linha selecionada ao usar um controle que não estava associado ao gridview.
orgtigger
2

Modifiquei a resposta de @JayRiggs, e isso funciona. Você precisa do ifporque às vezes o SelectedRows pode estar vazio, então a operação de índice lançará uma exceção.

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

Experimente DataGridView.CurrentCellAddress .

Returns: Um Point que representa os índices de linha e coluna da célula atualmente ativa.

EG Selecione a primeira coluna e a quinta linha, e você terá de volta: Ponto (X = 1, Y = 5)

Kilanash
fonte
PS, já que pedi o índice de linha, as coisas teriam sido menos complicadas em nosso relacionamento se você tivesse dito DataGridView.CurrentCellAddress.Y... :)
ErikE
Acho que neste ponto todas essas respostas são válidas, cabe a você decidir qual delas você deseja escolher que seja a mais limpa para seus propósitos. Eu sugiro digitar as diferentes implementações e olhar o IL no .NET Reflector ( red-gate.com/products/reflector ) se você realmente quiser ver qual código é gerado para cada um, mas como muitos dirão, isso é micro -otimização. É realmente o que está mais claro na intenção. PS Nota para ser mais clara no futuro.
Kilanash
1

Tente:

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

Espero que ajude você.

Raaz Salyani
fonte
3
Obrigado por contribuir, mas sua resposta é uma duplicata da resposta selecionada (e mais votada) que deu a solução datagridview.CurrentCell.RowIndex. Minhas desculpas - vou recomendar que esta postagem seja excluída como uma cópia completa.
ErikE
0

Você pode tentar este código:

int columnIndex = dataGridView.CurrentCell.ColumnIndex;
int rowIndex = dataGridView.CurrentCell.RowIndex;
subhankar
fonte
0

Eu usei se obter o valor da linha for clicado:

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
}
Han Nguyen
fonte
-1

Experimente o seguinte:

int myIndex = MyDataGrid.SelectedIndex;

Isso fornecerá o índice da linha atualmente selecionada.

Espero que isto ajude

P_Fitz
fonte