【问题标题】:Displaying original rowindex after filter in datagridview在datagridview中过滤后显示原始rowindex
【发布时间】:2018-06-23 07:48:11
【问题描述】:

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

我有 DataGridView 有 2 列:姓名和年龄。我有一个TextBox 作为过滤器。假设我有 8 条记录,过滤后它只有 4 条记录,单击最后一条记录后,我得到的行索引为 4,而我需要获取该行的原始索引并将其显示在 MessageBox 上。我将如何做? 谢谢。

【问题讨论】:

  • 是数据绑定还是手动添加?
  • 你为什么需要它的索引?
  • 它是数据绑定的,我需要显示当前选择的记录。谢谢。

标签: c# .net winforms datagridview


【解决方案1】:

原始行索引是指DataTableDataRow的索引,可以通过DataTable.Rows.IndexOf(row)找到。因此,要找到该行的原始索引,您可以使用以下代码:

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

如果您有兴趣对 DataGridView 中的所有行执行此操作,正如 Taw 在 cmets 中提到的那样,您可以查看 DataGridViewRowDataBoundItem

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

【讨论】:

  • 在处理在行标题中显示所有原始行索引的任务时,我想出了这个index = ((DataView)dataGridView2.DataSource).Table.Rows.IndexOf(((DataRowView)row.DataBoundItem).Row);,其中行是 DGV 行。
  • 嗨,伙计们,我似乎无法获得上面的 dgvrow。对于第一个代码,我根据过滤器而不是原始索引获得 rowindex。请多多包涵,因为我才刚刚开始学习编程。谢谢。
  • @newbie 对于第二种解决方案,dgvRow 可以是任何行,例如dataGridView1.CurrentCell.OwningRow,即当前行。
  • 对于第一个选项,如果您正确设置过滤器,它将运行良好。比如dt就是DataTable,先把DataGridView的数据源设置成dataGridView1.DataSource = dt,然后过滤就设置dataGridView1.DefaultView.RowFilter = "your filter string"。然后在需要获取当前行的索引时应用我共享的代码。
  • 大家好,我仍然无法获得原始的行索引。
【解决方案2】:

从你的 cmets 你说你需要它来显示当前选择的记录,所以我不会直接回答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;
    }
}

【讨论】:

  • 谢谢,这很好用。唯一缺少的是我将如何显示这个的记录号。假设这是我 8 条记录中的第 3 条记录。我将如何显示 3。请注意,它显示没有过滤器的 3,但是当我过滤时,它显示当前过滤器的行索引。谢谢。
  • 我想再问你一件事,因为也许我们可以让你更轻松。你的DataTable 中是否有primary key 你绑定到dgv?
  • 是的,我用这个名字作为主要名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多