我有两个用户控件:UserControl1
和 UserControl2
,这些控件添加在 Page.aspx
中。
UserControl1
:
该用户控件包含隐藏文本框的方法。此方法名为 "HideTextbox
"。
UserControl2
:
我想从 UserControl2
调用方法 "HideTextBox
"。
如何从 UserControl2
调用方法 HideTextBox
?
我有两个用户控件:UserControl1
和 UserControl2
,这些控件添加在 Page.aspx
中。
UserControl1
:
该用户控件包含隐藏文本框的方法。此方法名为 "HideTextbox
"。
UserControl2
:
我想从 UserControl2
调用方法 "HideTextBox
"。
如何从 UserControl2
调用方法 HideTextBox
?
//this for extension method
public static UserControl2 FindUserControl2Recursive(this Control root)
{
var uc2 = root as ASP.UserControls_UserControl2_ascx;
if (uc2 != null)
{
return uc2;
}
foreach (var control in root.Controls)
{
uc2 = control.FindUserControl2Recursive();
if (uc2 != null)
{
return uc2;
}
}
return null;
}
public delegate void HideTextBoxEventHandler(object sender, EventArgs e);
public event HideTextBoxEventHandler HideTextBox;
在代码中想要隐藏文本框的地方,您需要调用该事件:
if (this.HideTextBox != null) // if there is no event handler then it will be null and invoking it will throw an error.
{
EventArgs e = new EventArgs();
this.HideTextBox(this, e);
}
然后从主页面创建一个事件处理方法
protected void UserControl2_HideTextBox(Object sender, EventArgs e)
{
UC1.InvokeHideTextBox(); // this is the code in UC1 that does the hiding
}
您需要在页面加载或者加载UC2的地方进行添加。
UC2.HideTextBox += new UserControl2.HideTextBoxEventHandler(this.UserControl2_HideTextBox);
public interface ITextBoxHider
{
void HideTextBoxes();
}
接下来在UserControl1上实现这个接口,当你想要隐藏文本框时,枚举表单上的所有控件并找到一个实现了ITextBoxHider接口的控件,然后简单地调用该方法:
帮助方法将枚举所有控件:
public static IEnumerable<Control> GetAllChildren(Control parent)
{
foreach (Control control in parent.Controls)
{
foreach (Control grandChild in GetAllChildren(control))
yield return grandChild;
yield return control;
}
}
使用该方法并从UserControl2调用HideTextBoxes:
var hider = GetAllChildren(this.Page).FirstOrDefault(ct => ct is ITextBoxHider);
if (hider != null)
(hider as ITextBoxHider).HideTextBoxes();
在用户控件2上
UC1Class UserControl = Parent.FindControl("UC1_Name") as UC1Class;
UserControl.HideTextbox();
或缩短
(Parent.FindControl("UC1_Name") as UC1Class).HideTextbox();
在用户控件1上
public void HideTextbox()
{
....Do Something
}
首先,您需要将HideTextBox()
方法从私有方法更改为公共方法。
然后调用UserControl1.HideTextBox()
方法。
更新: 我之前没有清楚地说明如何获取对UserControl1的引用。在我的项目中,我创建了一个声明了我要调用的方法的接口,因此我的代码如下:
IUserControl1 uc1 = (IUserControl1)this.Parent.FindControl("ucOne");
uc1.HideTextBox();
请确保您的UserControl1从接口派生: public partial class UserControl1 : System.Web.UI.UserControl, IUserControl1
UserControl1 uc = new UserControl1();
uc.HideTextBox();
你需要将 HideTextBox() 声明为 public。
另外,你需要在 Web 表单中添加一个指令,告诉它你要动态加载用户控件。因此,在 Web 表单中添加以下指令。
<%@ Reference Control = "WebUserControl1.ascx" %>
希望这能有所帮助