只想问一下如何在过滤后获取DataGridView
中所选行的原始行索引。
我有DataGridView
,有两列:名称和年龄。我有一个TextBox
作为过滤器。假设我有8条记录,过滤后它仅移至4条记录,并单击最后一条记录,我得到的行索引为4,而我需要获取该行的原始索引并显示在MessageBox
上。我该怎么办?
谢谢。
答案 0 :(得分:3)
原始行索引表示DataRow
中DataTable
中DataTable.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;
}
}