c#combobox绑定到对象列表

时间:2010-09-22 10:28:08

标签: c# winforms data-binding combobox business-objects

快速提问,是否可以将组合框绑定到对象列表,但是将selectedvalue属性指向对象,而不是对象的属性。

我只是问,因为我们有一些Business Objects,它们引用了其他对象 - 比如'Year'对象。那年的对象可能需要换掉另一年的对象。

我能想到的唯一解决方案是让另一个类具有单个属性,在这种情况下指向年份对象。然后将组合框绑定到这些的列表,并将显示和值成员设置为单个属性。

但是对于任何“查找”而言,我们这样做似乎有点痛苦?

马龙

2 个答案:

答案 0 :(得分:24)

如果将ValueMember设置为null,则所选值将始终是对象,而不是属性:

{
    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());
            }
        }
    }
}

答案 1 :(得分:4)

您可以使用DataSource属性将ComboBox绑定到任何值列表。或者实际上:

  

实现IList接口的对象,例如DataSet或Array。默认值为null。

然后使用ValueMember来控制从SelectedValue获得的内容。将此设置为null作为jmservera写入可让您获取DataSource中的对象。