1

我在我的 Web 应用程序中使用了两个用户控件。我想通过另一个用户控件从用户控件中读取标签文本。我该如何阅读?

4

3 回答 3

1

您应该重构您的代码,而不是依赖另一个 UI 控件上的某些标签的内容。以与在该用户控件中相同的方式获取该值,或在另一个类中提取该功能以避免代码重复,并从两个位置调用它。

但是,如果您不想坚持使用此现有代码,您应该创建接口并捕获您不会从外部代码调用的所有 UserControls 功能(在您的情况下:返回标签文本)。然后在必须从外部调用的用户控件中实现该接口,之后就是查找控件实例,您可以通过枚举所有 Page 子控件来做到这一点。这是一个简单接口的示例代码,它定义了控件必须返回一些标签文本,以及一个在控件树中按名称查找用户控件的类:

  public interface IUserControl
  {
    string LabelText();
  }

  public class PageUserControls
  {
    private Page parentPage;

    public PageUserControls(Page myParentPage)
    {
      this.parentPage = myParentPage;
    }

    private IEnumerable<Control> EnumerateControlsRecursive(Control parent)
    {
      foreach (Control child in parent.Controls)
      {
        yield return child;
        foreach (Control descendant in EnumerateControlsRecursive(child))
          yield return descendant;
      }
    }

    public IUserControl GetControl(string controlName)
    {
      foreach (Control cnt in EnumerateControlsRecursive(this.parentPage))
      {
        if (cnt is IUserControl && (cnt as UserControl).AppRelativeVirtualPath.Contains(controlName))
          return cnt as IUserControl;
      }
      return null;      
    }
  }

那么您必须在包含该标签的用户控件中实现该接口:

  public partial class WebUserControl1 : System.Web.UI.UserControl, IUserControl
  {
    public string LabelText()
    {
      return Label1.Text;
    }
  }

最后从另一个用户控件中使用它:

  PageUserControls puc = new PageUserControls(this.Page);
  string txt1 = puc.GetControl("WebUserControl1.ascx").LabelText();

顺便提一句。方法 EnumerateControlsRecursive 是从 SO answer to Find all controls in an ASP.NET Panel? 中采用的?

于 2012-04-23T08:41:15.250 回答
0

看看MSDN 上的这篇文章

简而言之,如果您知道 ID,则可以访问其他控件。

于 2012-04-23T07:21:58.503 回答
0

像这样使用...

在用户控件中创建一个公共属性,并使用您想要该值的用户控件名称调用该属性....

于 2012-04-23T07:27:02.577 回答