如何使用asp.net从另一个usercontrol中调用usercontrol中的方法?

Jen*_*nan 5 c# asp.net user-controls

我有两个usercontrols:UserControl1并且UserControl2,这些控件添加在Page.aspx中.

UserControl1:此usercontrol包含此usercontrol中隐藏文本框的方法.这种方法叫做" HideTextbox"

UserControl2:我想调用方法" HideTextBox" UserControl2.

我怎样才能调用方法HideTextBoxUserControl2

Des*_*tor 6

只有当两者都是用户控件或服务器控件,或者您正在寻找来自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;
}
Run Code Online (Sandbox Code Playgroud)

获得Usercontrol2参考后,您可以轻松调用您的公共方法.


Cha*_*had 5

通过在UC2中创建自定义事件并在主页上使用该事件以在UC1上调用hide方法,可以解决此问题。

您在用户控件中声明一个委托

public delegate void HideTextBoxEventHandler(object sender, EventArgs e);
Run Code Online (Sandbox Code Playgroud)

然后为您创建的委托定义事件

public event HideTextBoxEventHandler HideTextBox;
Run Code Online (Sandbox Code Playgroud)

在代码中要隐藏文本框的位置,您需要调用该事件:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后从主页创建一个事件处理方法

protected void UserControl2_HideTextBox(Object sender, EventArgs e)
{
   UC1.InvokeHideTextBox();  // this is the code in UC1 that does the hiding
}
Run Code Online (Sandbox Code Playgroud)

您将需要添加到页面加载或将UC2加载到任何地方

UC2.HideTextBox += new UserControl2.HideTextBoxEventHandler(this.UserControl2_HideTextBox);
Run Code Online (Sandbox Code Playgroud)