2008-11-24 18 views
22

Mam combobox u góry formularza, który ładuje edytowalne dane do pól poniżej. Jeśli użytkownik wprowadził zmiany, ale ich nie zapisał, i spróbuje wybrać inną opcję z pola wyboru, chcę je ostrzec i dać im szansę na anulowanie lub zapisanie.Jak zapobiec/anulować zmianę wartości combobox w C#?

Potrzebuję zdarzenia "BeforeValueChange" z argumentem zdarzenia cancelable.

Wszelkie porady dotyczące sposobu realizacji?

Odpowiedz

0

Można użyć message filter do przechwytywania kliknięć i naciśnięć klawiszy, co pozwoli uniknąć normalnego zachowania się pola kombi. Ale myślę, że lepiej byłoby wyłączyć pole kombi po wprowadzeniu przez użytkownika zmiany i zażądać zapisania lub przywrócenia zmian.

2

Zdarzenie Użytkownik może być używany dla tego scenariusza
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx

+2

Dzieje się tak po tracą ostrość, więc nie będzie działać. Potrzebuję zdarzenie, które dzieje się "przed" użytkownik próbuje zmienić wartość. –

+0

@RG - czy możesz nie tylko ustawić ostrość z powrotem na pole kombi, czy też dzieje się jakieś przetwarzanie, gdy traci ostrość? –

1

Nie dostaniesz odpowiednie zdarzenie domyślnie. Możesz cofnąć poprzednią wartość i ustawić ją ponownie, jeśli użytkownik chce anulować.

3

Zapisz bieżącą wartość w zdarzeniu Enter. Implementacja logiki BeforeValueChange w zdarzeniu ValueChanged, przed rzeczywistą logiką ValueChanged. Jeśli użytkownik anuluje, ustaw zapisaną wartość i nie kontynuuj w metodzie (return).

Jeśli zamierzasz używać tego systemu bardzo dużo, sugerowałbym dziedziczenie ComboBox i implementację tam Twojego zdarzenia BeforeValuechange.

1

Co powiesz na wykorzystanie zdarzeń sprawdzania poprawności/sprawdzania poprawności?
Działa dobrze, jeśli wydarzenie odbywające się na LostFocus zamiast zmiany jest w porządku z tobą.

W przeciwnym razie, jak o

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

    // perform rest of onChange code 
} 
16

Zapisz SelectedIndex ComboBox, gdy na pole, jeśli pierwszy wszedł, a następnie przywrócić jego wartość, gdy trzeba, aby anulować zmianę.

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

Tak właśnie zawsze to robiłem i działa zgodnie z oczekiwaniami. –

+1

To idealne rozwiązanie zamiast zdarzenia SelectionChanging. Dziękuję Ci!! - Matthew –

+2

Użycie zdarzenia 'Enter' do zapisania ostatniego wyboru nie jest konieczne. Po prostu zapisz wartość 'lastSelectedIndex' jako zmienną' private' przed zamknięciem procedury obsługi zdarzenia 'SelectionChangeCommitted'. Następnie kolejne wpisy w tej procedurze obsługi zdarzeń mogą używać 'lastSelectedIndex' do ustawienia" ComboBox.SelectedIndex "na poprzedniej pozycji. –

4

Oto najprostszy 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

Co to jest to wydarzenie 'SelectionChanged'? Czy to z WinForm ComboBox. – i486

Powiązane problemy