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)
UserControl1 Usc = new UserControl1();
string Make = Usc.rtnTxtMake;
如果您的用户控件具有默认的空文本字段,则似乎是正确的,上述两行代码将返回null
或String.Empty
(通过String.IsNullOrEmpty
进行检查),因为您明确创建了用户控件的新实例。
我想你真正想要的是这样的:
已插入用户控件到在设计的形式。我们称这个用户控件实例为
ctlUser
。您有一个带有
Click
事件处理程序的按钮。你问题中的最后几行代码来自该处理程序方法。在处理程序中,您不会创建用户控件的新实例(
Usc
),而是指先前插入到表单中的那个实例,即ctlUser
。然后事情应该按预期工作。
谢谢..我指的是新实例。 – 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";
}
@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);
@大卫,小小的观察:因为变量是在一个(肯定是私人的)按钮点击处理程序的范围中声明的,所以无法在该范围之外访问该变量:无论如何,当然你是正确的,像这样关闭使用是浪费时间。 – BillW 2010-01-10 09:58:15
你曾经设置过'txtMake.Text'吗? – Nifle 2010-01-10 08:29:00
当我运行application.is时,我在文本框中输入值不够? – Kishore 2010-01-10 08:32:27
手动当我分配txtMake.Text一些value.i'm能够得到所需的输出。但我如何分配在运行时键入的值txtMake.Text ???????? – Kishore 2010-01-10 08:38:50