是否可以将ComboBox
绑定到对象列表,但选定的值指向对象本身而不是对象属性?
我问这个问题是因为我们有一些业务对象引用其他对象,例如“年”对象。该年份对象可能需要更换为另一个年份对象。
我能想到的唯一解决方案是使用另一个具有单个属性的类,在这种情况下指向一个年份对象。然后将combobox绑定到这些对象的列表,并将显示和值成员都设置为单个属性。
但是为任何我们拥有的“查找表”执行此操作似乎有点麻烦?
是否可以将ComboBox
绑定到对象列表,但选定的值指向对象本身而不是对象属性?
我问这个问题是因为我们有一些业务对象引用其他对象,例如“年”对象。该年份对象可能需要更换为另一个年份对象。
我能想到的唯一解决方案是使用另一个具有单个属性的类,在这种情况下指向一个年份对象。然后将combobox绑定到这些对象的列表,并将显示和值成员都设置为单个属性。
但是为任何我们拥有的“查找表”执行此操作似乎有点麻烦?
{
public class TestObject
{
public string Name { get; set; }
public int Value { get; set; }
}
public partial class Form1 : Form
{
private System.Windows.Forms.ComboBox comboBox1;
public Form1()
{
this.comboBox1 = new System.Windows.Forms.ComboBox();
this.SuspendLayout();
//
// comboBox1
//
this.comboBox1.FormattingEnabled = true;
this.comboBox1.Location = new System.Drawing.Point(23, 13);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(121, 21);
this.comboBox1.TabIndex = 0;
this.comboBox1.SelectedValueChanged += new System.EventHandler(this.comboBox1_SelectedValueChanged);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(284, 262);
this.Controls.Add(this.comboBox1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
BindingList<TestObject> objects = new BindingList<TestObject>();
for (int i = 0; i < 10; i++)
{
objects.Add(new TestObject() { Name = "Object " + i.ToString(), Value = i });
}
comboBox1.ValueMember = null;
comboBox1.DisplayMember = "Name";
comboBox1.DataSource = objects;
}
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedValue != null)
{
TestObject current = (TestObject)comboBox1.SelectedValue;
MessageBox.Show(current.Value.ToString());
}
}
}
}
然后使用ValueMember来控制从SelectedValue获取的内容。将其设置为实现IList接口的对象,例如DataSet或Array。默认值为null。
null
,如jmservera所写,可以让您获取与DataSource
中相同的对象。
SelectedItem
。 - AdamMc331