2009-04-13 23 views
29

Làm cách nào để tắt trình xử lý sự kiện tạm thời trong WinForms?WinForms: tạm thời tắt trình xử lý sự kiện

+0

Bạn có thể chia sẻ những gì bạn đang làm ở cấp cao hơn không? Bởi vì bạn có thể không muốn vô hiệu hóa _ALL_ trình xử lý sự kiện (hình vẽ mặc định và các trình xử lý di chuyển của bạn). –

+0

Tôi chỉ không muốn nắm bắt những thay đổi trong tình trạng kiểm soát khi cập nhật nó theo chương trình. Và có, tôi không muốn vô hiệu hóa các trình xử lý sự kiện _ALL_, chỉ là "một trình xử lý sự kiện". http://stackoverflow.com/questions/744436/winforms-two-way-textbox-problem – George

Trả lời

47

Có lẽ, cách đơn giản nhất (mà không cần hủy đăng ký hoặc các công cụ khác) là để khai báo một giá trị boolean và kiểm tra xem nó vào đầu xử lý:

bool dontRunHandler; 

void Handler(object sender, EventArgs e) { 
    if (dontRunHandler) return; 

    // handler body... 
} 
+2

Điều này rất đơn giản, nhưng mã sẽ là một mớ hỗn độn nếu bạn sử dụng thường xuyên. – maamaa

40

Disable từ những gì quan điểm? Nếu bạn muốn loại bỏ một phương pháp đó là trong phạm vi của bạn từ danh sách các đại biểu về xử lý, bạn chỉ có thể làm ..

object.Event -= new EventHandlerType(your_Method); 

này sẽ loại bỏ phương pháp đó từ danh sách các đại biểu, và bạn có thể lắp lại nó sau này với

object.Event += new EventHandlerType(your_Method); 
+5

Tôi nghĩ bạn có nghĩa là your_Method thay vì your_Method(). Kể từ C# 2.0, bạn cũng không cần phần "EventHandlerType" mới - chỉ là object.Event + = yourMethod; và object.Event - = yourMethod; –

+0

Vâng, ý tôi là nó sẽ không còn nữa;). Đã không nhận thức được việc xây dựng đại biểu ngầm, mặc dù; đó là điều tốt để biết. –

+0

Ý tưởng này phù hợp với tôi (so với câu trả lời được chấp nhận) trong trường hợp tôi cần tạm thời tắt Trình xử lý đối với hộp tổ hợp EditValueChanged. – PhoenixDev

1

Tôi đang làm theo cách này, sử dụng tiện ích kiểm soát.

public static void SetDatasource(
    this ComboBox cb, 
    object dataSource, 
    EventHandler _SelectedIndexChanged_eventHandler = null, 
    EventHandler _SelectedValueChanged_eventHandler = null) 
{ 
//disable events 
    if (_SelectedIndexChanged_eventHandler != null) cb.SelectedIndexChanged -= _SelectedIndexChanged_eventHandler; 
    if (_SelectedValueChanged_eventHandler != null) cb.SelectedValueChanged -= _SelectedValueChanged_eventHandler; 
    if (cb.InvokeRequired) 
    { 
    cb.BeginInvoke(new _d_SetDatasource_ComboBox(SetDatasource), new object[] { cb, dataSource, _SelectedIndexChanged_eventHandler}); 
    } 
    else 
    { 
    cb.DataSource = dataSource; 
    //events enabled again 
    if (_SelectedIndexChanged_eventHandler != null) cb.SelectedIndexChanged += _SelectedIndexChanged_eventHandler; 
    if (_SelectedValueChanged_eventHandler != null) cb.SelectedValueChanged += _SelectedValueChanged_eventHandler; 
    } 
} 
private delegate void _d_SetDatasource_ComboBox(ComboBox cb, object dataSource, EventHandler _SelectedIndexChanged_eventHandler = null, EventHandler _SelectedValueChanged_eventHandler = null); 
Các vấn đề liên quan