2008-11-24 35 views
22

Tôi có một combobox ở đầu biểu mẫu tải dữ liệu có thể chỉnh sửa vào các trường bên dưới. Nếu người dùng đã thực hiện thay đổi, nhưng không được lưu và cố gắng chọn một tùy chọn khác từ combobox, tôi muốn cảnh báo họ và cho họ cơ hội hủy hoặc lưu.Làm thế nào để ngăn chặn/hủy bỏ thay đổi giá trị của combobox trong C#?

Tôi cần sự kiện "BeforeValueChange" với đối số sự kiện có thể hủy.

Bất kỳ lời khuyên nào về cách thực hiện?

Trả lời

0

Bạn có thể sử dụng message filter để chặn các lần nhấp và các lần nhấn phím, điều này sẽ cho phép bạn ngăn chặn hoạt động bình thường của hộp tổ hợp. Nhưng tôi nghĩ bạn nên tắt hộp kết hợp khi người dùng thực hiện thay đổi và yêu cầu họ lưu hoặc hoàn nguyên thay đổi của họ.

2

Sự kiện Validating thể được sử dụng cho kịch bản này
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx

+2

Điều này xảy ra sau khi bạn mất tập trung, như vậy sẽ không làm việc. Tôi cần một sự kiện xảy ra "trước" người dùng cố gắng thay đổi giá trị. –

+0

@RG - bạn có thể không chỉ đặt tiêu điểm trở lại hộp tổ hợp hoặc có quá trình xử lý nào xảy ra khi mất tiêu điểm không? –

1

Bạn không nhận được một sự kiện thích hợp theo mặc định. Bạn có thể cache giá trị trước đó và thiết lập lại nó nếu người dùng muốn hủy bỏ.

3

Lưu giá trị hiện tại vào sự kiện Enter. Thực hiện logic BeforeValueChange trong sự kiện ValueChanged, trước logic thực tế ValueChanged. Nếu người dùng hủy, hãy đặt giá trị được lưu trữ và không tiếp tục trong phương thức (return).

Nếu bạn định sử dụng hệ thống này rất nhiều, tôi khuyên bạn nên kế thừa ComboBox và triển khai sự kiện BeforeValuechange tại đó.

1

Làm cách nào để sử dụng các sự kiện Xác thực/Xác thực?
Nó hoạt động tốt, nếu sự kiện xảy ra trên LostFocus thay vì thay đổi là ok với bạn.

Nếu không, làm thế nào về

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

    // perform rest of onChange code 
} 
16

Save the của ComboBox SelectedIndex khi đến hộp nếu đầu tiên bước vào, và sau đó khôi phục giá trị của nó khi bạn cần phải hủy bỏ sự thay đổi.

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

Đây là cách tôi luôn làm và nó hoạt động như mong đợi. –

+1

Đây là giải pháp hoàn hảo thay cho sự kiện SelectionChanging. Cảm ơn bạn!! - Matthew –

+2

Sử dụng sự kiện 'Enter' để lưu lựa chọn cuối cùng là không cần thiết. Chỉ cần lưu một giá trị 'lastSelectedIndex' dưới dạng biến' private', trước khi thoát khỏi trình xử lý sự kiện 'SelectionChangeCommitted'. Sau đó, các mục tiếp theo trong trình xử lý sự kiện đó có thể sử dụng 'lastSelectedIndex' để đặt' ComboBox.SelectedIndex' thành vị trí trước đó. –

4

Đây là việc sửa chữa đơn giản nhất: -

 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

Sự kiện này 'SelectionChanged' là gì? Là nó từ WinForm ComboBox. – i486

Các vấn đề liên quan