IDE:Visual Studio,C#.net 4.0
我有两个相同的用户控件uc1和uc2,两者都有一个名为txtbox1的文本框 现在看到这个代码,textbox1在设计器中是公共的,所以它可以在form1.cs中评估,Form 1是简单的windows表单,它有uc1和uc2。
在form1中看到我在onLoad_form1方法中调用的这个函数。
UserControl currentUC; //Global variable;
public void loadUC(string p1)
{
//Here I want:
if(p1 == "UC1)
{
currentUC = uc1;
}
if(p1 == "UC2)
{
currentUC = uc2;
}
}
比调用基于currentUC值更新textbox1的另一个函数
//on load
currentUC.textbox1.text = "UC1 called";
//Here I am getting error "currentUc does not contains definition for textbox1"
如果我这样做: uc1.textbox1.text =“UC1 text”; uc2.textbox1.text =“UC1 text”; //它可以工作,但基于p1字符串变量我希望将控件设置为uc1或uc2,而不是我想访问其子控件。请建议如何执行此操作。
请不要告诉else else块,因为我必须在各个地方使用此功能。
感谢。
@Lee答案: - 仅适用于文本框,但我有两个用户控件,即两个不同的用户控件,而不是它的实例。 UserControlLeft和UserControlRight都有相同的文本框,列表框等(有微小的设计更改),我想根据一些字符串“left”和“right”访问/加载它。
答案 0 :(得分:3)
由于文本框具有相同的名称,您可以在Controls
集合中查找它们:
TextBox tb = (TextBox)currentUC.Controls["textbox1"];
tb.Text = "UC1 called";
更好的解决方案是在用户控件类中添加一个属性,用于设置内部文本属性,例如
public class MyUserControl : UserControl
{
public string Caption
{
get { return this.textbox1.Text; }
set { this.textbox1.Text = value; }
}
}
答案 1 :(得分:0)
我认为你在这里混合了几件事。
我们选择所有有效选项:
假设您有以下aspx代码段:
<div>
<uc1:MyCustomUserControl id="myControl" runat="server" />
<uc1:MyCustomUserControl id="myControl2" runat="server" />
</div>
如果您现在想要访问该控件,则应执行以下操作:
public void Page_Load()
{
var myControl ((MyCustomUserControl)FindControl("MyControlName"));
// On 'myControl' you can now access all the public properties like your textbox.
}
答案 2 :(得分:0)
在WPF中你可以这样做:
//加载MAINFORM
public void SetText(string text)
{
CLASSOFYOURCONTROL ctrl = currentUC as CLASSOFYOURCONTROL ;
ctrl.SetText(text);
}
//在控件SUB中
public void SetText(string text)
{
textbox1.text = "UC1 called"
}
我认为这也适用于winforms。并且比直接从子控件访问控件更干净
答案 3 :(得分:0)
@ Lee的方法很好。另一种方法是使用带有公共setter的公共属性(文本框不需要以这种方式公开)。
或一个界面(这样你就不会关心你在特定时刻所拥有的课程 - 而且没有ifs):
public interface IMyInterface
{
void SetTextBoxText(string text);
}
public partial class UC1: UserControl, IMyInterface
{
public void SetTextBoxText((string text)
{
textBox1.Text=text;
}
//...
}
public partial class UC2: UserControl, IMyInterface
{
public void SetTextBoxText((string text)
{
textBox1.Text=text;
}
//...
}
使用代码:
((IMyInterface)instanceOfUC1).SetTextBoxText("My text to set");
((IMyInterface)instanceOfUC2).SetTextBoxText("My text to set");