2010-09-22 5 views
10

Schnelle Frage, ist es möglich, eine Combobox an eine Liste von Objekten zu binden, aber die Eigenschaft selectedvalue auf das Objekt zeigen, keine Eigenschaft des Objekts.C# Combobox Bindung an eine Liste von Objekten

Ich frage nur, weil wir einige Business-Objekte haben, die Verweise auf andere Objekte haben - wie ein 'Jahr' Objekt. Dieses Jahr muss das Objekt möglicherweise für ein anderes Jahr Objekt ausgeschaltet werden.

Einzige Lösung, die ich finden kann, ist, eine andere Klasse mit einer einzigen Eigenschaft zu haben, in diesem Fall auf ein Jahrobjekt zeigend. Dann binden Sie die Combobox an eine Liste von diesen und legen Sie die Anzeige und Wert-Mitglieder auf die einzelne Eigenschaft.

Aber tun das für irgendwelche "Lookups" wir haben scheint wie ein bisschen Schmerz?

Marlon

Antwort

20

Wenn Sie die Valuemember gesetzt wird der ausgewählte Wert auf Null immer das Objekt sein, nicht eine Eigenschaft:

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

Wenn ich diesen Ansatz verwenden, kann ich nicht programmatisch die SelectedValue gesetzt hatte ich 'SelectedItem zu verwenden '. – AdamMc331

3

Sie eine ComboBox zu einer Liste von Werten mit der DataSource Eigenschaft binden können. Oder tatsächlich:

Ein Objekt, das die IList-Schnittstelle implementiert, z. B. ein DataSet oder ein Array. Der Standardwert ist null.

Verwenden Sie dann die ValueMember, um zu steuern, was Sie von SelectedValue erhalten. Einstellungen zu null als jmservera schreibt können Sie das Objekt erhalten, wie es in der DataSource ist.

Verwandte Themen