2011-08-06 29 views
0

我有一個窗體上的控件,我使用程序集在運行時獲取它的對象。現在我想在運行時改變它們的屬性,如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; 
} 

該代碼在運行時讓我獲得對象,但是當我嘗試更改forecolor時,它會給我一個錯誤。誰能幫我?

+0

什麼錯誤呢它給你? –

+0

我想在運行時更改控件的屬性。 – Gagan

+0

@Gapan在這裏發佈您遇到的錯誤。沒有人知道問題,沒有人不能幫助你。 –

回答

0

您發佈的代碼有幾個問題:

  1. listBox1.Items.Add(cntrl.Name);您添加的控件名稱不是控件本身的收集,並再次listBox1.Items.Add(type.Name);添加的表單類型名稱的集合。
  2. 在代碼:

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

    您正在創建一個新的窗體(S)實例(S)每次和你是不是在任何地方展示它們。

那麼如何解決這個問題:

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爲....

+0

如果我使用listBox1.Items.Add(cntrl);而不是listBox1.Items.Add(cntrl.Name);那麼我的輸出和你的代碼一樣。我的列表框控件不會獲取控件的名稱。列表框中填充了控件,但不顯示它們的名稱。並在列表框的選定索引更改事件時,我調用messagebox.show(cnt.name);它顯示選定的控件名稱,但在cnt.foreclor = colordialog1.color;它不會改變它的顏色 – Gagan

+0

當然顏色不會改變,你正在創建一個新的窗體實例,而不是更新已經顯示的實例..也顯示項目的名稱。你可以使用數據綁定「我更新了答案,告訴你如何」。 –

+0

我想在運行時更改列表框控件中所選控件的屬性嗎? – Gagan