从Page ASP.NET中查找usercontrol中的控件

时间:2010-09-02 18:13:07

标签: asp.net user-controls

我正在使用LoadControl(“src to file”)动态地将控件加载到页面。

在usercontrol中,我有一个验证器和一些其他控件,我想从我的页面访问。我无法让它工作,空指针异常。

情景是这样的。我有一个Edit.aspx页面,它加载EditTemplate.ascx usercontroll。我想从Edit.aspx站点获取信息或在EditTemplate中找到控件。

我尝试将控件和验证器公开为属性,但是如何从Edit.aspx中访问它们?

示例代码:

Edit.aspx,控件稍后被添加到

Control control = LoadControl("src to ascx");
TemplatePlaceHolder.Controls.Add(control);

EditTemplate.ascx

    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="CompanyImageFile" ErrorMessage="RequiredFieldValidator"></asp:RequiredFieldValidator>

代码隐藏

public partial class EditTemplate : System.Web.UI.UserControl, IEditTemplate {
    public RequiredFieldValidator Validator {
        get { return this.RequiredFieldValidator1; }
        set { this.RequiredFieldValidator1 = value; }
    }

从Edit.aspx网站,我想检查验证器isValid属性。在Save方法中设置了Isvalid。

保存模板的保存按钮位于edit.aspx中,因此从该页面完成了帖子。

所以问题是如何从edit.aspx页面中的usercontrol获取属性,在哪里以及如何完成?

再次感谢。

3 个答案:

答案 0 :(得分:1)

最简单的方法是让用户控件定义属性,如:

public IValidator SomeValidator {
  get { return this.cuvValidator; }
  set { this.cuvValidator = value; }
}

public string Text {
  get { return this.txtText.Text; }
  set { this.txtText.Text = value; }
}

您的编辑页面可以使用。

HTH。

答案 1 :(得分:1)

您始终可以使用递归方法。检查Steve Smith博客上的解决方案:

Recursive-FindControl

答案 2 :(得分:0)

如前面的答案中所述,我会将您必须从父ASPX页面访问的任何验证器公开为用户控件中的属性。

public RequiredFieldValidator ValidatorToCheck
{
    get { return this.rfvMyField; }
}

然后,您可以将用户控件动态添加到某个占位符(确保为用户控件分配ID)。

// In my example, this is occurring in the Page_Load event
Control control = LoadControl("~/Controls/EditTemplate.ascx");
control.ID = "ucEditTemplate";
pnlControlHolder.Controls.Add(control); // the placeholder in my example is a panel

当您想要访问给定验证器上的IsValid属性时(可能在您的保存操作中),您可以执行以下操作(确保将控件转换为适当的类型并使用您最初分配给用户控件的ID ):

EditTemplate control = (EditTemplate)pnlControlHolder.FindControl("ucEditTemplate");
if (control.ValidatorToCheck.IsValid)
{
    // Some action
}