我在窗体上有控件,我在运行时使用程序集获取它的对象。现在我想在运行时更改它们的属性,如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;
}
此代码在运行时获取对象,但是当我尝试更改前景时,它会给我一个错误。任何人都可以帮助我吗?
答案 0 :(得分:0)
您发布的代码有几个问题:
listBox1.Items.Add(cntrl.Name);
您正在将控件名称而非控件本身添加到集合中,并再次listBox1.Items.Add(type.Name);
将表单类型名称添加到集合中。在代码中:
Form frm = (Form)Activator.CreateInstance(type);
您每次都在创建一个新的表单实例,并且您没有在任何地方展示它们。
那么如何解决它:
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
来实现....