【问题标题】:Findcontrol property not working in createUserWizardFindcontrol 属性在 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>

【问题讨论】:

    标签: c# asp.net 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"。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-26
          • 1970-01-01
          • 2023-03-23
          • 2010-10-22
          • 1970-01-01
          相关资源
          最近更新 更多