2008-11-24 8 views
22

Ich habe eine Combobox am Anfang eines Formulars, die bearbeitbare Daten in Felder darunter lädt. Wenn der Benutzer Änderungen vorgenommen, aber nicht gespeichert hat, und versucht, eine andere Option aus der Combobox auszuwählen, möchte ich sie warnen und ihnen die Möglichkeit geben, abzubrechen oder zu speichern.Wie verhindern/löschen Sie die Wertänderung einer Combobox in C#?

Ich benötige ein "BeforeValueChange" Ereignis mit einem cancelable Event-Argument.

Irgendwelche Ratschläge, wie man es schafft?

Antwort

0

Sie können message filter verwenden, um Klicks und Tastendrücke abzufangen, mit denen Sie das normale Verhalten der Combobox verhindern können. Aber ich denke, es wäre besser, das Kombinationsfeld zu deaktivieren, wenn der Benutzer eine Änderung vornimmt und sie entweder dazu auffordert, ihre Änderungen zu speichern oder rückgängig zu machen.

2
+2

Dies geschieht, nachdem Sie den Fokus verlieren, so wird nicht funktionieren. Ich brauche ein Ereignis, das passiert, bevor der Benutzer versucht, den Wert zu ändern. –

+0

@RG - Könnten Sie nicht einfach den Fokus auf das Kombinationsfeld zurücksetzen, oder gibt es eine Verarbeitung, wenn der Fokus verloren geht? –

1

Sie eine entsprechende Veranstaltung erhalten standardmäßig nicht verwendet werden. Sie können den vorherigen Wert zwischenspeichern und zurückstellen, wenn der Benutzer abbrechen möchte.

3

Speichern Sie den aktuellen Wert für das Ereignis Enter. Implementieren Sie die BeforeValueChange Logik imEreignis, vor der eigentlichen ValueChanged Logik. Wenn der Benutzer abbricht, setzen Sie den gespeicherten Wert und fahren Sie nicht mit der Methode fort (return).

Wenn Sie dieses System viel verwenden, würde ich vorschlagen, erben ComboBox und implementieren Sie Ihre BeforeValuechange Veranstaltung dort.

1

Wie wäre es mit den validierenden/validierten Ereignissen?
Es funktioniert gut, wenn das Ereignis, das auf LostFocus geschieht, nicht in Ordnung ist.

Ansonsten, wie etwa

public void Combobox_ValueChanged(object sender, EventArgs e) { 
    if (!AskUserIfHeIsSureHeWantsToChangeTheValue()) 
    { 
     // Set previous value 
     return; 
    } 

    // perform rest of onChange code 
} 
16

Speichern der SelectedIndex des ComboBox, wenn boxen, wenn zuerst eingegeben, und dann wiederherstellen es Wert ist, wenn Sie die Änderung abbrechen müssen.

cbx_Example.Enter += cbx_Example_Enter; 
cbx_Example.SelectionChangeCommitted += cbx_Example_SelectionChangeCommitted; 

... 

private int prevExampleIndex = 0; 
private void cbx_Example_Enter(object sender, EventArgs e) 
{ 
    prevExampleIndex = cbx_Example.SelectedIndex; 
} 

private void cbx_Example_SelectionChangeCommitted(object sender, EventArgs e) 
{ 
    // some custom flag to determine Edit mode 
    if (mode == FormModes.EDIT) 
    { 
     cbx_Example.SelectedIndex = prevExampleIndex; 
    } 
} 
+0

So habe ich es immer gemacht, und es funktioniert wie erwartet. –

+1

Dies ist eine perfekte Lösung anstelle eines SelectionChanging-Ereignisses. Vielen Dank!! - Matthew –

+2

Das Ereignis 'Enter' zum Speichern der letzten Auswahl ist nicht erforderlich. Speichern Sie einfach einen 'lastSelectedIndex'-Wert als' private'-Variable, bevor Sie den 'SelectionChangeCommitted'-Event-Handler beenden. Danach können nachfolgende Einträge in diesen Event-Handler 'lastSelectedIndex' verwenden, um' ComboBox.SelectedIndex' an die vorherige Position zu setzen. –

4

Hier ist die einfachste fix: -

 bool isSelectionHandled = true; 

     void CmbBx_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      if (isSelectionHandled) 
      { 
       MessageBoxResult result = MessageBox.Show("Do you wish to continue selection change?", this.Title, MessageBoxButton.YesNo, MessageBoxImage.Question); 
       if (result == MessageBoxResult.No) 
       { 
        ComboBox combo = (ComboBox)sender; 
        isSelectionHandled = false; 
        if (e.RemovedItems.Count > 0) 
         combo.SelectedItem = e.RemovedItems[0]; 
        return; 
       } 
      } 
      isSelectionHandled = true; 
     } 
+0

Was ist dieses Ereignis 'SelectionChanged'? Ist es von WinForm ComboBox. – i486