[英]User control in windows forms application
我有一个带有文本框和标签的简单用户控件。 当我以另一种形式使用用户控件时,我创建了公共属性来访问文本框中的文本。
我的问题是,当我在表单中调用该属性时,该属性返回空值。 我有什么想念的吗?
我的财产如下:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
public string rtnTxtMake
{
get
{
return txtMake.Text;
}
set
{
txtMake.Text = value;
}
}
}
然后在下一个表单按钮单击事件中,按如下方式调用属性
UserControl1 Usc = new UserControl1();
string Make = Usc.rtnTxtMake;
MessageBox.Show(Make)
您的UserControl必须添加到父Form / Control的Controls集合中,然后才能正确初始化。 通常,您不会自己编写创建和添加UserControl的代码。
相反,首先构建项目,然后转到主窗体的Deisgner视图,然后查看“工具箱”。
您的UserControl名称(和一个图标)应显示在工具箱的顶部,您可以将其拖动到主窗体中。 Windows窗体设计器将自动为您生成所需的初始化代码。
您不应在按钮单击事件处理程序中创建控件的新实例。 使用设计器方法来创建控件,您可以按以下方式简单地访问控件的现有实例:
public void button_Click(object sender, EventArgs e)
{
// myUserControl1 has already been created and initialized by the Deisgner generated code
// Note the name 'myUserControl1' is just an example, yours may be different.
string controlText=myUserControl1.rtnTxtMake;
// Or to change the UserControl textbox value
myUserControl1.rtnTxtMake="Testing";
}
UserControl1 Usc = new UserControl1();
string Make = Usc.rtnTxtMake;
如果您的用户控件默认情况下有一个空的文本框字段,则上述两行代码将返回null
或String.Empty
(通过String.IsNullOrEmpty
检查)似乎是正确的,因为您已显式创建用户控件的新实例。
我想您真正想要的是:
您已将用户控件插入到Designer的表单中。 我们将此用户控件实例ctlUser
。
您有一个带有Click
事件处理程序的按钮。 您问题中的最后几行代码来自该处理程序方法。
在处理程序中,您不会创建用户控件( Usc
)的新实例,而是引用您先前插入到表单ctlUser
。 然后,事情应该会按预期进行。
当您说该属性返回一个空值时,您的确切意思是什么? 它实际上为空,还是您的MessageBox简单显示为空?
我迅速复制了您的代码,它的行为与预期的完全一样-MessageBox显示出来,但是它是空的,因为TextBox控件的Text属性的默认值是一个空字符串。
另外,您处理此问题的方式也有些不寻常。
首先,该行:
UserControl1 Usc = new UserControl1();
通常,您不需要像这样实例化用户控件。 而是可以将控件从工具箱拖到窗体的设计图面上。 然后,这将为您实例化和初始化您的控件。
我认为这实际上是您的问题-当您包含上面的代码行时,您正在创建用户控件的新实例,而这对于拖动到设计器中的用户控件是无法实现的。
如果转到表单的设计器视图并单击用户控件,则应该在此处看到一个属性窗口。 如果不这样做,则从“查看”菜单中选择它,或按F4。 在属性列表中,应该有一个“名称”,这是为用户控件生成的程序名称。 您可以根据需要在此处进行更改,但是在其余表单中引用此控件时,必须使用此控件。
其次,接下来的两行:
string Make = Usc.rtnTxtMake;
MessageBox.Show(Make)
您可以直接访问属性rtnTxtMake。 除非以后需要访问其余代码中的Make字符串,否则通常认为直接访问属性是更好的样式。
MessageBox.Show(userControl.rtnTxtMake);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.