我有DataGridView
,其中一列是Combobox (DataGridViewComboBoxColumn)
绑定到对象的属性。然后DataGridView格式化它调用我的对象ToString()
的单元格。所以我组合列表只是一个字符串,然后我尝试从combobox
中选择我得到一个错误,因为程序试图将字符串设置为我的对象。怎么解决?然后从combobox
中选择一个对象值而不是字符串。
我有一个包含属性
的对象集合(MyObject
)
public Reason Kind { get; set; }
Reason有一个DataGridView自动调用的ToString()方法。因此,当我从组合框中选择值时,它不是Reason
对象,它只是string
答案 0 :(得分:0)
您需要在DataGridViewComboBoxColumn
上使用DisplayMemberPath属性<DataGridViewComboBoxColumn DisplayMemberPath="PropertyName" />
答案 1 :(得分:0)
您可以显式设置要显示的属性以及要获取的值。如果你没有设置值成员,那么你将收回你的对象。
所以,给定
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);
}
}
假设您只有Form1
DataGridView
,只包含一个组合列,那么。
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; }
}
然后选择的项目将是原因类型并打印输出,例如
Hi, I am WindowsFormsApplication1.Reason and I contain [Name:Second, Value:1]