在运行时自定义控件

时间:2011-08-06 09:00:20

标签: c# .net winforms

我在窗体上有控件,我在运行时使用程序集获取它的对象。现在我想在运行时更改它们的属性,如forecolor,backcolor和text。

private void button1_Click(object sender, EventArgs e)
{
    Type formtype = typeof(Form);
    foreach(Type type in Assembly.GetExecutingAssembly().GetTypes())
    {
        if (formtype.IsAssignableFrom(type))
        {
            listBox1.Items.Add(type.Name);
            Form frm = (Form)Activator.CreateInstance(type);
            foreach (Control cntrl in frm.Controls)
            {
                listBox1.Items.Add(cntrl.Name);
            }
        }
    }
}

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    Control cnt = (Control)listBox1.SelectedItem;
    MessageBox.Show(cnt.Name);
    cnt.ForeColor = colorDialog1.Color;
}

此代码在运行时获取对象,但是当我尝试更改前景时,它会给我一个错误。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

您发布的代码有几个问题:

  1. listBox1.Items.Add(cntrl.Name);您正在将控件名称而非控件本身添加到集合中,并再次listBox1.Items.Add(type.Name);将表单类型名称添加到集合中。
  2. 在代码中:

    Form frm = (Form)Activator.CreateInstance(type);
    

    您每次都在创建一个新的表单实例,并且您没有在任何地方展示它们。

  3. 那么如何解决它:

    private void button1_Click(object sender, EventArgs e)
    {
        List<Control> controls = new List<Control>();
    
        Type formtype = typeof(Form);
        foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
        {
            if (formtype.IsAssignableFrom(type))
            {
                Form frm = (Form)Activator.CreateInstance(type);
                controls.Add(frm);//Add the new instance itself to the list
                foreach (Control cntrl in frm.Controls)
                {
                    controls.Add(cntrl);
                }
                frm.Show();//show the new form created
            }
        }
    
        listBox1.DataSource = controls;
        listBox1.DisplayMember = "Name";//or "Text"
    }
    

    修改:还要确保colorDialog1之前已初始化并显示,以便从中获取colorDialog1.Color值。

    我不知道你要在这里实现什么,但是如果你想获得正在运行的表单的当前实例,你可以使用Form.ActiveForm来实现....