2010-09-22 31 views
10

Pregunta rápida, es posible enlazar un cuadro combinado a una lista de objetos, pero hacer que la propiedad de valor seleccionado apunte al objeto, no una propiedad del objeto.C# combobox vinculante a la lista de objetos

Solo pregunto porque tenemos algunos objetos comerciales que tienen referencias a otros objetos, como un objeto 'Año'. Ese año puede ser necesario cambiar el objeto por otro año de objeto.

La única solución que se me ocurre es tener otra clase con una sola propiedad, en este caso apuntando a un objeto de un año. a continuación, enlace el cuadro combinado a una Lista de estos y establezca los elementos de visualización y valor en la propiedad individual.

¿Pero haciendo eso para cualquier "búsqueda" parece un poco penoso?

Marlon

Respuesta

20

Si se establece el ValueMember para anular el valor seleccionado será siempre el objeto, no una propiedad:

{ 
    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

Si utilizo este método no puedo establecer mediante programación la SelectedValue, tuve que usar 'SelectedItem '. – AdamMc331

3

Puede enlazar un cuadro combinado a cualquier lista de valores usando la propiedad DataSource. O en realidad:

Objeto que implementa la interfaz IList, como un DataSet o una matriz. El valor predeterminado es nulo.

A continuación, utilice el ValueMember para controlar lo que obtiene de SelectedValue. Configura esto como null como jmservera escribe le permite obtener el objeto tal como está en el DataSource.