hul*_*ist 83 c# checkedlistbox winforms
我有一个CheckedListBox,我想在一个项目被检查后我想要一个事件,以便我可以使用具有新状态的CheckedItems.
由于在CheckedItems更新之前触发了ItemChecked,因此它不会开箱即用.
更新CheckedItems时,我可以使用哪种方法或事件来通知?
Bra*_*mir 78
ItemCheck如果还检查正在单击的项目的新状态,则可以使用该事件.这在事件args中可用,如e.NewValue.如果NewValue选中,请在逻辑中包含当前项目以及正确的集合:
    private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {                     
        List<string> checkedItems = new List<string>();
        foreach (var item in checkedListBox1.CheckedItems)
            checkedItems.Add(item.ToString());
        if (e.NewValue == CheckState.Checked)
            checkedItems.Add(checkedListBox1.Items[e.Index].ToString());
        else
            checkedItems.Remove(checkedListBox1.Items[e.Index].ToString());
        foreach (string item in checkedItems)
        {
            ...
        }
    }
作为另一个示例,在(未)检查此项目后确定集合是否为空:
private void ListProjects_ItemCheck(object sender, ItemCheckEventArgs args)
{
    if (ListProjects.CheckedItems.Count == 1 && args.NewValue == CheckState.Unchecked)
        // The collection is about to be emptied: there's just one item checked, and it's being unchecked at this moment
        ...
    else
        // The collection will not be empty once this click is handled
        ...
}
Dun*_*unc 29
这里有很多相关的StackOverflow帖子......除了Branimir的解决方案,还有两个更简单的方法:
在ItemCheck上延迟执行(也在这里):
    void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        this.BeginInvoke((MethodInvoker) (
            () => Console.WriteLine(checkedListBox1.SelectedItems.Count)));
    }
    void checkedListBox1_MouseUp(object sender, MouseEventArgs e)
    {
        Console.WriteLine(checkedListBox1.SelectedItems.Count);
    }
我更喜欢第一种选择,因为第二种选择会导致误报(即经常射击).
小智 22
我试过这个并且它有效:
private void clbOrg_ItemCheck(object sender, ItemCheckEventArgs e)
{
    CheckedListBox clb = (CheckedListBox)sender;
    // Switch off event handler
    clb.ItemCheck -= clbOrg_ItemCheck;
    clb.SetItemCheckState(e.Index, e.NewValue);
    // Switch on event handler
    clb.ItemCheck += clbOrg_ItemCheck;
    // Now you can go further
    CallExternalRoutine();        
}
dii*_*eep 10
衍生CheckedListBox并实施
/// <summary>
/// Raises the <see cref="E:System.Windows.Forms.CheckedListBox.ItemCheck"/> event.
/// </summary>
/// <param name="ice">An <see cref="T:System.Windows.Forms.ItemCheckEventArgs"/> that contains the event data.
///                 </param>
protected override void OnItemCheck(ItemCheckEventArgs e)
{           
    base.OnItemCheck(e);
    EventHandler handler = AfterItemCheck;
    if (handler != null)
    {
        Delegate[] invocationList = AfterItemCheck.GetInvocationList();
        foreach (var receiver in invocationList)
        {
            AfterItemCheck -= (EventHandler) receiver;
        }
        SetItemCheckState(e.Index, e.NewValue);
        foreach (var receiver in invocationList)
        {
            AfterItemCheck += (EventHandler) receiver;
        }
    }
    OnAfterItemCheck(EventArgs.Empty);
}
public event EventHandler AfterItemCheck;
public void OnAfterItemCheck(EventArgs e)
{
    EventHandler handler = AfterItemCheck;
    if (handler != null)
        handler(this, e);
}
经过一些测试,我可以看到事件 SelectedIndexChanged 在事件 ItemCheck 之后触发。保持属性 CheckOnClick True
最佳编码
| 归档时间: | 
 | 
| 查看次数: | 81192 次 | 
| 最近记录: |