如何在另一个使用控件中读取一个用户控件标签文本?

时间:2012-04-23 07:11:54

标签: asp.net vb.net webforms

我在我的网络应用程序中使用了两个用户控件。我想通过另一个用户控件从用户控件中读取Label文本。我怎么读呢?

3 个答案:

答案 0 :(得分:1)

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

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

  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;      
    }
  }

然后你必须在用户控件中实现该接口,该接口包含Label:

  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回答Finding all controls in an ASP.NET Panel?

答案 1 :(得分:0)

在MSDN上查看this article

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

答案 2 :(得分:0)

像这样使用......

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