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

问题描述 投票:0回答:1

我有一个列表中的复选框控件

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);
        }
    }
}
c# winforms controls
1个回答
-1
投票

如果你有这样的东西。

_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();
}
© www.soinside.com 2019 - 2024. All rights reserved.