【问题标题】:DataGridView get current selected objectDataGridView 获取当前选中的对象
【发布时间】:2011-01-06 07:09:45
【问题描述】:

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

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

我可以查看 DataSource,但它本身只是一个对象,可以是 BindingSource 或 IBindingList 或类似的东西 - 因此获取所需对象的标准化方法并不容易。

在这之后,需要在绑定源选择下一项之前检查 businessObject 是否有一个名为 IsChanged 的​​属性,并要求用户保存或放弃更改。因此,我必须找出 DataGridView 的 RowValidating-Event 中的当前对象,因为 BindingSource 不提供在更改发生之前停止更改的事件。See here for the well known problem

感谢阅读 ;-)

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    DataGridViewRow.DataBoundItem 包含它所绑定的“业务”对象。

    【讨论】:

    • 感谢您正确提示我,有时人们应该放松一下,而不是更深入地搜索...
    • 这比缓存数据然后尝试使用选定的索引要好得多。谢谢!
    • 只是想提一下,如果您的 dataGrid 没有“绑定”到数据,但如果您只是通过“数据源”应用了它,这也有效
    【解决方案2】:

    这是我将其放入您的 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;
    

    【讨论】:

      【解决方案3】:

      这样怎么样?

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

      我们可以得到多个选中的行数据。

      【讨论】:

        【解决方案4】:

        既然您确实声明了 IBindingList - 是的,正如其他人所说,DataBoundItem 属性将为您提供所需的东西 - 我之前遇到过它的一个问题,并且最终得到了一个空引用,但现在我想不出它发生的场景。

        如果您使用 BindingSource 进行数据绑定 - 您可以捕获 BindingSource 的 CurrentChanged、CurrentItemChanged 事件,那么您的 B.O. 上不需要额外的 IsChanged 属性。 .. ,基础数据源也可以指示已修改 - 例如,如果您将 Bi​​ndingSource 绑定到数据表,则该行将为您提供修改标志。

        【讨论】:

          【解决方案5】:

          可以这样获取选中的单元格值

          yourDGV.CurrentCell.Value;
          

          如果你想要字符串形式的值,只需使用像这样的 ToString() 方法

          yourDGV.CurrentCell.Value.ToString();
          

          应该这样做

          【讨论】:

            【解决方案6】:

            您也可以使用此短代码。

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

            【讨论】:

              猜你喜欢
              • 2014-10-06
              • 2023-03-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多