我正在开发一个Window应用程序,它使用CheckedListBoxes来实现程序的某些方面。我遇到的一个问题是,我一直在尝试查找在检查项目时触发了哪个事件,以便在检查任何列表项时启用表单按钮。
问题是我尝试使用以下内容;
private void clbAvailMods_ItemCheck(object sender, ItemCheckEventArgs e)
{
if(e.NewValue == CheckState.Checked)
{
btnInstall.Enabled = true;
}
}
但是当我在if语句上设置断点时,它会在检查列表框中的项目时触发。
我在这里做错了吗?
答案 0 :(得分:20)
标准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;
}
答案 1 :(得分: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);
}
答案 2 :(得分:0)
一些潜在的陷阱。据推测,您已经通过VS.Net GUI添加了该事件,以确保它被连接到控件中。尝试两次单击项目 - 一次为项目焦点,再次切换检查状态 - 如果您希望项目在第一次单击时切换其检查状态,则将“CheckOnClick”属性设置为true。
答案 3 :(得分:0)
我认为这是SelectedIndexChanged事件,但我现在会确认。
编辑:SelectedIndexChanged事件确实有效。但无论是否选中了复选框,都会触发。因此,如果你想这样做,我会检查检查状态。
但是,当我确实使用了ItemCheck事件时,当我实际选中复选框而不仅仅是文本时它会触发。
答案 4 :(得分:0)
我知道很久以前就已经回答了这个问题,但我发现只处理MouseUp和KeyUp事件更容易。触发这些事件时,CheckedItems.Count属性是准确的。因为它们都做同样的事情,所以我创建了一个方法来处理工作并从两个事件处理程序调用该方法。
CGOpenGLDisplayMask