我在我的 Web 应用程序中使用了两个用户控件。我想通过另一个用户控件从用户控件中读取标签文本。我该如何阅读?
问问题
1744 次
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 回答