我有一个列表中的复选框控件
public List<CheckBox> _checkBoxes = new List<CheckBox>();
我在运行时使用开关盒添加一定量的位置和可见性等属性。
这一切都很好,但如果我想让复选框在某一时刻消失或被选中,GUI不会得到更新,列表会用新的数据更新,但只是不可见。
* 我最终做了这样的工作*。我在winfrom.Created了一堆复选框,创建了一个方法,你可以选择哪些复选框是可见的。然后创建了一个方法来填充一个类型的复选框列表。然后你可以在面板上搜索控件类型,一旦你找到了控件,就可以对它进行操作。 这并不优雅,可能也不是最好的方法,但我是自定义控件和winforms的新手。
//search panel for checkboxes
foreach (Control c in panel1.Controls)
{
if (c is CustomControls.RoundedCheckBox)
{
CustomControls.RoundedCheckBox checkBox = c as CustomControls.RoundedCheckBox;
//if it is checked add to list
if(checkBox.Checked)
{
_checkBoxes.Add(checkBox);
}
}
}
如果你有这样的东西。
_checkBoxes.Add(new CheckBox());
_checkBoxes[0].Parent = this;
那么你应该可以从列表中操作你的复选框。
_checkBoxes[0].Checked = false;
但是,如果你在某种循环中进行操作 并且想立即看到结果,那么问题就会出现。
在Windows中,有一种叫做消息循环的东西。应用程序就是这样工作的(伪代码:TL;DR)
while(true)
{
message = GetFirstMessage();
if(message != null)
{
if(message.Id == CloseApplication)
break;
DispatchMessage(message);
RemoveFirstMessage();
}
}
所以,应用程序从队列中获取消息,然后处理它。消息就是一切--按钮点击、鼠标移动、绘画......。所有的东西。
所以,当一个消息被发送时,它会寻找应该接收这个消息的控件,然后做一些工作。
所以,举例来说,如果你有这样的东西。
foreach(var ch in _checkBoxes)
{
ch.Checked = false;
DoSomeWorkThatTakesTime();
ch.Checked = true;
}
你不会看到变化,因为你被 "困在 "DispatchMessage里。当你设置 Checked
,你真的发送了一条消息。但是这个消息现在不能被发送,因为你在foreach循环里面。
所以你在这里唯一能做的就是告诉你的应用程序--现在,请DO READ消息队列。在WinForms中,它被称为 "DoEvents",所以这就可以完成工作。
foreach(var ch in _checkBoxes)
{
ch.Checked = false;
Application.DoEvents();
DoSomeWorkThatTakesTime();
ch.Checked = true;
Application.DoEvents();
}