2009-10-21 22 views
5

Tôi đang phát triển một ứng dụng Danh sách Đám cưới đơn giản, nơi khách có thể đặt trước món quà họ muốn mua cho cô dâu và chú rể. Trang Dự trữ bao bọc một vài trường bên trong một vài bảng, tất cả được bao bên trong một FormView.Sử dụng FindControl: Truy cập Điều khiển trong Formview

Người dùng nhập tên, email và số lượng mặt hàng họ muốn đặt trước và trang sẽ thực hiện các đặt chỗ cần thiết trong DB.

Vấn đề đầu tiên của tôi là trong FormView_ItemCommand, tôi không thể tham chiếu bất kỳ điều khiển nào khác trong FormView .... Tôi đã nhận ra đây là trường hợp cho FindControl - nhưng tại sao tôi cần cho Formview khi tôi ' đã không bao giờ cần nó cho ListViews hoặc DetailViews?

Thứ hai, tôi biết đoạn mã sau công trình ..

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

... nhưng tại sao tôi không thể sử dụng ...

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

??

Cuối cùng, tôi không nghĩ rằng tôi cần nó vào dịp này, nhưng tôi đã nghiên cứu các biến thể FindControl đệ quy, nhưng tôi đã không thực sự tìm thấy một trong đó thực sự biên dịch! Bất kỳ đề xuất?

Rất nhiều cho một bài đăng - cảm ơn trước.

Cho không Đoạn Mã:

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

Trả lời

8

Đối với câu hỏi thứ hai của bạn, FindControl trả về một điều chung chung, và phải được biến đổi thành kiểu cụ thể của kiểm soát để có được quyền truy cập vào các tính chất của loại cụ thể của kiểm soát .

Bạn có thể làm điều đó trong một liner, như thế này:

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

Về câu hỏi đầu tiên của bạn, tôi rất thích biết câu trả lời cho điều đó.

EDIT

Nhìn qua một vài phản ứng StackOverflow khác (cụ thể là this onethis one). Vì các điều khiển trong mẫu FormView không tồn tại cho đến khi mẫu là mẫu đang hoạt động, bạn không thể trực tiếp tham chiếu đến chúng trong mã phía sau. Vì vậy, bạn phải sử dụng FindControl trong một sự kiện thích hợp để truy cập các điều khiển.

+0

Bạn thấy sao ?! Tôi biết tôi đã thiếu một cái gì đó .... thực sự, tôi chắc chắn rằng tôi đã nhìn thấy điều đó trước đây, nhưng không nhận ra ý nghĩa ... Có một ngôi sao vàng! (cũng 1 đại diện có thể phải đủ). – CJM

0

Hmm, ngay cả trong các mẫu FormView, tôi không nghĩ rằng FindControl sẽ hoạt động đáng tin cậy, thông thường tôi sẽ chỉ sử dụng điều đó với các điều khiển kết xuất HTML thẳng, chứ không phải ASP.net được tạo ra.

Tôi khá chắc chắn rằng các điều khiển templated nên có sẵn trong mã Server side, (tức. TxtEmail.text) nếu không, hãy kiểm tra các mẫu

Một FindControl đệ quy cũng là đánh thuế khá trên Server và có khả năng không đáng tin cậy.

+0

Tôi đánh giá cao đề xuất này, nhưng tôi không biết tôi có thể đã đi sai ở đâu. Với đoạn mã trên, trong FormView_ItemCommand, không có điều khiển nào trong hai Panels có thể được truy cập trực tiếp. – CJM

+0

Thật lạ lùng, bạn đã nhìn vào nguồn để xem tên của điều khiển, tò mò tại sao Máy chủ không thể nhận ra ... Tôi không chắc tại sao các điều khiển không thể truy cập trực tiếp, FormView đơn giản chỉ là một mẫu cho một bản ghi duy nhất nếu tôi không nhầm lẫn, và bằng cách tuyên bố mỗi điều khiển dưới dạng điều khiển asp.net sẽ không hoạt động khác với bất kỳ khai báo nào khác. Tôi sẽ thừa nhận tôi không bao giờ phải truy cập từ bên trong một FormView trong mã mặc dù ... –

+0

Ahh, chỉ cần đọc bài viết trên - tốt để biết! –

0

Bạn cần sử dụng phương thức FindControl đệ quy để truy cập các phần tử bên trong điều khiển FormView.Có nhiều triển khai có sẵn và một trong số chúng được liên kết bên dưới:

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

+0

Tôi không cần một FindControl đệ quy (như tôi đã đề cập trong OP của tôi), nhưng tuy nhiên, một sẽ hữu ích để sử dụng trong tương lai. Tuy nhiên, tôi thích một phiên bản VB, nhưng tôi sẽ cố gắng dịch một phiên bản này ... – CJM

+1

Xin chào, Bạn có thể sử dụng bất kỳ công cụ dịch trực tuyến miễn phí nào: http://www.developerfusion.com/tools/ convert/csharp-to-vb/ – azamsharp

+0

Mặc dù tôi không cần nó trong trường hợp này, tôi đã chuyển đổi mã được đề cập trong bài viết đó và nó có vẻ hoạt động tốt. Cảm ơn. – CJM