2010-08-05 49 views
1

我有一些代碼,只需點擊一個按鈕即可創建幾個組件。像這樣的東西。c#如何引用一個動態創建的組件?

CheckBox chk = new CheckBox(); 
chk.Top = 50; 
chk.Left = 50; 
chk.Text = "Check Box Test"; 
chk.Name = "chkTest" 
this.Controls.Add(chk); 

那麼如何使用這個組件。例如,我嘗試了這一點,但得到了錯誤,說組件不存在。我只想得到他們的價值。

if(chkTest.Checked) 
{ 
//Do this 
} 

請幫忙。

謝謝你。

+0

chkTest變量來自哪裏?你肯定可以從Controls集合中檢索它(動態創建的控件),然後將它轉換爲CheckBox來訪問它的屬性。 – 2010-08-05 15:26:05

+0

當然,你不能那樣做。控件不會奇蹟般地出現爲表單的成員(或者您正在使用的任何類)。你將不得不使用佔位符變量'Form1 {... private ComboBox chkTest; ...}或** Dave **建議從'chk'變量範圍之外的'Controls'集合中提取它。 – 2010-08-05 15:30:13

回答

3

既可以在你的類的成員變量稱爲chkTest以後可以使用,或者在需要時檢索它從控件集合飛,像這樣:

CheckBox chkTest = (CheckBox)Controls["chkTest"]; 
if(chkTest.Checked) { 
    // ... 
} 
+0

使用CheckBox chkTest = Controls [「chkTest」]作爲CheckBox;' - 不存在從Control到CheckBox的隱式轉換。 – 2010-08-05 15:34:17

+0

工作完美。謝謝。 – 2010-08-05 15:34:38

+0

@Jaroslav Jandek謝謝,我已經更新了這篇文章。另外,因爲我們期望它是一個CheckBox,所以不需要使用as運算符 - 直接投射就足夠了。 – siride 2010-08-05 15:36:54

0

您正在引用chkTest,但您創建了chk。

+0

我稱之爲什麼名字並不重要。我把chkTest,因爲這是什麼名字給了它。 – 2010-08-05 15:30:01

+0

@Ash - 你在哪裏聲明並賦值給變量chkTest? – TrueWill 2010-08-05 17:09:33

0

您可以將複選框聲明爲頁面的成員變量。那麼你將能夠更容易地訪問它。

Class MyPage { CheckBox chkTest;

//然後在頁面加載中 // chkTest = new CheckBox(); ...

}

+0

這樣做,這是我想要避免的內存。 – 2010-08-05 15:34:21

+0

@Ash Burlaczenko:這是一個微型優化,它不會真的爲你節省很多,實際上可能會導致你使用更多的內存和CPU時間從集合中找到控件。 – siride 2010-08-05 15:38:18

+0

您如何期待這可以節省內存? – 2010-08-05 15:42:11

0
if ((Controls.Items["chkTest"] as CheckBox).Checked) 
{ 
// Do this 
} 

應該可以工作,但看起來並不好看。 :)

你可以聲明爲一個變量,然後用它像你這樣:

CheckBox chkTest = Controls.Items["chkTest"] as Checkbox; 
if (chkTest.Checked) 
{ 
// Do this 
} 

看這個方便的頁上的方法來操作和訪問項目的控件的集合: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection_members.aspx

+0

在使用as運算符時,應確保chkTest不爲null。 – 2010-08-05 15:43:41

1

如果您只關心控件何時被選中或未選中,請使用事件。

​​

確保在完成事件處理程序時取消訂閱。