5

私は、ゲストが新郎新婦のために購入したいプレゼントを予約できるシンプルなウェディング リスト アプリケーションを開発しています。予約ページでは、いくつかのフィールドがいくつかのパネル内にラップされ、すべてが FormView 内にラップされています。

ユーザーが名前、電子メール、予約したいアイテムの数量を入力すると、ページは DB で必要な予約を行います。

私の最初の問題は、FormView_ItemCommand で、FormView 内の他のコントロールを参照できなかったことでした.... これは FindControl の場合だと思いましたが、一度も必要としたことがないのに、なぜ Formview が必要なのですか? ListViews または DetailViews の場合?

次に、次のコードが機能することを知っています..

Dim oCtrl as TextBox = Me.fvwReservation.FindControl("txtEmail")
Dim Test As String = oCtrl.Text

・・・でもなんで使えないの・・・

Dim Test As String = Me.fvwReservation.FindControl("txtEmail").Text

??

最後に、今回は必要ないと思いますが、再帰的な FindControl のバリアントを調査してきましたが、実際にコンパイルできるものは見つかりませんでした。助言がありますか?

1回の投稿にはたくさんあります-事前に感謝します。

無料のコード スニペット:

<asp:FormView ID="fvwReservation" runat="Server" DataSourceID="dsGift">
     <ItemTemplate>
      <asp:Panel runat="server" ID="pnlDetails">
       <h3>Reserve Item: <%#Eval("ShortDesc")%></h3>
       <p>You have chosen to reserve the <em><%#Eval("LongDesc")%></em> gift.</p>
       <p>Please enter your details below to confirm the reservation.</p>
      </asp:Panel>
      <asp:Panel runat="server" ID="pnlConfirm">
       <div class="row">
        <asp:Label runat="server" CssClass="label">Name:</asp:Label><asp:TextBox ID="txtName" MaxLength="50" runat="server" CssClass="Field" />
        <asp:RequiredFieldValidator ID="rfvName" runat="server" ErrorMessage="You must specify your Name" ControlToValidate="txtName" />
       </div>
       <div class="row">
        <asp:Label runat="server" CssClass="label">Email:</asp:Label><asp:TextBox ID="txtEmail" MaxLength="100" runat="server" CssClass="Field"/>
        <asp:RequiredFieldValidator ID="rfvEmail" runat="server" ErrorMessage="You must specify your Email Address" ControlToValidate="txtEmail" />
        <asp:RegularExpressionValidator ID="regexEmail" ValidationExpression="^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$" runat="server" ErrorMessage="Please enter a valid Email Address" ControlToValidate="txtEmail" />
       </div>
       <div class="row">
        <asp:Label runat="server" CssClass="label">Quantity (max <%#Eval("QtyRemaining")%>):</asp:Label><asp:TextBox ID="iQty" MaxLength="2" runat="server" CssClass="Field" />
        <asp:RangeValidator ID="rvQty" runat="server" ErrorMessage="The Quantity mmust be between 1 and 10" MinimumValue="1" MaximumValue="10" ControlToValidate="iQty" />
       </div>
       <div class="row">
        <asp:Label runat="server" CssClass="label">&nbsp;</asp:Label>
        <asp:Button ID="btnReserve" Text="Confirm Reservation" CommandName="Reserve" runat="server" />
       </div>
      </asp:Panel>      
     </ItemTemplate>
    </asp:FormView>
4

3 に答える 3

8

2 番目の質問では、FindControl はジェネリック コントロールを返します。特定の種類のコントロールのプロパティにアクセスするには、特定の種類のコントロールにキャストする必要があります。

次のように、ワンライナーで実行できます。

Dim Test As String = CType(Me.fvwReservation.FindControl("txtEmail"), TextBox).Text

あなたの最初の質問についてですが、それに対する答えも知りたいです。

編集

他のいくつかの StackOverflow 応答 (特にthis oneおよびthis one ) を調べました。FormView テンプレートのコントロールは、テンプレートがアクティブなテンプレートになるまで存在しないため、コード ビハインドで直接参照することはできません。したがって、適切なイベント中に FindControl を使用してコントロールにアクセスする必要があります。

于 2009-10-21T22:14:12.640 に答える
0

FormView コントロール内の要素にアクセスするには、再帰的な FindControl メソッドを使用する必要があります。利用可能な多くの実装があり、そのうちの 1 つを以下にリンクします。

http://www.highoncoding.com/Articles/606_Creating_a_BetterFindControl_and_MuchBetterFindControl.aspx

于 2009-10-22T00:29:18.067 に答える
0

うーん、FormView テンプレートでも、FindControl が確実に機能するとは思いません。通常、ASP.net で生成されたコントロールではなく、HTML でレンダリングされたコントロールでのみ使用します。

テンプレート化されたコントロールがサーバー側のコード (つまり、txtEmail.text) で使用できるはずです。そうでない場合は、テンプレートを再確認してください。

再帰的な FindControl もサーバーにかなりの負担がかかり、信頼性に欠ける可能性があります。

于 2009-10-21T22:36:30.343 に答える