DataGridView DataBinding从组合框中获取选定对象

本文关键字:获取 对象 DataBinding 组合 DataGridView | 更新日期: 2023-09-27 18:10:16

我有一个DataGridView,其中一列是Combobox (DataGridViewComboBoxColumn)绑定到对象的属性。然后DataGridView格式单元格它调用我的对象的ToString()。所以我组合列表只是一个字符串,然后我尝试从combobox中选择,我得到一个错误,因为程序试图将字符串设置为我的对象。如何解决?然后从combobox中选择一个对象值,而不是字符串。

我有一个对象(MyObject)的集合,包含一个属性

public Reason Kind { get; set; }

Reason有一个ToString()方法,DataGridView会自动调用它。所以当我从组合框中选择value时对象不是Reason,而是string

DataGridView DataBinding从组合框中获取选定对象

您需要在DataGridViewComboBoxColumn上使用DisplayMemberPath属性

<DataGridViewComboBoxColumn DisplayMemberPath="PropertyName" />

您可以显式设置要显示的属性和要获取的属性值。如果你没有设置value成员,那么你将返回你的对象。

那么,给定

public class Reason
{
    public Reason()
    {}
    public Reason(string name, int value)
    {
        Name = name;
        Value = value;
    }
    public string Name { get; set; }
    public int Value { get; set; }
    public override string ToString()
    {
        return string.Format("Hi, I am {0} and I contain [Name:{1}, Value:{2}]", GetType(), Name, Value);
    }
}

假设您只有Form1DataGridView,只包含一个组合列,那么。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        Kind = new Collection<Reason>();
        Kind.Add(new Reason("First", 0));
        Kind.Add(new Reason("Second", 1));
        Column1.DataSource = Kind;
        Column1.DisplayMember = "Name";
        // Do not set value member to get the actual selected object
        // If you explicitly set it, you'll get you property value
        // Column1.ValueMember = "value" 
        dataGridView.EditingControlShowing += (sender, args) =>
            {
                var cmb = args.Control as ComboBox;
                if (cmb == null)
                    return;
                cmb.SelectedIndexChanged += (o, eventArgs) =>
                    System.Diagnostics.Debug.Write(cmb.SelectedItem.ToString());
            };
    }
    public Collection<Reason> Kind { get; set; }
}

则所选项目将是typeof Reason并打印出来。Hi, I am WindowsFormsApplication1.Reason and I contain [Name:Second, Value:1]