我有一个简单的用户控件,其中包含文本框和标签。当我以另一种形式使用用户控件时,我创建了公共属性来访问文本框中的文本。
我的问题是当我在表单中调用它时,属性返回null值。我错过了什么吗?
我的财产如下::
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)
答案 0 :(得分:0)
必须先将UserControl添加到父窗体/控件的Controls集合中,然后才能正确初始化它。通常,您不会自己编写创建和添加UserControl的代码。
相反,首先构建项目,然后转到主窗体的Deisgner视图并查看工具箱。
您的UserControl名称(和图标)应显示在工具箱的顶部,您只需将其拖到主窗体即可。 Windows窗体设计器将自动为您生成所需的初始化代码。
您不应在按钮单击事件处理程序中创建控件的新实例。使用Designer方法创建控件,您可以按如下方式访问控件的现有实例:
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";
}
答案 1 :(得分:0)
UserControl1 Usc = new UserControl1();
string Make = Usc.rtnTxtMake;
如果您的用户控件默认为空文本框字段,那么上述两行代码将返回null
或String.Empty
(通过String.IsNullOrEmpty
检查)似乎是正确的,因为你明确地创建了一个用户控件的新实例。
我想你真正想要的是这个:
您已在Designer中的表单中插入了用户控件。我们称之为用户控件实例ctlUser
。
您有一个带有Click
事件处理程序的按钮。您问题中的最后几行代码来自该处理程序方法。
在处理程序中,您不会创建用户控件的新实例(Usc
),而是引用之前插入到表单ctlUser
中的实例。然后事情应该按预期工作。
答案 2 :(得分:0)
当你说该属性返回空值时,你究竟是什么意思?它实际上是null,还是你的MessageBox简单显示为空?
我快速复制了你的代码,它的行为完全符合预期 - MessageBox显示,但它是空的,因为TextBox控件的Text属性的默认值是一个空字符串。
另外,你接近这个的方式有点不寻常。
首先,行:
UserControl1 Usc = new UserControl1();
您通常不需要像这样实例化用户控件。相反,您可以将控件从工具箱拖到窗体的设计图面上。然后,这将为您实例化和初始化您的控件。
我认为这实际上是你的问题 - 当你包含上面的代码行时,你正在创建一个用户控件的新实例,这是没有办法把你拖到设计器上的用户控件
如果您转到表单的设计器视图并单击用户控件,您应该会看到某个属性窗口。如果不,则从“视图”菜单中选择它,或按F4。在属性列表中,应该有一个“名称”,这是为用户控件生成的程序名称。如果需要,可以在此处更改此设置,但是当您在表单的其余部分中引用此控件时,这是您必须使用的。
其次,接下来的两行:
string Make = Usc.rtnTxtMake;
MessageBox.Show(Make)
您可以直接访问属性rtnTxtMake。除非您以后需要在其余代码中访问Make字符串,否则直接访问该属性通常会被认为是更好的样式。
MessageBox.Show(userControl.rtnTxtMake);