2010-09-22 8 views
10

Domanda veloce, è possibile associare una casella combinata a un elenco di oggetti, ma avere il punto di proprietà valore selezionato per l'oggetto, non una proprietà dell'oggetto.C# combobox vincolante per elenco di oggetti

Chiedo solo perché alcuni oggetti business hanno riferimenti ad altri oggetti, ad esempio un oggetto "Anno". Potrebbe essere necessario sostituire l'oggetto di quell'anno per un altro anno.

L'unica soluzione che posso ricavare è di avere un'altra classe con una singola proprietà, in questo caso si punta a un oggetto anno. quindi associare la casella combinata a un Elenco di questi e impostare sia la visualizzazione che i membri del valore sulla singola proprietà.

Ma facendolo per qualsiasi "lookup" abbiamo un po 'di dolore?

Marlon

risposta

20

Se si imposta la ValueMember a null il valore selezionato sarà sempre l'oggetto, non una proprietà:

{ 
    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

Se io uso questo approccio non posso programatically impostare il SelectedValue, ho dovuto usare 'SelectedItem '. – AdamMc331

3

È possibile associare un ComboBox a qualsiasi elenco di valori utilizzando la proprietà DataSource. Oppure:

Un oggetto che implementa l'interfaccia IList, come un DataSet o una matrice. Il valore predefinito è null.

È quindi possibile utilizzare ValueMember per controllare ciò che si ottiene da SelectedValue. Impostalo su null come scritture jmservera consente di ottenere l'oggetto così com'è nello DataSource.