Windows窗体应用程序中的用户控件

时间:2010-01-10 08:20:17

标签: c# winforms

我有一个简单的用户控件,其中包含文本框和标签。当我以另一种形式使用用户控件时,我创建了公共属性来访问文本框中的文本。

我的问题是当我在表单中调用它时,属性返回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)

3 个答案:

答案 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;

如果您的用户控件默认为空文本框字段,那么上述两行代码将返回nullString.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);