我有两个用户控件:UserControl1
并且UserControl2
,这些控件是在 Page.aspx 中添加的。
UserControl1
:此用户控件包含在此用户控件中隐藏文本框的方法。这种方法称为“ HideTextbox
”
UserControl2
: 我想HideTextBox
从UserControl2
.
我怎样才能调用方法HideTextBox
?UserControl2
我有两个用户控件:UserControl1
并且UserControl2
,这些控件是在 Page.aspx 中添加的。
UserControl1
:此用户控件包含在此用户控件中隐藏文本框的方法。这种方法称为“ HideTextbox
”
UserControl2
: 我想HideTextBox
从UserControl2
.
我怎样才能调用方法HideTextBox
?UserControl2
仅当两者都是用户控件或服务器控件,或者您正在从用户控件中寻找服务器控件时才能使用。(不是来自服务器控件,因为您无法获得对 asp.usercontrol_xx 程序集的引用)
首先获取对父页面的引用(通常可以使用this.Parent
.UserControl2
//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;
}
一旦你有你的 Usercontrol2 引用,你就可以轻松地调用你的公共方法。
这个问题可以通过在 UC2 中创建一个自定义事件并在主页上使用该事件来调用 UC1 上的 hide 方法来解决。
您在用户控件中声明一个委托
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()
一个public
方法,而不是私有的。
然后调用UserControl1.HideTextBox()
。
更新:我不清楚获取对 UserControl1 的引用。当我在我的项目中这样做时,我创建了一个接口来声明我要调用的方法,所以我的代码是这样的:
IUserControl1 uc1 = (IUserControl1)this.Parent.FindControl("ucOne");
uc1.HideTextBox();
确保您的 UserControl1 从接口派生: public partial class UserControl1 : System.Web.UI.UserControl, IUserControl1
如果你想使用 Usercontrol 的对象访问方法,你必须像这样注册它..
UserControl1 uc = new UserControl1();
uc.HideTextBox();
您必须将 HideTextBox() 声明为 public。
此外,您需要在网络表单上添加一个指令,告诉网络表单您将动态加载用户控件。所以在网络表单中,添加以下指令。
<%@ Reference Control = "WebUserControl1.ascx" %>
希望这可以帮助