【问题标题】:Find control in usercontrol from a Page ASP.NET从页面 ASP.NET 中查找用户控件中的控件
【发布时间】:2010-09-02 18:13:06
【问题描述】:

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

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

场景是这样的。我有一个加载 EditTemplate.ascx 用户控件的 Edit.aspx 页面。我想从 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 属性。 Isvalid 在 Save 方法中设置。

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

所以问题是如何从edit.aspx页面中的用户控件中获取属性,应该在哪里以及如何做到这一点?

再次感谢。

【问题讨论】:

    标签: asp.net user-controls


    【解决方案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。

    【讨论】:

    • 感谢您的快速回答。我确实尝试过,但我无法让它工作。如何在我的 edit.aspx 页面中写入来获取用户控件,然后使用它的属性(创建一个变量)?我所做的是创建一个用户控件对象,但随后信息消失了,因为我将它实例化为一个新对象......
    • 如果您使用 LoadControl 并将其添加到控件树中,您可以执行以下两种操作之一:将其存储在变量中并始终引用它,或者将其添加到控件树中,然后使用 FindControl稍后找到对它的引用,并将其转换为用户控件类型。 ViewState 在 Load 事件或之后重新加载所有控件属性。
    • 我确实使用 LoadContol 添加控件。 FindControl 将 ID 作为参数。用户控件的 ID 是什么?由于 loadcontrol 采用文件的路径。我第一次也尝试过这样做,但得到了一个空指针异常。再次感谢您的快速回答。这是我能想到的sn-p代码: var edit = (EditTemplate) FindControl("EditTemplate");
    • 仍然无法让我工作。尝试从 edit.aspx 站点访问我的用户控件及其属性时,我总是得到空指针异常。
    • 你能发布一些与问题相关的代码吗?这会有所帮助。
    【解决方案2】:

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

    Recursive-FindControl.

    【讨论】:

    • 我试过用这个。这样我就掌握了控制权。但是当我在我的用户控件中设置 IsValid 属性并稍后在我的页面中获取该属性时,该属性被重置为默认值,即 true。将其设置为 false 似乎并不重要。我猜我正在失去控制状态
    • 您能否发布一个代码来尝试从 IsValid 属性中检索一个值(如果可能,整个方法)?我对您想要访问它的页面生命周期的哪个步骤感兴趣。但如果你真的失去了控件的状态,你应该考虑使用 ViewState 或 Control State 机制。
    【解决方案3】:

    正如前面的回答中提到的,我会将您必须从父 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
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 2010-10-24
      • 2014-09-25
      • 2013-09-11
      • 2011-06-16
      • 1970-01-01
      • 2019-05-07
      相关资源
      最近更新 更多