在datagridview中过滤后显示原始rowindex

时间:2018-06-23 07:48:11

标签: c# .net winforms datagridview

只想问一下如何在过滤后获取DataGridView中所选行的原始行索引。

我有DataGridView,有两列:名称和年龄。我有一个TextBox作为过滤器。假设我有8条记录,过滤后它仅移至4条记录,并单击最后一条记录,我得到的行索引为4,而我需要获取该行的原始索引并显示在MessageBox上。我该怎么办? 谢谢。

2 个答案:

答案 0 :(得分:3)

原始行索引表示DataRowDataTableDataTable.Rows.IndexOf(row)的索引。因此,要查找该行的原始索引,可以使用以下代码:

var r = ((DataRowView)BindingContext[dataGridView1.DataSource].Current).Row;
var index = r.Table.Rows.IndexOf(r);

如果您有兴趣对DataGridView中的所有行执行此操作,正如Taw在评论中提到的那样,您可以查看DataBoundItem中的DataGridViewRow:< / p>

var r = ((DataRowView)dgvRow.DataBoundItem).Row; // dgvRow is a row of the DataGridView
var index = r.Table.Rows.IndexOf(r);

答案 1 :(得分:0)

从您的评论中您说,您需要它来显示所选的当前记录,因此我不会直接回答How to get row index on filtered table,而是how to get current record selected

因此,只需使用以下代码即可获取当前选定的记录:

//Use this one if your datagridview SelectionMode is not FullRowSelect
DataGridViewRow row = dataGridView1.Rows[dataGridView1.SelectedCells[0].RowIndex];
string name = row.Cells["Name"].Value.ToString();
int age = Convert.ToInt32(row.Cells["Age"].Value);


//If your datagridview SelectionMode is FullRowSelect then use this
DataGridViewRow row = dataGridView1.SelectedRows[0];
string name = row.Cells["Name"].Value.ToString();
int age = Convert.ToInt32(row.Cells["Age"].Value);

Reza回答了问题的主要部分,但是如果由于某种原因它不起作用,则可以使用它,因为您的主键是您的NAME

foreach(DataRow r in yourDataTable.Rows)
{
    if(r["NAME"].ToString() == row.Cells["Name"].Value.ToString()) //This row.cells... is the one from above code
    {
        int originalRowIndexInDataTable = dt.Rows.IndexOf(r);
        return;
    }
}