我在运行时创建一个文本框和一个复选框:
TextBox tb = new TextBox();
tb.Name = "txtPassword";
tb.PasswordChar = '*';
CheckBox cb = new CheckBox();
cb.Text = "Show Password";
cb.Name = "cbShowPassword";
cb.CheckedChanged += new EventHandler(cbShowPassword_CheckedChanged);
我想根据复选框屏蔽或取消屏蔽密码:
private void cbShowPassword_CheckedChanged(object sender, EventArgs e)
{
txtPassword.PasswordChar = cbShowPassword.Checked ? '\0' : '*';
}
问题是,它无法识别 cbShowPassword_CheckedChanged 下的 txtPassword 和 cbShowPassword ,因为它是在代码中创建的。
我怎样才能让它发挥作用?
答案 0 :(得分:1)
就目前而言,您在实例化控件的方法中使用局部变量tb
。您只能在实例化控件的方法中使用该变量。您为控件命名的事实并不意味着存在一个名为txtPassword
的变量。
您可以继续这种方式,并从任何其他希望引用它的方法中动态查看控件。然而,这使得生活比它需要的更难。你真正想要的是一个引用控件的变量。
因此,请创建名为txtPassword
的类的私有成员字段。像这样创建控件:
txtPassword = new TextBox();
txtPassword.PasswordChar = '*';
....
要非常清楚,txtPassword
是您班级的私人成员,而不是本地变量。
然后您将能够从其他方法中引用它。是否有可能未创建它,针对txtPassword
测试null
。
显然,您对任何其他动态创建的控件使用相同的技术。
答案 1 :(得分:0)
我认为你正在混淆什么。
您是否将控件添加到父窗体/控件? 事件会发生吗? (在那里设一个断点) 尝试将它们用作成员而不是name属性,并访问this.cb和this.tb
答案 2 :(得分:0)
您可以使用表单查找与新创建的文本框和复选框相匹配的任何子控件。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controls(v=vs.110).aspx
否则,您可以在表单上的属性中设置对此对象的引用。