2

ASP の createUserWizard コントロールを使用してユーザーを作成しています。自分のテーブルに保存しているいくつかの追加フィールド (ユーザーに関する追加情報を含む) を追加したいと考えています。

findContol プロパティを使用してコード ビハインドでこれらのカスタム テキスト ボックスにアクセスしようとしました (createUserWizard 内にあるため)。

問題は、コントロールとして宣言して初期化したテキスト ボックスが null であることです。これが私がそれを行う方法です:

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>
4

5 に答える 5

6
 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");
于 2012-12-13T14:16:28.967 に答える
1

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") を使用できるようになります。

大きなページを使用している場合、これはかなりのオーバーヘッドを意味する可能性があることに注意してください!

于 2012-12-13T14:18:58.980 に答える
0

DropDownList の状態を維持するには、CreateUserWizard の EnableViewState プロパティを True に設定する必要があります。

于 2016-08-10T12:40:39.477 に答える
0

WizardStep は名前付けコンテナーだと思うので、それに対して findcontrol を実行する必要があります。

何かのようなもの

var step = CreateUserWizard1.CreateUserStep;
TextBox t_desc = (TextBox)(step.FindControl("txt_desc"));

これは完全にテストされていないコードであるため、機能しない可能性がありますが、問題の根本は間違った親コントロールで FindControl を実行していることだと確信しています。

于 2012-12-13T14:12:41.020 に答える