我在我的网络应用程序中使用了两个用户控件。我想通过另一个用户控件从用户控件中读取Label文本。我怎么读呢?
答案 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)
像这样使用......
在用户控件中创建一个公共属性,并使用您想要该值的用户控件名称来调用该属性....