我有两个用户控件:UserControl1
和UserControl2
,这些控件添加在Page.aspx中。
UserControl1
:
此usercontrol包含此usercontrol中隐藏文本框的方法。此方法称为“HideTextbox
”
UserControl2
:
我想从HideTextBox
调用方法“UserControl2
”。
如何从HideTextBox
调用方法UserControl2
?
答案 0 :(得分:5)
只有当两者都是用户控件或服务器控件,或者您正在寻找来自usercontrol的servercontrol时,这才有效。 (不是来自servercontrol,因为你无法获得对asp.usercontrol_xx程序集的引用)
首先获取对父页面的引用(通常可以使用this.Parent
完成此操作。
接下来在父级上执行递归FindControl以查找类型为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参考后,您可以轻松调用公共方法。
答案 1 :(得分:4)
可以通过在UC2中创建自定义事件并在主页面上使用该事件来调用UC1上的隐藏方法来解决此问题。
您在用户控件中声明委托
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);
答案 2 :(得分:1)
我会在控件上声明知道如何隐藏文本框的控件,如下所示:
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调用HideTextBox:
var hider = GetAllChildren(this.Page).FirstOrDefault(ct => ct is ITextBoxHider);
if (hider != null)
(hider as ITextBoxHider).HideTextBoxes();
答案 3 :(得分:0)
在用户控制2上
UC1Class UserControl = Parent.FindControl("UC1_Name") as UC1Class;
UserControl.HideTextbox();
或缩短
(Parent.FindControl("UC1_Name") as UC1Class).HideTextbox();
在用户控制1上
public void HideTextbox()
{
....Do Something
}
答案 4 :(得分:-1)
首先,您需要HideTextBox()
public
方法,而不是私有。
然后拨打UserControl1.HideTextBox()
。
更新: 我不清楚是否获得了UserControl1的引用。当我在我的项目中执行此操作时,我创建了一个声明我要调用的方法的接口,所以我的代码是这样的:
IUserControl1 uc1 = (IUserControl1)this.Parent.FindControl("ucOne");
uc1.HideTextBox();
确保您的UserControl1派生自界面: public partial class UserControl1:System.Web.UI.UserControl,IUserControl1
答案 5 :(得分:-1)
如果你想使用Usercontrol的对象访问方法,你必须像这样注册它..
UserControl1 uc = new UserControl1();
uc.HideTextBox();
您必须将HideTextBox()声明为public。
此外,您需要在webform上添加一个指令,告诉webform您将动态加载usercontrol。因此,在webform中,添加以下指令。
<%@ Reference Control = "WebUserControl1.ascx" %>
希望这有帮助