2009-10-21 11 views
5

Ich entwickle eine einfache Hochzeitsliste-Anwendung, wo Gäste das Geschenk, das sie für das Brautpaar kaufen möchten, reservieren können. Die Reserveseite umschließt einige Felder innerhalb einiger Fenster, die alle in FormView eingeschlossen sind.Verwenden von FindControl: Zugriff auf Steuerelemente in einem Formview

Der Benutzer gibt seinen Namen, seine E-Mail-Adresse und die Anzahl der zu reservierenden Artikel ein, und die Seite nimmt die erforderlichen Reservierungen in der Datenbank vor.

Mein erstes Problem war, dass ich in FormView_ItemCommand konnte keine der anderen Steuerelemente in der FormView referenzieren .... Ich dachte, dies war ein Fall für FindControl - aber warum muss ich für eine Formview, wenn ich ' Nie für ListViews oder DetailViews benötigt?

Zweitens weiß ich, der folgende Code funktioniert ..

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

... aber warum kann ich nicht ...

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

??

Schließlich glaube ich nicht, dass ich es bei dieser Gelegenheit brauche, aber ich recherchiere rekursive FindControl-Varianten, aber ich habe nicht wirklich eine gefunden, die tatsächlich kompiliert! Irgendwelche Vorschläge?

Es ist viel für einen Beitrag - danke im Voraus.

Gratuitous Code Snippet:

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

Antwort

8

Für Ihre zweite Frage, gibt Findcontrol eine allgemeine Kontrolle, und muss auf die spezifische Art der Steuerung, um die Eigenschaften dieser speziellen Art der Steuerung Zugang zu erhalten gegossen werden .

Sie können es in einem Liner man tun, wie folgt aus:

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

Ihre erste Frage betrifft, so würde ich gerne die Antwort darauf, wie gut kennen.

EDIT

Sah durch ein paar andere Antworten Stackoverflow (speziell this one und this one). Da die Steuerelemente in der FormView-Vorlage erst dann vorhanden sind, wenn die Vorlage die aktive Vorlage ist, können Sie im Code dahinter nicht direkt darauf verweisen. Daher müssen Sie FindControl während eines geeigneten Ereignisses verwenden, um auf die Steuerelemente zuzugreifen.

+0

Sie sehen ?! Ich wusste, dass ich etwas verpasst habe ... eigentlich bin ich mir sicher, dass ich das schon vorher gesehen habe, aber ich habe es versäumt, die Bedeutung zu erkennen ... Hab einen goldenen Stern! (gut +1 rep könnte ausreichen). – CJM

0

Hmm, auch in den FormView-Vorlagen glaube ich nicht, dass FindControl zuverlässig funktioniert, normalerweise würde ich das nur mit geraden HTML-gerenderten Steuerelementen verwenden, nicht mit ASP.net-generierten Steuerelementen.

Ich bin mir ziemlich sicher, dass der Templat Steuerelemente in dem Server-Side-Code verfügbar sein sollte (dh. TxtEmail.text), wenn nicht, die doppelten

Eine rekursive Findcontrol ist auch ziemlich anstrengend für die Server-Vorlage prüfen und möglicherweise unzuverlässig.

+0

Ich schätze den Vorschlag, aber ich weiß nicht, wo ich falsch gelaufen sein könnte. Mit dem obigen Code in FormView_ItemCommand kann auf keine der Steuerelemente in den beiden Panels direkt zugegriffen werden. – CJM

+0

Das ist seltsam, haben Sie in die Quelle schauen, um den Namen des Steuerelements zu sehen, neugierig, warum der Server nicht in der Lage wäre zu erkennen ... Ich bin mir nicht sicher, warum die Steuerelemente nicht direkt zugegriffen werden kann FormView ist einfach eine Vorlage für einen einzelnen Datensatz, wenn ich mich nicht irre, und indem ich jedes Steuerelement als asp.net-Steuerelement deklariere sollte sich nicht anders als jede andere Deklaration verhalten. Ich gebe zu, ich musste nie innerhalb eines FormView in Code zugreifen, obwohl ... –

+0

Ahh, lesen Sie den obigen Beitrag - gut zu wissen! –

0

Sie müssen rekursive FindControl-Methode verwenden, um auf die Elemente innerhalb des FormView-Steuerelements zuzugreifen.Es gibt viele Implementierungen und einer von ihnen ist mit unter:

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

+0

Ich brauche kein rekursives FindControl (wie ich in meinem OP erwähnt habe), aber trotzdem wäre es nützlich für zukünftige Verwendung. Allerdings würde ich eine VB-Version bevorzugen, aber ich werde versuchen, diese zu übersetzen ... – CJM

+1

Hallo, Sie können eines der kostenlosen Online-Übersetzer-Tools verwenden: http://www.developerfusion.com/tools/ convert/csharp-to-vb/ – azamsharp

+0

Obwohl ich es in diesem Fall nicht benötigt habe, habe ich den in diesem Artikel erwähnten Code konvertiert und es scheint gut zu funktionieren. Vielen Dank. – CJM