2012-03-27 2 views
0

Ich habe 2 ComboBoxes auf meinem Formular. Ich schaffe die Bindungen wie folgt:Kann ComboBox SelectedItem nicht als BindingSource für kaskadierte ComboBox verwenden

TestClass myclass = new TestClass("Instruments"); 

myclass.Add(instr1 = new TestClass("INSTR1")); 
myclass.Add(instr2 = new TestClass("INSTR2")); 
myclass.Add(instr3 = new TestClass("INSTR3")); 
myclass.Add(instr4 = new TestClass("INSTR4")); 

instr1.Add(app1 = new TestClass("app1")); 
instr1.Add(app2 = new TestClass("app2")); 
instr1.Add(app3 = new TestClass("app3")); 
instr1.Add(app4 = new TestClass("app4")); 

instr2.Add(app5 = new TestClass("app5")); 
instr2.Add(app6 = new TestClass("app6")); 
instr2.Add(app7 = new TestClass("app7")); 
instr2.Add(app8 = new TestClass("app8")); 

mysource = new BindingSource(myclass, null); 
selectedComboBox1.DataSource = mysource; 
selectedComboBox1.DisplayMember = "NAME"; 

mysource2 = new BindingSource(selectedComboBox1, "SelectedItem"); 
selectedComboBox2.DataSource = mysource2; 
selectedComboBox2.DisplayMember = "NAME"; 

Die Klasse für die Bindung sieht wie folgt verwendet

class TestClass : BindingList<TestClass>, INotifyPropertyChanged 
{ 
    public event RunTestChanged RunTestChangedEventHandler; 

    public TestClass() 
    { 
     this.test = ""; 
     this.name = ""; 
     this.runTest = true; 
    } 

    public TestClass(string name) 
    { 
     this.test = ""; 
     this.name = name; 
     this.runTest = true; 
    } 

    public TestClass LIST 
    { 
     get 
     { 
      return this; 
     } 
    } 

    public string NAME 
    { 
     get 
     { 
      return this.name; 
     } 
     set 
     { 
      this.name = value; 
      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("NAME")); 
      } 
     } 
    } 

    public string TEST 
    { 
     get 
     { 
      return this.test; 
     } 
     set 
     { 
      this.test = value; 
      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("TEST")); 
      } 
     } 
    } 


    public bool RUNTEST 
    { 
     get 
     { 
      return runTest; 
     } 
     set 
     { 
      runTest = value; 
      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("RUNTEST")); 
      } 
      RunTestArgs myargs = new RunTestArgs(value); 

      if (RunTestChangedEventHandler != null) 
      { 
       RunTestChangedEventHandler(this, myargs); 
      } 
     } 
    } 


    private bool runTest; 
    private string name; 
    private string test; 

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 
} 

, wenn das Formular zuerst die 2 Comboboxen lädt gefüllt werden, wie sie mit den erwarteten Elemente sein sollte. Wenn ich jedoch ein Element in selectedComboBox1 ändere, werden die Elemente in selectedComboBox2 nicht aktualisiert. Ich weiß, dass ich das ausgewählte ComboBox1 SelectedIndexChanged-Ereignis abonnieren und dann die DataSource auf selectedComboBox2 erneut binden kann und alles wird wie erwartet funktionieren.

Zum Beispiel:

void selectedComboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     mysource2.DataSource = selectedComboBox1.SelectedItem; 
     mysource2.DataMember = null; 
    } 

Eine weitere Alternative, die die Datenbindung auszuführen funktioniert, ist wie folgt:

mysource = new BindingSource(myclass, null); 
    mysource2 = new BindingSource(mysource, "LIST"); 
    mysource3 = new BindingSource(mysource2, "LIST"); 

    selectedComboBox1.DataSource = mysource; 
    selectedComboBox1.DisplayMember = "NAME"; 
    selectedComboBox2.DataSource = mysource2; 
    selectedComboBox2.DisplayMember = "NAME"; 

aber ich wollte wissen, ob es ein Weg, um zu vermeiden, die zu abonnieren, die Ereignis oder die Datenbindung auf eine andere Art und Weise durchführen und nur die zweite ComboBox über die BindingSource mit der SelectedItem-Eigenschaft aktualisiert werden. Am Ende bin ich neugierig zu wissen, wie man die BindingSource über die SelectedItem-Datenbindung aktualisiert und wenn es nicht möglich ist, was verhindert, dass es funktioniert.

Vielen Dank für Ihre Hilfe.

Antwort

1

Ich habe das gleiche Problem und wurde durch Bindung Name SelectedValue von combobox aufgelöst und setzen ValueMemberName“ Eigenschaft

selectedComboBox1.DisplayMember = "NAME"; 

selectedComboBox1.ValueMember = "NAME"; 
zu sein