Findcontrol 属性在 createUserWizard 中不起作用
Posted
技术标签:
【中文标题】Findcontrol 属性在 createUserWizard 中不起作用【英文标题】:Findcontrol property not working in createUserWizard 【发布时间】:2012-12-13 14:02:29 【问题描述】:我正在使用 ASP 的 createUserWizard 控件来创建我的用户,并且我想添加一些额外的字段(包含有关用户的额外信息),这些字段将保存在我自己的表中。
我尝试使用 findContol 属性在代码中访问这些自定义文本框(因为它们在 createUserWizard 中)
问题是我声明并初始化为控件的文本框为空。 这是我的做法:
TextBox t_desc = (TextBox)(CreateUserWizard1.FindControl("txt_desc"));
o.organisation_description = t_desc.Text;
这就是控件的嵌套方式:
<asp:CreateUserWizard ID="CreateUserWizard1" runat="server"
oncreateduser="CreateUserWizard1_CreatedUser">
<WizardSteps>
<asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server"
Title="Registreer uw organisatie">
<ContentTemplate>
<div class="row">
<div class="half">
<table>
<tr>
<td align="right">
<asp:Label ID="lbl_organisation_description" runat="server" AssociatedControlID="txt_desc">Beschrijf uw organisatie:</asp:Label>
</td>
<td>
<asp:TextBox ID="txt_desc" runat="server" ValidationGroup="CreateUserWizard1"></asp:TextBox>
</td>
</tr>
</table>
</div>
</div>
</ContentTemplate>
</asp:CreateUserWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
【问题讨论】:
【参考方案1】: CreateUserWizardStep step = (CreateUserWizardStep) CreateUserWizard1.FindControl("CreateUserWizardStep1");
if (step!=null)
TextBox txt = (TextBox)step.ContentTemplateContainer.FindControl("txt_desc");
或者如果您可以从服务器代码中看到您的步骤控制
TextBox txt = (TextBox)CreateUserWizardStep1.ContentTemplateContainer.FindControl("txt_desc");
【讨论】:
谢谢!确实,要获得控制权,您必须通过CreateUserWizard1.CreateUserStep.ContentTemplateContainer
。【参考方案2】:
FindControl 仅检查直接子控件,在您的 CreateWizard1 中是 CreateUserWizardStep(使用 runat=server)。一个简单的解决方法是使用递归算法:
public static class ControlExtensions
public static Control FindControlRecursive(this Control root, string id)
if (root.ID == id)
return root;
foreach (Control c in root.Controls)
Control t = c.FindControlRecursive(id);
if (t != null)
return t;
return null;
将此类添加到您的解决方案将允许您使用 control.FindControlRecursive("id")。
请记住,如果您使用大页面,这可能意味着相当多的开销!
【讨论】:
【参考方案3】:我认为 WizardStep 是一个命名容器,因此您需要针对它运行 findcontrol。
类似
var step = CreateUserWizard1.CreateUserStep;
TextBox t_desc = (TextBox)(step.FindControl("txt_desc"));
这是完全未经测试的代码,因此它可能无法正常工作,但我很确定问题的根源在于您在错误的父控件上运行 FindControl。
【讨论】:
【参考方案4】:试试这个找到 CreateUserWizard 中的控件
TextBox txtCaptcha = (TextBox)CreateUserWizardStep1.CreateUserStep.ContentTemplateContainer.FindControl("txtCaptcha");
【讨论】:
【参考方案5】:您的 CreateUserWizard 的 EnableViewState 属性必须设置为 True,您的 DropDownList 才能保持状态。
【讨论】:
应该是 ViewStateMode="Enabled"。以上是关于Findcontrol 属性在 createUserWizard 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章