我正在使用C#在Visual Studio 2010中构建一个简单的应用程序,我这样做是为了熟悉用户控件,因为它似乎比创建多个表单更容易。
在主窗体上,有一个下拉列表,其中包含2个值“UCType1
”和“UCType2
”。我创建了2个不同的用户控件。我在主窗体上使用面板根据他们在下拉列表中选择的内容显示用户控件。
我能够根据用户选择显示适当的用户控件,但现在我遇到了一些问题。我无法从主用表单中读取用户控件的数据。
假设主窗体上有一个“Execute
”按钮和一个标签“Warning
”。用户控件上有一个文本框“Name
”。
方案是:当用户点击“Execute
”时,如果“Name
”为空,则“Warning
”会显示一些错误消息。
我试图在主窗体上使用if(UserControl1.Name.Text == "")
,但我甚至无法像那样引用它。
我知道我可以创建单独的表单以使其更容易,因为这将使所有变量都在同一个文件中,但我想知道是否有办法用户控制,因为我想熟悉它
由于
这是我显示用户控件的方式
private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
UCType1 uc1 = new UCType1();
panel1.Controls.Clear();
panel1.Controls.Add(uc1);
}
当我试图显示来自用户控件的数据时
private void executeButton_Click(object sender, EventArgs e)
{
UCType1 uc1 = new UCType1();
warning.Text = uc1.Name;
}
什么都没发生。
答案 0 :(得分:5)
在UserControl
中创建一个设置或获取TextBox
文本的公共属性。像
public String Name
{
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
现在您可以从表单中访问名称。喜欢:
if(UserControl1.Name == "")
答案 1 :(得分:1)
您的代码存在问题,您再次创建控件对象而不是使用现有控件对象
UCClientType1 uc1 = new UCClientType1();//access exsting object do not create new
warning.Text = uc1.Name;
因为我在serach下面提供了您添加的控件的更新,而不是访问值
你需要这样做
private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
UCType1 uc1 = new UCType1();
uc1.Name = "uc1";
uc1.Id = "uc1";
panel1.Controls.Clear();
panel1.Controls.Add(uc1);
}
方法中的代码更改应该像这样
private void executeButton_Click(object sender, EventArgs e)
{
UCClientType1 uc =frm.panel1.Controls.FindControl("uc1",true) as UCClientType1;
if(uc1 != null)
warning.Text = uc1.Name;
}
只需在您的用户控件中使用以下代码即可从
访问父级Form parentForm = (this.Parent as Form);
var data = parentForm.textbox1.Text;
如果你想在mainform中加载usercontrol而不是你可以这样做
UserControl uc =frm.Controls.FindControl("myusercontrol",true);
from.warning.Text = uc.Textbox1.Text;