c # combobox привязка к списку объектов - PullRequest
12 голосов
/ 22 сентября 2010

Быстрый вопрос, можно ли связать комбинированный список со списком объектов, но иметь свойство selectedvalue, указывающее на объект, а не свойство объекта.

Я спрашиваю только потому, что у нас есть бизнесОбъекты, которые имеют ссылки на другие объекты, такие как объект «Год».Этот объект года может потребоваться заменить на другой объект года.

Единственное решение, которое я могу придумать, - это иметь другой класс с одним свойством, в данном случае указывающий на объект года.затем привяжите комбинированный список к их списку и присвойте элементам display и value одно свойство.

Но делать это для любых «поисков» у нас кажется немного болезненным ??

Марлон

Ответы [ 2 ]

25 голосов
/ 22 сентября 2010

Если для 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());
            }
        }
    }
}
4 голосов
/ 22 сентября 2010

Вы можете привязать ComboBox к любому списку значений, используя свойство DataSource . Или на самом деле:

Объект, который реализует интерфейс IList, такой как DataSet или Array. По умолчанию установлено значение null.

Затем вы используете ValueMember для управления тем, что вы получаете от SelectedValue . При установке значения null при записи jmservera вы можете получить объект таким, какой он есть в DataSource.

...