【问题标题】:Windows C# CheckedListBox Checked Item Event HandlingWindows C# CheckedListBox 选中项事件处理
【发布时间】:2010-07-05 20:27:54
【问题描述】:

我目前正在开发一个 Window 应用程序,该应用程序将 CheckedListBoxes 用于程序的某些方面。我遇到的一个问题是,我一直在尝试查找在选中某个项目时触发了哪个事件,以便在选中任何列表项时启用表单按钮。

问题是我尝试使用以下内容;

private void clbAvailMods_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        if(e.NewValue == CheckState.Checked)
        {
            btnInstall.Enabled = true;
        }
    }

但是当我在 if 语句上设置断点时,它不会在检查列表框中的项目时触发。

我在这里做错了吗?

【问题讨论】:

  • 表单设计器似乎有一个错误注册的 ItemCheck 事件。这解决了核心问题,但现在出现了一个新问题,在其上下文中显得更加模糊。显然,在 ItemCheck 完成之前,已检查项目的状态不会更新。这很糟糕,因为我需要检查第一个项目来触发体现代码。由于状态直到之后才更新,所以我失去了立即注册项目检查事件触发的机会。

标签: c# events visual-studio-2005 checkedlistbox


【解决方案1】:

一个标准的 Windows 窗体技巧是延迟运行代码,直到所有事件副作用都完成。您使用 Control.BeginInvoke() 方法延迟运行代码。这将解决您的问题:

    private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e) {
        this.BeginInvoke(new MethodInvoker(evalList), null);
    }

    private void evalList() {
        bool any = false;
        for (int ix = 0; ix < checkedListBox1.Items.Count; ++ix) {
            if (checkedListBox1.GetItemChecked(ix)) {
                any = true;
                break;
            }
        }
        btnInstall.Enabled = any;
    }

【讨论】:

  • 我肯定会更多地研究这个建议。它似乎在纸上(屏幕)上的正确轨道。 :) 谢谢,汉斯。
  • 我想这就是我要找的票。感谢您的帮助! :)
  • 这适用于我的组合 dodgy_coder 解决方案:stackoverflow.com/questions/545533/delayed-function-calls。只需将 foo 方法添加到您的代码中,然后将此行更改为 this.BeginInvoke(new MethodInvoker(foo), null);最后在 foo 内部调用 evalList 而不是 bar();
  • 如果使用空格键切换复选框,则不会触发 SelectedIndexChanged 事件。
【解决方案2】:

您可以使用 NewValue 属性手动更新 CheckedItems.Count。这是我仅在至少选中一项时才启用按钮的代码:

private void checkedListBoxProds_ItemCheck(object sender, ItemCheckEventArgs e)
{
    this.buttonGenerar.Enabled = ((this.checkedListBoxProds.CheckedItems.Count + (e.NewValue == CheckState.Checked ? 1 : -1)) > 0);
}

【讨论】:

    【解决方案3】:

    几个潜在的陷阱。大概您已经通过 VS.Net GUI 添加了事件,以确保它被插入到控件中。尝试单击一个项目两次 - 一次给予项目焦点,再次切换检查状态 - 如果您希望项目在第一次单击时切换其检查状态,则将“CheckOnClick”属性设置为 true。

    【讨论】:

    • 我已经将“CheckOnClick”值设置为 true。我注意到在这种情况下,Microsnot 似乎忽略了一个相当重要的设计元素。他们将让您确定将要更改的内容,但一旦更改完成就不会触发任何事件。我必须说,MS 的那些白痴可能需要一个调试器来做梦遗。
    【解决方案4】:

    我认为这是 SelectedIndexChanged 事件,但我现在会确认。

    编辑:SelectedIndexChanged 事件确实有效。但无论复选框是否被选中,都会触发。所以如果你想这样做,我会检查检查状态。

    但顺便说一句,当我使用 ItemCheck 事件时,它确实在我实际选中复选框而不仅仅是文本时触发。

    【讨论】:

    • 是的,ItemCheck 会在您单击复选框时触发。真正的问题是,直到 ItemCheck 完成处理之后,该复选框的 vhecked 状态仍将与单击它之前的状态相反。因此,尝试实时查看复选框是否实际被选中或未选中的真正困境。即需要“ItemCheckChanged”事件。
    • 那么你不能只检查相反的吗?如果 itemcheck 事件正在触发并且复选框没有被选中,那么这意味着它即将被正确检查?
    【解决方案5】:

    我知道这个问题早已得到解答,但我发现只处理 MouseUp 和 KeyUp 事件更容易。当这些事件被触发时,CheckedItems.Count 属性是准确的。由于他们都做同样的事情,我创建了一个方法来工作并从两个事件处理程序中调用该方法。

    private void clbFolders_KeyUp(object sender, KeyEventArgs e) { Update(); }
    private void clbFolders_MouseUp(object sender, MouseEventArgs e) { Update(); }
    
    private void Update()
    {
        btnDelete.Enabled = clbFolders.CheckedItems.Count > 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-06
      • 2023-03-19
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 2011-08-30
      相关资源
      最近更新 更多