Í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).

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.


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;

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);

Ú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());

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
}

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;
}

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)


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ê.


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;

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
}

-1

Experimente o seguinte:

int myIndex = MyDataGrid.SelectedIndex;

Isso fornecerá o índice da linha atualmente selecionada.

Espero que isto ajude

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.