7

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

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

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

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

我在这里做错了吗?

4

5 回答 5

21

一个标准的 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;
    }
于 2010-07-05T21:46:18.897 回答
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);
}
于 2010-09-13T12:37:53.723 回答
0

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

于 2010-07-05T20:38:37.220 回答
0

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

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

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

于 2010-07-05T20:41:22.143 回答
0

我知道很久以前就已经回答了这个问题,但我发现只处理 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;
}
于 2017-02-04T02:10:15.923 回答