繁体   English   中英

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

[英]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;

如果您的用户控件默认情况下有一个空的文本框字段,则上述两行代码将返回nullString.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM