C#checkedlistbox通过代码和鼠标单击来区分ItemCheck

时间:2013-01-23 14:08:39

标签: winforms checkedlistbox

我正在使用C#VS2008,WinForm应用程序 我的表单上有一个checkedlistbox控件(win-form应用程序) 在代码中,我使用SetItemChecked(index,false)方法检查checkedlistbox中的一些项目,并引发事件ItemCheck。 我还允许用户检查该checkedlistbox中的项目,并且当用户选中或取消选中项目时,它还会引发事件ItemCheck。 如何在ItemCheck事件中找到此事件的发生方式(通过代码或用户键盘/鼠标输入)? 感谢。

1 个答案:

答案 0 :(得分: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事件的原因,但有时某些解决方案过于复杂且不值得。

编辑:回顾我的回答我觉得需要添加一点改动来减少这种反应意味着的维护问题。
设置布尔变量并调用SetItemChecked的代码应封装在一个单独的函数中,如下所示

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