Использование FindControl: доступ к элементам управления в форме просмотра - PullRequest
5 голосов
/ 22 октября 2009

Я разрабатываю простое приложение Wedding List, где гости могут зарезервировать подарок, который они хотят купить, для жениха и невесты. Страница «Резерв» охватывает несколько полей внутри пары панелей, все они заключены в FormView.

Пользователь вводит свое имя, адрес электронной почты и количество товаров, которые он хочет зарезервировать, и страница делает необходимые резервирования в БД.

Моя первая проблема заключалась в том, что в 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, но на самом деле я не нашел тот, который действительно компилируется! Есть предложения?

Это много для одного поста - заранее спасибо.

Бесплатный фрагмент кода:

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

Ответы [ 3 ]

8 голосов
/ 22 октября 2009

Для вашего второго вопроса FindControl возвращает универсальный элемент управления и должен быть приведен к конкретному типу элемента управления, чтобы получить доступ к свойствам этого конкретного типа элемента управления.

Вы можете сделать это в один лайнер, как это:

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

Что касается вашего первого вопроса, я бы тоже хотел узнать ответ на него.

EDIT

Просматривал несколько других ответов StackOverflow (в частности, этот и этот ). Поскольку элементы управления в шаблоне FormView не существуют до тех пор, пока шаблон не станет активным шаблоном, вы не можете напрямую ссылаться на них в приведенном ниже коде. Таким образом, вы должны использовать FindControl во время соответствующего события для доступа к элементам управления.

0 голосов
/ 22 октября 2009

Вам необходимо использовать рекурсивный метод FindControl для доступа к элементам внутри элемента управления FormView. Доступно много реализаций, и одна из них связана ниже:

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

0 голосов
/ 22 октября 2009

Хм, даже в шаблонах FormView я не думаю, что FindControl будет работать надежно, обычно я бы использовал это только с элементами управления, отображаемыми в HTML, а не сгенерированными ASP.net.

Я почти уверен, что шаблонные элементы управления должны быть доступны в коде на стороне сервера (например, txtEmail.text), если нет, дважды проверьте шаблон

Рекурсивный FindControl также довольно обременителен для Сервера и потенциально ненадежен.

...