2009-10-21 14 views
5

Gelin ve damat için satın almak istedikleri hediyeleri rezerve edebileceğiniz basit bir Düğün Listesi uygulaması geliştiriyorum. Reserve sayfası, tüm FormView içine sarılmış birkaç panelin içinde birkaç alan sarar.FindControl'ü Kullanma: Bir Form Görünümünde Kontrollere Erişme

Kullanıcı, adını, e-postasını ve rezerve etmek istedikleri öğelerin miktarını girer ve sayfa DB'de gerekli rezervasyonları yapar.

FormView_ItemCommand'taki ilk sorunum, FormView'daki diğer denetimlerden herhangi birine başvurabiliyordum .... Bunu FindControl için bir durum olduğunu düşündüm - ancak neden bir Form Görünümü için ihtiyacım olduğunda ve ListViews veya DetailViews için hiç gerek yoktu?

İkincisi, ben ...

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

... ama neden kullanamıyorum .. Aşağıdaki kod çalışır

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

biliyorum ??

Son olarak, bu vesileyle buna ihtiyacım olduğunu düşünmüyorum, ama özyinelemeli FindControl varyantlarını araştırıyorum, ama aslında bir derleme bulamadım! Baska öneri?

Bir gönderi için çok fazla - şimdiden teşekkürler.

Nedensiz Kod Parçacığı: İkinci soru için

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

cevap

8

, FindControl jenerik Kontrol döndürür ve kontrolün belirli tip özelliklerine erişim elde etmek için kontrolün belirli tür atama olmalıdır .

Sen böyle bir tek poşetine yapabilirsiniz:

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

ilk soru ile ilgili olarak, bunun da cevabını bilmek isteriz. DÜZENLEME

birkaç StackOverflow tepkiler (özellikle this one ve this one) içinden görünüyordu. FormView şablonundaki denetimler, şablon etkin şablon olana kadar mevcut olmadığından, doğrudan arkadaki kodda bunlara başvuramazsınız. Böylece, denetimlere erişmek için uygun bir olay sırasında FindControl kullanmanız gerekir.

+0

?! Bir şeyi özlediğimi biliyordum .... aslında, eminim bunu daha önce de görmüştüm, ama önemini fark edemedim ... Altın bir yıldız al! (iyi +1 temsilcisi yeterli olabilir). – CJM

0

Hmm, FormView şablonlarında bile, FindControl'ün güvenilir bir şekilde çalışacağını düşünmüyorum, tipik olarak yalnızca ASP.NET tarafından oluşturulanlar değil, yalnızca HTML işlenmiş denetimlerle kullanacağım.

ben değilse, bir özyinelemeli FindControl da Server üzerinde oldukça vergi olduğunu şablonu

tekrar kontrol templated kontroller Sunucu tarafı kodu (yani. TxtEmail.text) kullanılabilir olmalıdır eminim ve potansiyel olarak güvenilmez.

+0

Öneriyi takdir ediyorum ama nerede yanlış gittiğimi bilmiyorum. Yukarıdaki kod verildiğinde, FormView_ItemCommand'da, iki Paneldeki denetimlerin hiçbirine doğrudan erişilemez. – CJM

+0

Bu garip, kontrolün adını görmek için kaynağa baktınız mı, meraklı neden Sunucu tanımak mümkün değil ... Denetimlerin neden doğrudan erişilemediğinden emin değilim. FormView, yanlış değilse tek bir kayıt için bir şablondur ve her kontrolün bir asp.net denetimi olarak bildirilmesiyle diğer bildirimlerden farklı davranmaması gerekir. Asla bir FormView kodu içinden erişmek zorunda kalmamışım itiraf etmeliyim ... –

+0

Ahh, sadece yukarıdaki yazıyı okuyun - bilmek güzel! –

0

FormView denetimi içindeki öğelere erişmek için yinelenen FindControl yöntemini kullanmanız gerekir.Birçok uygulamalar mevcuttur ve bunlardan biri aşağıda bağlanmıştır: Görüyorsunuz

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

+0

Özyinelemeli bir FindControl'e (OP'mde belirttiğim gibi) ihtiyacım yok, ama yine de, bir sonraki kullanım için yararlı olacaktır. Ancak, bir VB sürümünü tercih ederim, ancak bunu çevirmeyi deneyeceğim ... – CJM

+1

Merhaba, Ücretsiz çevirmen araçlarından herhangi birini kullanabilirsiniz: http://www.developerfusion.com/tools/ convert/csharp-to-vb/ – azamsharp

+0

Bu durumda buna ihtiyacım olmasa da, o makalede bahsedilen kodu dönüştürdüm ve iyi çalışıyor gibi görünüyor. Teşekkürler. – CJM

İlgili konular