2010-08-05 47 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

如果您只关心控件何时被选中或未选中,请使用事件。

​​

确保在完成事件处理程序时取消订阅。