2010-09-22 17 views
10

Szybkie pytanie, czy można powiązać combobox z listą obiektów, ale ma właściwość selectedave do obiektu, a nie do właściwości obiektu.C# Wiązanie combobox do listy obiektów

Pytam tylko dlatego, że mamy kilka obiektów biznesowych, które mają odniesienia do innych obiektów - takich jak obiekt "Rok". W tym roku obiekt może wymagać wyłączenia na inny obiekt roku.

Jedyne rozwiązanie, jakie mogę wymyślić, to mieć inną klasę z jedną własnością, w tym przypadku wskazując obiekt roku. następnie powiąż combobox z Listą tych i ustaw oba elementy wyświetlania i wartości na pojedynczą właściwość.

Ale robiąc to dla każdego "lookups" wydajemy się trochę uciążliwy?

Marlon

Odpowiedz

20

Jeśli ustawisz ValueMember null wybraną wartość zawsze będzie przedmiotem, a nie nieruchomości:

{ 
    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

Jeśli używam tego podejścia nie mogę programowo ustawić SelectedValue, musiałem użyć 'SelectedItem '. – AdamMc331

3

Można powiązać ComboBox do każdej listy wartości z wykorzystaniem mienia DataSource. Lub faktycznie:

Obiekt implementujący interfejs IList, taki jak DataSet lub Array. Wartością domyślną jest null.

Następnie można użyć ValueMember, aby kontrolować, co można uzyskać z SelectedValue. Ustawienia tego do zapisów null jako jmservera umożliwiają uzyskanie obiektu w postaci DataSource.

Powiązane problemy