【问题标题】:DataGridView DataBinding get selected object from ComboboxDataGridView DataBinding 从 Combobox 获取选定对象
【发布时间】:2014-06-26 05:23:25
【问题描述】:

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

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

public Reason Kind { get; set; }

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

【问题讨论】:

  • 问题不清楚

标签: c# data-binding datagridview


【解决方案1】:

您需要使用 DataGridViewComboBoxColumn 上的 DisplayMemberPath 属性

<DataGridViewComboBoxColumn DisplayMemberPath="PropertyName" />

【讨论】:

  • 我想你在谈论 WPF 但我使用的是 WinForms
【解决方案2】:

您可以明确设置要显示的属性以及要获取的值。如果您不设置 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]

【讨论】:

    猜你喜欢
    • 2014-10-06
    • 1970-01-01
    • 2012-11-05
    • 2019-08-18
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    相关资源
    最近更新 更多