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

问题描述:

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

我的问题是,当我在窗体中调用它时,属性返回空值。我错过了什么?

我的属性如下::

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) 
+1

你曾经设置过'txtMake.Text'吗? – Nifle 2010-01-10 08:29:00

+0

当我运行application.is时,我在文本框中输入值不够? – Kishore 2010-01-10 08:32:27

+0

手动当我分配txtMake.Text一些value.i'm能够得到所需的输出。但我如何分配在运行时键入的值txtMake.Text ???????? – Kishore 2010-01-10 08:38:50

UserControl1 Usc = new UserControl1(); 
string Make = Usc.rtnTxtMake; 

如果您的用户控件具有默认的空文本字段,则似乎是正确的,上述两行代码将返回nullString.Empty(通过String.IsNullOrEmpty进行检查),因为您明确创建了用户控件的新实例。

我想你真正想要的是这样的:

  • 已插入用户控件到在设计的形式。我们称这个用户控件实例为ctlUser

  • 您有一个带有Click事件处理程序的按钮。你问题中的最后几行代码来自该处理程序方法。

  • 在处理程序中,您不会创建用户控件的新实例(Usc),而是指先前插入到表单中的那个实例,即ctlUser。然后事情应该按预期工作。

+0

谢谢..我指的是新实例。 – Kishore 2010-01-10 09:03:31

你的用户控件必须添加到的控件集合父窗体/控件,然后才能正确初始化。通常你不会自己编写代码来创建并添加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"; 
} 
+0

@Ash我经常在运行时创建UserControls; imho:并不少见或“异常”的做法。当然你应该指出,任何运行时创建的控件在被添加到某个“容器”之前可能会“无用”。但是,也有例外:我使用运行时创建的3rd。第三方TreeView实例:永远不会添加到任何容器中:它可以将所选节点保存为UI TreeView(如果TreeView允许将整个TreeView保存为XML)。我将UI的TreeView中的选定节点克隆到“ghost”TreeView中,将“ghost”TreeView保存为XML,然后清除“ghost”。 – BillW 2010-01-10 10:17:38

当你说属性返回一个空值时,你到底意味着什么?它实际上是否为空,或者您的MessageBox简单显示为空?

我快速复制了你的代码,它的行为和预期的完全一样 - MessageBox显示,但它是空的,因为TextBox控件的Text属性的默认值是一个空字符串。

此外,你接近这种方式有点不寻常。

首先,该行:

UserControl1 Usc = new UserControl1(); 

你通常不需要实例化一个像这样的用户控件。相反,您可以将控件从工具箱拖到窗体的设计图面上。然后,这将负责为您实例化并初始化您的控件。

我认为这实际上是你的问题 - 当你包含上面的代码行时,你正在创建一个新的用户控件实例,而且这是无法实现的用户控件,你已经拖到了设计师。

如果您转到窗体的设计器视图并单击用户控件,应该会看到属性窗口。如果您不这样做,请从视图菜单中选择它,或者按F4键。在属性列表中,应该有一个“名称”,这是为您的用户控件生成的编程名称。如果你愿意,你可以在这里改变它,但是当你在表单的其余部分引用这个控件时,这是你必须使用的。

其次,接下来的两行:

string Make = Usc.rtnTxtMake; 

MessageBox.Show(Make) 

您可以直接访问属性rtnTxtMake。除非您稍后需要访问其余代码中的Make字符串,否则直接访问该属性通常会被认为是更好的样式。

MessageBox.Show(userControl.rtnTxtMake); 
+0

@大卫,小小的观察:因为变量是在一个(肯定是私人的)按钮点击处理程序的范围中声明的,所以无法在该范围之外访问该变量:无论如何,当然你是正确的,像这样关闭使用是浪费时间。 – BillW 2010-01-10 09:58:15