2009-10-21 11 views
5

Estoy desarrollando una aplicación simple de Lista de bodas, donde los invitados pueden reservar el regalo que desean comprar para la novia y el novio. La página Reservar envuelve unos pocos campos dentro de un par de paneles, todos envueltos dentro de un FormView.Uso de FindControl: Acceso a los controles en una vista de formulario

El usuario introduce su nombre, correo electrónico y la cantidad de elementos que desea reservar, y la página hará las reservas necesarias en la base de datos.

Mi primer problema fue que en FormView_ItemCommand, no pude hacer referencia a ninguno de los otros controles en el FormView ... Supuse que este era un caso para FindControl, pero ¿por qué necesito un Formview cuando lo hago? ¿Nunca lo necesité para ListViews o DetailViews?

En segundo lugar, sé que funciona el siguiente código ..

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

... pero por qué no puedo usar ...

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

??

Finalmente, no creo que lo necesite en esta ocasión, pero he estado buscando variantes recursivas de FindControl, ¡pero en realidad no he encontrado uno que realmente compila! ¿Alguna sugerencia?

Es mucho para una publicación, gracias de antemano.

Gratuitous Fragmento de código:

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

Respuesta

8

a su segunda pregunta, FindControl devuelve un control genérico, y se debe convertir al tipo específico de control con el fin de obtener acceso a las propiedades de ese tipo específico de control de .

Puede hacerlo en un chiste, como esto:

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

En cuanto a su primera pregunta, me gustaría saber la respuesta a eso también.

EDITAR

mirado a través de algunas otras respuestas StackOverflow (específicamente this one y this one). Como los controles en la plantilla FormView no existen hasta que la plantilla sea la plantilla activa, no puede referirse directamente a ellos en el código subyacente. Por lo tanto, debe usar FindControl durante un evento apropiado para acceder a los controles.

+0

Ves ?! Sabía que me estaba perdiendo algo ... en realidad, estoy seguro de haberlo visto antes, pero no me di cuenta del significado ... ¡Ten una estrella de oro! (bien +1 representante podría ser suficiente). – CJM

0

Hmm, incluso en las plantillas de FormView, no creo que FindControl funcione de manera confiable, por lo general solo usaría eso con controles rectos HTML procesados, no generados por ASP.net.

estoy bastante seguro de que los controles de plantilla deben estar disponibles en el código del lado del servidor, (es decir. TxtEmail.text) si no es así, vuelva a comprobar la plantilla

Un FindControl recursivo es también muy exigente en el servidor y potencialmente poco confiable.

+0

Agradezco la sugerencia, pero no sé dónde podría haber ido mal. Dado el código anterior, en FormView_ItemCommand, no se puede acceder directamente a ninguno de los controles en los dos paneles. – CJM

+0

Es extraño, ¿buscó en la fuente para ver el nombre del control, curiosidad por qué el Servidor no podría reconocer ... No estoy seguro de por qué no se puede acceder directamente a los controles, el FormView es simplemente una plantilla para un solo registro si no me equivoco, y al declarar cada control como un control asp.net no debe comportarse de manera diferente a cualquier otra declaración. Admitiré que nunca tuve que acceder desde dentro de un FormView en código ... –

+0

Ahh, acabo de leer la publicación anterior, ¡es bueno saberlo! –

0

Debe utilizar el método FindControl recursivo para acceder a los elementos dentro del control FormView.Hay muchas implementaciones disponibles y uno de ellos está vinculado a continuación:

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

+0

No necesito un FindControl recursivo (como mencioné en mi OP), pero sin embargo, uno sería útil para uso futuro. Sin embargo, preferiría una versión de VB, pero intentaré traducir ésta ... – CJM

+1

Hola, Puede usar cualquiera de las herramientas gratuitas de traducción en línea: http://www.developerfusion.com/tools/ convert/csharp-to-vb/ – azamsharp

+0

Aunque no lo necesitaba en este caso, he convertido el código mencionado en ese artículo y parece funcionar bien. Gracias. – CJM

Cuestiones relacionadas