如何动态更改列表中控件的属性(C#Winform)?

如何动态更改列表中控件的属性(C#Winform)?,c#,winforms,controls,C#,Winforms,Controls,我有一个复选框控件列表 公共列表_复选框=新列表() 我在运行时使用带有位置和可见性等属性的开关案例添加了一定数量的内容 这一切都很好,但如果我想让复选框消失或在某个时候被选中,GUI不会得到更新,列表会用新数据更新,但不会直观地显示出来 *我最后做了这个* 我在winfrom上创建了一组复选框。创建了一个可以选择哪些复选框可见的方法。然后创建了一个方法来填充类型复选框列表。然后可以在面板中搜索控件类型,一旦找到控件,就可以对其进行操作。这并不优雅,也可能不是最好的方式,但我对自定义控件和win

我有一个复选框控件列表

公共列表_复选框=新列表()

我在运行时使用带有位置和可见性等属性的开关案例添加了一定数量的内容

这一切都很好,但如果我想让复选框消失或在某个时候被选中,GUI不会得到更新,列表会用新数据更新,但不会直观地显示出来

*我最后做了这个* 我在winfrom上创建了一组复选框。创建了一个可以选择哪些复选框可见的方法。然后创建了一个方法来填充类型复选框列表。然后可以在面板中搜索控件类型,一旦找到控件,就可以对其进行操作。这并不优雅,也可能不是最好的方式,但我对自定义控件和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)

所以,应用程序从队列中获取消息,然后对其进行处理。一条信息就是一切-点击按钮,移动鼠标,画画。。。一切

因此,当发送一条消息时,它会查找应该接收该消息的控件,然后执行一些工作

例如,如果你有这样的东西:

foreach(var ch in _checkBoxes)
{
    ch.Checked = false;
    DoSomeWorkThatTakesTime();
    ch.Checked = true;
}
您将看不到更改,因为您“被困”在DispatchMessage中。当您将
设置为选中时
,您确实发送了一条消息。但是现在无法发送此消息,因为您在foreach循环中

所以,在这里您唯一能做的就是告诉您的应用程序-现在,请阅读消息队列。在WinForms中,它被称为“DoEvents”,因此这将完成以下工作:

foreach(var ch in _checkBoxes)
{
    ch.Checked = false;
    Application.DoEvents();

    DoSomeWorkThatTakesTime();

    ch.Checked = true;
    Application.DoEvents();
}

那你怎么更新呢?我假设您首先尝试在表单控件集合中查找复选框,然后对其进行操作?列表中的项很可能与表单中的项不同。我们需要看到更多的代码来诊断这个问题……”“为什么我被否决了?”我猜……每当这个网站上的任何人看到
DoEvents()
,他们就会立即否决投票,然后在地球上的某个地方有一个婴儿死亡。
foreach(var ch in _checkBoxes)
{
    ch.Checked = false;
    Application.DoEvents();

    DoSomeWorkThatTakesTime();

    ch.Checked = true;
    Application.DoEvents();
}