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

时间:2013-01-17 19:27:16

标签: c# asp.net user-controls

我有两个用户控件:UserControl1UserControl2,这些控件添加在Page.aspx中。

UserControl1: 此usercontrol包含此usercontrol中隐藏文本框的方法。此方法称为“HideTextbox

UserControl2: 我想从HideTextBox调用方法“UserControl2”。

如何从HideTextBox调用方法UserControl2

6 个答案:

答案 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" %>

希望这有帮助