【问题标题】:C# checkedlistbox differentiate between ItemCheck via code and mouse clickC#checkedlistbox 通过代码和鼠标单击区分 ItemCheck
【发布时间】:2013-01-23 14:08:39
【问题描述】:

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

【问题讨论】:

    标签: winforms checkedlistbox


    【解决方案1】:

    我认为没有一种简单的方法可以使用代码来区分情况。
    唯一想到的是通过使用全局表单变量:

    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
            }
        }
    }
    

    如果您选择此解决方案,请记住采取额外步骤来正确捕获可能绕过将全局变量重置为 false 状态的异常。

    可能使用键盘和鼠标事件的高级操作,您可以找到一种合理的方法来确定导致 ItemCheck 事件的原因,但有时某些解决方案过于复杂且不值得。

    编辑:查看我的答案,我觉得有必要添加一些更改以减少此响应所暗示的维护问题。
    设置布尔变量并调用 SetItemChecked 的代码应该像这样封装在一个单独的函数中

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

    【讨论】:

    • 布尔变量总感觉不对,但通常是正确的解决方案。
    • 我也有同感,但找不到更好的方法。也许操作序列可以封装在一个函数中。
    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多