C# WinForm 如何动态添加控件和设计控件布局

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# WinForm 如何动态添加控件和设计控件布局相关的知识,希望对你有一定的参考价值。

因为设计界面的时候,很多控件的属性比如 text、name,相应的操作都跟后台数据表里面的数据相对应。
有时候控件的数目也会根据数据表里面的数据增减而变化。为了减少手动的去拖控件、手动的去改属性,要怎样设计代码来实现控件的动态加载月布局?过程是什么,请教高手
比如下面的界面

比如button
button btn=new button();//初始化一个控件
btn.size=new size(100,100);//设置大小
btn.location=new postion(50,100);//设置坐标
btn.text="按钮1";//设置文本
this.controls.add(btn);//添加到窗体中

上面的大致就这样追问

btn.location=new postion(50,100);//设置坐标
布置控件位置的时候怎样才能更方便位置不会根据窗体的变化而变动?
在循环生成控件的时候是要根据Form的大小设定btn 的position(x,y),设置完再设置它的Anchor,嗯.就这样.
这些代码是放在InitializeComponent();之前不?

这样就跟Form的.Designer.cs基本是一样的了吧

追答

放到InitializeComponent();之后
本来就是和Designer.cs中的一样 只不过 你拖控件到窗体上 vs帮你把代码给生成了

追问

放到InitializeComponent();之后 ??

追答

是 的 一般的话可以放到loaded事件利来处理

参考技术A 动态添加,不就是不拖拽吗那就new一个控件啊,想让他定位啊?location这个属性就是定位的→控件左上角相对于其容器左上角的坐标。margin,size 自己尝试哦,祝愿你C#越学越好。

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

【中文标题】如何动态更改列表中控件的属性(C# Winform)?【英文标题】:How do I change the properties of a control within a list dynamically (C# Winform)? 【发布时间】:2020-09-21 20:51:08 【问题描述】:

我有一个复选框控件列表

public List<CheckBox> _checkBoxes = new List<CheckBox>();

我在运行时使用具有位置和可见性等属性的开关盒添加了一定数量。

这一切都很好,但如果我希望复选框消失或在某些时候被选中,则 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);
        
    

【问题讨论】:

那你如何更新它们?我假设您尝试首先在表单控件集合中找到您的复选框,然后对其进行操作? 很可能列表中的项目与表单上的项目不同。我们需要查看更多代码来诊断此问题... 【参考方案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 循环中。

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

foreach(var ch in _checkBoxes)

    ch.Checked = false;
    Application.DoEvents();

    DoSomeWorkThatTakesTime();

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

【讨论】:

“为什么我被否决了?”我的猜测......任何时候这个网站上的任何人看到DoEvents(),他们都会立即投反对票并且在地球上的某个地方有一个婴儿死去。

以上是关于C# WinForm 如何动态添加控件和设计控件布局的主要内容,如果未能解决你的问题,请参考以下文章

C# WinForm 自定义控件如何实现动态添加子控件

C# winform动态添加控件获取值问题

C# winform动态添加控件获取值问题

C# WinForm 动态添加-删除控件内存未释放

c# 中如何在GroupBox控件中动态添加与移除控件

C#如何动态加载RadioButton控件