2013-01-23 33 views
1

我使用C#VS2008,WinForm應用程序 我在我的表單上有一個checkedlistbox控件(win-form應用程序) 在代碼中,我使用SetItemChecked檢查checkedlistbox中的一些項目(index,false)方法,並引發事件ItemCheck。 我也允許用戶檢查那個checkedlistbox中的項目,當用戶選中或取消選中項目時,它也會引發事件ItemCheck。 如何在ItemCheck事件中查找此事件發生的情況(通過代碼或通過用戶鍵盤/鼠標輸入)? 謝謝。C#checkedlistbox通過代碼和鼠標點擊來區分ItemCheck

回答

2

我認爲沒有一個簡單的方法來區分使用代碼的情況。
,想到的唯一的事情是通過使用一個全球性的表單變量:

public class Form1:Form 
{ 
    bool _isCodeClick = false; 

    ..... 

    // Somewhere in your code 
    _isCodeClick = true; 
    checkedListBox1.SetItemChecked(index, true); 
    _isCodeClick = false; 

    ..... 


    private void CheckedListBox1_ItemCheck(Object sender, ItemCheckEventArgs e) 
    { 
     if(_isCodeClick == true) 
     { 
      // Do processing for click by code 
     } 
     else 
     { 
      // Do processing for click by user 
     } 
    } 
} 

如果你去了這個解決方案記得要採取額外的步驟正確捕獲異常,可以繞過全局變量的復位到錯誤的狀態。

可能使用鍵盤和鼠標事件的高級操作,您可能會找到合理的方法來確定導致ItemCheck事件的原因,但有時某些解決方案太複雜並且不值得。

編輯:審查我的答案我覺得需要添加一點改變來減少這個esponse意味着的維護問題。
設置該布爾變量並調用SetItemChecked的代碼應該在一個單獨的功能進行封裝這樣

private void SetItemCheckedFromCode(int index, bool toSet) 
{ 
    try 
    { 
     _isCodeClick = true; 
     checkedListBox1.SetItemChecked(index, true); 
    } 
    finally 
    { 
     _isCodeClick = false; 
    } 
} 
+0

布爾變量從未感覺不錯,但通常是正確的解決方案。 –

+0

我感覺一樣,但我找不到更好的方法來做到這一點。也許操作的順序可以封裝在一個函數中。 – Steve

相關問題