创建一个以控件为元素的类,并在运行时动态地填充这些控件

本文关键字:控件 动态 运行时 填充 一个以 元素 创建 | 更新日期: 2023-09-27 17:53:21

使用c#与MS visual studio创建窗口表单,我想创建一个表单,有20个其他表单被加载取决于从组合框的选择。所有这些被加载的表单共享一些共同的TextBox/Combobox,例如

格式1:

动态添加TextBox username/dept/Dept_manager和Comboboxdept_location/dept_code/Num_of_washroom

格式2:

动态添加TextBox username/dept/Dept_manager和Comboboxdept_location/dept_code/Num_of_washroom/dept_ID

form 3:

动态添加TextBox用户名/dept/Dept_manager/Dept_code和Combobox dept_location/ Dept_code /Num_of_washroom

问题是:而不是在嵌套的if语句中硬编码所有的文本框/组合框:

if (combobox.text == "NewYork")
{
  TextBox dept = new TextBox();
  dept.location = ...
  dept.size = ...
 }

是否有更好的方法来管理这些(即类)?使用20个表单和10多个控件,硬编码将创建不必要的大字节

我试图提供简单的代码,但未能使自己清楚我想要什么。

创建一个以控件为元素的类,并在运行时动态地填充这些控件

可以这样解析:

1)创建,设置可见folse和添加所有可能的控件(文本框等)在FlowLayoutPanel的设计时间或在表单初始化。流量面板将自动处理控件放置。

2)为每个配置创建/加载包含活动控件名称的特殊表

3)当组合框项被选中时,应用选定的配置(设置可见控件)使用控件的"Name"属性来识别控件:

    public class OfficeFormsConfig
    {
        public string Name { get; set; }
        public string[] @Fields { get; set; }
        public override string ToString()
        {
            return Name;
        }
    }
    void FillOfficesCombo()
    {
        var arrViewConfigs = new List<OfficeFormsConfig>();
        //---Load from DB or File (but here is hard coded as an example)-
        arrViewConfigs.Add(new OfficeFormsConfig()
            {
                Name = "NewYork",
                @Fields = new string[] { "username", "dept", "deptManager", "dept_location" }
            });
        arrViewConfigs.Add(new OfficeFormsConfig()
        {
            Name = "Denver",
            @Fields = new string[] { "username", "deptManager", "Num_of_washroom" }
        });
        //---------------------------------------------------------------
        foreach (var config in arrViewConfigs)
        {
            comboBox1.Items.Add(config);
        }
    }
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        OfficeFormsConfig cfg = comboBox1.SelectedItem as OfficeFormsConfig;
        foreach (Control ctl in flowLayoutPanel1.Controls)
        {
            ctl.Visible = cfg.Fields.Any(ctlName => ctlName == ctl.Name);
        }
    }