Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从ASP.NET页面在usercontrol中查找控件_Asp.net_User Controls - Fatal编程技术网

从ASP.NET页面在usercontrol中查找控件

从ASP.NET页面在usercontrol中查找控件,asp.net,user-controls,Asp.net,User Controls,我使用LoadControl(“src to file”)将控件动态加载到页面 在usercontrol中,我有一个验证器和一些我想从页面访问的其他控件。我无法让它工作,空指针异常 情况是这样的。我有一个Edit.aspx页面,它加载EditTemplate.ascx usercontroll。我想从Edit.aspx站点获取信息或在EditTemplate中查找控件 我已尝试将控件和验证器作为属性公开,但如何从Edit.aspx访问它们 示例代码: 在Edit.aspx中,控件稍后添加到 Co

我使用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>
从Edit.aspx站点,我想检查validatorisvalid属性。Isvalid在保存方法中设置

保存模板的“保存”按钮位于edit.aspx中,因此可以从该页面完成post in

所以问题是如何从edit.aspx页面中的usercontrol获取属性,应该在哪里以及如何实现


再次感谢。

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

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.

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


.

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

public RequiredFieldValidator ValidatorToCheck
{
    get { return this.rfvMyField; }
}
// 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
然后,您可以动态地将用户控件添加到某个占位符(确保为用户控件分配一个ID)

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


谢谢你的快速回答。我确实试过了,但没能成功。如何在my edit.aspx页面中写入以获取usercontrol,然后使用其属性(创建变量)?我所做的是创建一个usercontrol对象,但随后信息消失了,因为我将其实例化为一个新对象…如果您使用LoadControl并将其添加到控件树中,您可以执行以下两种操作之一:将其存储在变量中并始终引用它,或者将其添加到控件树中,然后稍后使用FindControl查找对它的引用,并将其强制转换为用户控件类型。ViewState在加载事件或更高版本时重新加载所有控件属性。我确实使用LoadControl添加控件。FindControl将ID作为参数。usercontrol的ID是什么?因为loadcontrol获取文件的路径。我第一次也尝试过这样做,但是得到了一个空指针异常。再次感谢您的快速回答。这是我能想到的代码片段:var edit=(EditTemplate)FindControl(“EditTemplate”);我还是不能上班。当我试图从edit.aspx站点访问我的usercontrol及其属性时,总是会出现空指针异常。你能发布一些与此问题相关的代码吗?那会有帮助的。我试着用这个。这样我就掌握了控制权。但是,当我在用户控件中设置IsValid属性,然后在页面中获取该属性时,该属性将重置为默认值,即true。当a将其设置为false时,这似乎并不重要。我猜我正在失去控件的状态。您是否可以发布一段代码,尝试从IsValid属性(如果可能,整个方法)检索值?我感兴趣的是你想访问页面生命周期的哪一步。但是如果你真的失去了控制的状态,你应该考虑使用VIEWSTATE或控制状态机制。
// 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
EditTemplate control = (EditTemplate)pnlControlHolder.FindControl("ucEditTemplate");
if (control.ValidatorToCheck.IsValid)
{
    // Some action
}