在windows窗体设计器中自动创建控件

本文关键字:创建 控件 windows 窗体 | 更新日期: 2023-09-27 18:21:50

在设计模式下,我需要自动创建和配置表单中的几个控件。

对于类似的事情,我创建了一个控件,它可以交互和修改表单中的其他一些控件,并设置默认值,向网格添加列,。。。完成后,我移除控制,就这样。

这是一种创建特别宏的不太复杂的技术,但它的作用就像一种魅力,可以简化配置属性的重复工作,特别是对于具有大量元素(如网格)的"大"对象。

问题是,在设计模式中,我无法创建新控件并将它们动态添加到表单中。考虑以下代码(只是一个简化的示例):

  public partial class ButtonCreator : UserControl
    [Category("Automation")]
    public int LeftPosition { get; set; }
    [Category("Automation")]
    public bool AutoCreate
    {
        get { return false; }
        set
        {
            var form = FindForm();
            if (value)
            {
                for (var i = 10; i < 100; i = i + 20)
                {
                    var button = new Button(){Name = "btn_" + DateTime.Now.Ticks + "_" + i};
                    form.Controls.Add(button);
                    button.Location = new Point(LeftPosition, i);
                    button.BringToFront();
                }
            }
        }
    }

(我也尝试过使用具有类似代码的组件设计器,但结果相同,所以这种方式不那么冗长)

为了使用它,我将ButtonCreator的一个实例添加到窗体中,然后设置AutoCreate属性(在设计模式下,从属性列表中)。显然,它可以工作并将按钮添加到表单中,但它们没有序列化到自动生成的C#代码中,保存后我会丢失它们。

当Visual studio生成designer.cs文件时,我能做些什么来强制它们序列化吗?

考虑一下这个限制:这不是要发布的代码,只是为了简化开发的脏代码,因此我更喜欢避免更复杂的技术,以便能够在编码时轻松地引入更改。如果可能,应避免引用Visual Studio自动化或创建Visual Studio扩展。

在windows窗体设计器中自动创建控件

根据Hans Passant的评论,所需要的只是要求设计器环境创建对象,这样就可以跟踪新组件。

   var host = GetService(typeof(IDesignerHost)) as IDesignerHost;
   var button = host.CreateComponent(typeof(Button), "someName") as Button;
   FindForm().Controls.Add(button);