2017-06-09 2 views
0

Ich habe eine ComboBox, die eine Liste als DataSource verwendet. Da das ausgewählte Element ComboBox zunächst leer bleiben soll, füge ich am Anfang der Liste eine leere Zeile ein, die ich entfernen möchte, sobald die erste SelectedIndexChanged auftritt.Ein anfänglich leeres Element in ComboBox DataSource

Das Problem ist, dass es mir gelingt, das leere Element wieder zu entfernen, sobald es hinzugefügt wurde. Es scheint aus dem DataSource (getestet mit Console.WriteLine(DataSourceList[0].ToString());) entfernt zu werden, aber es bleibt eine Option in der ComboBox. Was zur Ente mache ich falsch?

Initial Bindung

// Set the data source + 1 blank spot 
cboDropDown.DataSource = viewModel.dataList; 
viewModel.dataList.Insert(0, String.Empty); 

// Bind the selected value 
Binding bindSelItem = new Binding("SelectedItem", viewModel, "selectedItem"); 
cboDropDown.DataBindings.Add(bindSelItem); 

Ausgewählte Index geändert

private void cboDropDown_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    // Write the first element to the console (debug purpose) 
    Console.WriteLine("First element is: " + viewModel.dataList[0].ToString()); 

    // If the first element is blank, remove and reset datasource 
    if (viewModel.dataList[0].ToString() == String.Empty) 
    { 
     // Remove item at index 0 
     viewModel.dataList.RemoveAt(0); 

     // Write to console to confirm that it is removed 
     Console.WriteLine("First element is: " + viewModel.dataList[0].ToString()); 

     // Reset data source for ComboBox 
     cboDropDown.DataSource = viewModel.dataList; 
    } 
} 
+0

Es scheint, wie das Problem etwas zu der Tatsache verbunden ist, dass 'SelectedIndexChanged' durch die Bindungsverfahren selbst genannt wird. Ich habe erwartet, dass es zum ersten Mal aufgerufen wird, wenn der Benutzer zu ComboBox gewechselt ist. – Noceo

Antwort

0

Ich habe endlich eine Lösung gefunden. Es erforderte zwei strukturelle Veränderungen:

  1. Mit BindingList<T> statt List<T>
  2. Verwenden Sie ein Ereignis, das nicht in der Bindungsprozedur aufgerufen wird (i _DropDown verwendet)

So ein leeres Element enden up Hinzufügen wenn die Liste erstellt wird (.Insert() ist auch in Ordnung):

BindingList<String> ComboOpts = new BindingList<String>(); 
comboOpts.Add(String.Empty); 
comboOpts.Add("Option 1"); 
comboOpts.Add("Option 2"); 
comboOpts.Add("Option 3"); 

Und dann auf die DropDown Ereignis Entfernen Sie das erste Element, wenn es leer ist. Es ist nicht einmal nessesary neu zu binden, um die Datenquelle (BindingList kümmert sich darum):

private void cboMyComboBox_DropDown(object sender, EventArgs e) 
{ 
    // The first time that the combo box is activated, remove the initial item 
    if (viewModel.ComboOptions[0].ToString() == String.Empty) 
     viewModel.ComboOptions.RemoveAt(0);      
} 
0

Sie benötigen eine Dropdownlist DataBind(), nachdem Sie die Datenquelle ändern.

+0

Winforms-Combobox hat keinen DataBind – Steve

Verwandte Themen