DataGridView获取当前选定对象

50

我需要从数据绑定的DataGridView中获取当前选定的对象。

我不需要当前选定单元格的对象,而是整行所基于的对象,在这种情况下是一个BusinessObject对象,其属性使网格的列。

我可以通过DataSource来实现, 但它本身只是一个对象,可以是BindingSource或IBindingList之类的东西 - 所以没有简单的标准化方法来获取想要的对象。

背后的原因是需要检查businessObject对象是否具有名为IsChanged的属性,并在Bindingsource选择下一项之前询问用户保存或放弃更改。因此,我必须在DataGridView的RowValidating事件中找到当前对象,因为Bindingsource不提供在发生更改之前停止更改的事件。请参见此处关于众所周知的问题

感谢阅读 ;-)

6个回答

96

DataGridViewRow.DataBoundItem 包含了它所绑定到的 'business' 对象。


4
谢谢你正确地提示我,有时候一个人应该放松下来,不要过分搜索... - Oliver Friedrich
1
这比缓存数据然后尝试使用所选索引要好得多。谢谢! - styfle
只是想提一下,如果您的数据网格没有与数据进行“绑定”,而是仅通过“DataSource”应用了它,这也可以起作用。 - oo_dev
请参考以下示例:https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.forms.datagridviewrow.databounditem?view=net-5.0 - nogood

7

这是我的代码,请将其放入你的Person类中

 public static explicit operator Person(DataRow dr)
    {
        Person p = new Person();
        p.adi = dr.ItemArray[0].ToString();
        p.id = Int32.Parse(dr.ItemArray[1].ToString());
        p.soyadi = dr.ItemArray[2].ToString();
        p.kartNo = dr.ItemArray[3].ToString();
        p.dogumTarihi = DateTime.Parse( dr.ItemArray[4].ToString() );
        p.adres = dr.ItemArray[5].ToString();
        p.meslek = dr.ItemArray[6].ToString();
        p.telefon = dr.ItemArray[7].ToString();
        p.gsm = dr.ItemArray[8].ToString();
        p.eposta = dr.ItemArray[9].ToString();

        return p;
    }

这是一个更新按钮点击事件。

DataRow row = (dataGridView1.SelectedRows[0].DataBoundItem as DataRowView).Row;
Person selected = (Person)row;

4

您也可以使用这个简短的代码。

Person selected = dataGridView1.SelectedRows[0].DataBoundItem as Person;

0

这种方式怎么样?

foreach (DataGridViewRow item in this.dataGridView1.SelectedRows)
{
  MessageBox.Show(item.Cells[0].Value.ToString());
}

我们可以获取多个选定行的数据。

0

既然你提到了IBindingList - 是的,正如其他人所说,DataBoundItem属性将为您提供所需的内容 - 我之前遇到过一个问题,最终导致空引用,但现在我想不起来它发生的情况。

如果您使用BindingSource进行数据绑定 - 您可以捕获BindingSource的CurrentChanged,CurrentItemChanged事件,那么您就不需要在B.O.上有额外的IsChanged属性.. ,此外,底层数据源也可以指示修改 - 例如,如果您将BindingSource绑定到datatable,则行将为您提供修改标志。


-1

您可以像这样获取所选单元格的值

yourDGV.CurrentCell.Value;

如果您想要以字符串形式返回值,只需使用ToString()方法,例如:
yourDGV.CurrentCell.Value.ToString();

搞定啦


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接