C#无限复选框循环

时间:2013-12-30 02:46:10

标签: c# winforms

我有一个由我认为是一个事件被引发的无限循环。但是我不明白为什么要举起这个活动。

有一个项目列表框和附带的另一个复选框列表。复选框列表显示列表框中每个项目的子项目。

private void checkedListBoxSignIn_ItemCheck(object sender, ItemCheckEventArgs e)
{
    int userIndex = listBoxSignIn.SelectedIndex;
    UpdateUserList();
    listBoxSignIn.SelectedIndex = userIndex;
}

private void UpdateUserList()
{
    listBoxSignIn.Items.Clear();

    foreach (User u in _userList)
    {
        listBoxSignIn.Items.Add(u.Name);
    }
}
private void listBoxSignIn_SelectedIndexChanged(object sender, EventArgs e)
{
    int index = listBoxSignIn.SelectedIndex;
    UpdateCheckListBox(index);
}

private void UpdateCheckListBox(int index)
{
    checkedListBoxSignIn.Items.Clear();
    foreach (Item i in _userList.Items)
    {
        checkedListBoxKartSignIn.Items.Add(i, i.status);
    }
}

勾选复选框后,循环开始:

-> checkedListBox_ItemCheck() 
-> listbox_SelectedIndexChanged() 
-> checkedListBox_ItemCheck() 
...

似乎在检查列表框中添加项目计为“项目检查”,尽管在构造时发生“项目检查”。

这是正确的行为吗?如果是这样,我该如何避免循环?

我正在使用Winforms

2 个答案:

答案 0 :(得分:1)

当处理将加载或修改其他控件的控件事件时,我通常会有一个标志来阻止无限循环,就像你可能拥有的一样。

这不是一个理想的解决方案,但它是我当时最简单的想法。

我没有运行下面的代码,只是为了说明:

新变量:

private bool _updatingCheckList = false;
private bool _updatingList = false;

然后:

private void checkedListBoxSignIn_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (_updatingList) return; //if it is already doing it, don't do it again
    int userIndex = listBoxSignIn.SelectedIndex;
    try {
        _updatingList = true;
        UpdateUserList();
    } finally {
        _updatingList = false;
    }
    listBoxSignIn.SelectedIndex = userIndex;
}

private void UpdateUserList()
{
    listBoxSignIn.Items.Clear();

    foreach (User u in _userList)
    {
        listBoxSignIn.Items.Add(u.Name);
    }
}
private void listBoxSignIn_SelectedIndexChanged(object sender, EventArgs e)
{
    if (_updatingCheckList) return; //if it is already doing it, don't do it again
    int index = listBoxSignIn.SelectedIndex;
    try {
        _updatingCheckList = true;
        UpdateCheckListBox(index);
    finally { _updatingCheckList = false; }
}

private void UpdateCheckListBox(int index)
{
    checkedListBoxSignIn.Items.Clear();
    foreach (Item i in _userList.Items)
    {
        checkedListBoxKartSignIn.Items.Add(i, i.status);
    }
}

另一种方法是在进行操作和读取之前删除处理程序。

我希望这会有所帮助。

答案 1 :(得分:0)

我已成功解决了这个问题。这里的主要问题是每次任何对清单框列表进行了更新时,列表框都会更新。修复是为了确保实际发生了一些用户交互。对我来说,最简单的方法是使用简单的if语句检查两个列表是否已被选中。

private void checkedListBoxSignIn_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if(listbox.SelectedIndex > -1 && checkedListBox.SelectedIndex > -1){
        int userIndex = listBoxSignIn.SelectedIndex;
        UpdateUserList();
        listBoxSignIn.SelectedIndex = userIndex;
    }
}