5

我有两个用户控件:UserControl1并且UserControl2,这些控件是在 Page.aspx 中添加的。

UserControl1:此用户控件包含在此用户控件中隐藏文本框的方法。这种方法称为“ HideTextbox

UserControl2: 我想HideTextBoxUserControl2.

我怎样才能调用方法HideTextBoxUserControl2

4

6 回答 6

6

仅当两者都是用户控件或服务器控件,或者您正在从用户控件中寻找服务器控件时才能使用。(不是来自服务器控件,因为您无法获得对 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 引用,你就可以轻松地调用你的公共方法。

于 2013-01-17T19:57:06.933 回答
6

这个问题可以通过在 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);
于 2013-01-17T20:29:02.303 回答
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 调用 HideTextBoxes :

var hider = GetAllChildren(this.Page).FirstOrDefault(ct => ct is ITextBoxHider);
if (hider != null)
  (hider as ITextBoxHider).HideTextBoxes();
于 2013-01-17T21:04:00.880 回答
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
}
于 2017-10-08T23:37:18.280 回答
-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

于 2013-01-17T19:29:45.000 回答
-1

如果你想使用 Usercontrol 的对象访问方法,你必须像这样注册它..

UserControl1 uc = new UserControl1();
uc.HideTextBox();

您必须将 HideTextBox() 声明为 public。

此外,您需要在网络表单上添加一个指令,告诉网络表单您将动态加载用户控件。所以在网络表单中,添加以下指令。

<%@ Reference Control = "WebUserControl1.ascx" %>

希望这可以帮助

于 2013-01-17T19:35:17.920 回答