我有一个由我认为是一个事件被引发的无限循环。但是我不明白为什么要举起这个活动。
有一个项目列表框和附带的另一个复选框列表。复选框列表显示列表框中每个项目的子项目。
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
答案 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;
}
}