2009-10-21 3 views
5

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

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

Моя первая проблема заключалась в том, что в 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][email protected]((\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> 

ответ

8

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

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

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

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

EDIT

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

+0

Вы видите ?! Я знал, что у меня что-то не хватает ... на самом деле, я уверен, что видел это раньше, но не осознал значения ... Имею золотую звезду! (может быть, должно хватить +1 репутации). – CJM

0

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

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

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

+0

Я ценю это предложение, но не знаю, где бы я ошибся. Учитывая код выше, в FormView_ItemCommand, ни один из элементов управления в двух панелях не доступен напрямую. – CJM

+0

Это странно, вы заглянули в источник, чтобы увидеть имя элемента управления, любопытно, почему сервер не сможет распознать ... Я не уверен, почему к элементам управления невозможно получить доступ напрямую, FormView - это просто шаблон для одной записи, если я не ошибаюсь, и объявляя каждый элемент управления как элемент управления asp.net, должен вести себя не так, как любая другая декларация. Я признаю, что мне никогда не приходилось обращаться из FormView в коде, хотя ... –

+0

Ах, просто прочитайте вышеприведенное сообщение - хорошо знать! –

0

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

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

+0

Мне не нужен рекурсивный FindControl (как я упоминал в своем OP), но тем не менее, он был бы полезен для будущего использования. Тем не менее, я бы предпочел версию VB, но я попытаюсь перевести этот ... – CJM

+1

Hi, Вы можете использовать любой бесплатный инструмент онлайн-переводчика: http://www.developerfusion.com/tools/ convert/csharp-to-vb/ – azamsharp

+0

Хотя я не нуждался в этом в этом случае, я переработал код, упомянутый в этой статье, и, похоже, он работает хорошо. Благодарю. – CJM

Смежные вопросы