문제

나는 간단한 웨딩리스트 응용 프로그램을 개발하고 있습니다. 여기서 손님은 신부와 신랑을 위해 구매하고자하는 현재를 예약 할 수 있습니다. 예비 페이지는 몇 개의 패널 내부에 몇 개의 필드를 감싸고 있으며 모두 Formview 안에 싸여 있습니다.

사용자는 이름, 이메일 및 예약하려는 품목의 수량을 입력하며 페이지는 DB에서 필요한 예약을합니다.

첫 번째 문제는 formview_itemcommand에서 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 변형을 연구하고 있지만 실제로는 실제로 컴파일하는 것을 찾지 못했습니다! 제안이 있습니까?

하나의 게시물에 대한 것이 많습니다. 미리 감사드립니다.

gratuitous 코드 스 니펫 :

<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]+@((\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>
도움이 되었습니까?

해결책

두 번째 질문의 경우 FindControl은 일반 제어를 반환하고 해당 특정 유형의 제어의 속성에 대한 액세스를 얻으려면 특정 유형의 제어에 캐스트해야합니다.

다음과 같이 하나의 라이너로 수행 할 수 있습니다.

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

첫 번째 질문과 관련하여, 나는 그것에 대한 답을 알고 싶습니다.

편집하다

몇 가지 다른 stackoverflow 응답을 살펴 보았습니다 (특히 이 하나 그리고 이 하나). FormView 템플릿의 컨트롤이 템플릿이 활성 템플릿이 될 때까지 존재하지 않으므로 뒤의 코드에서 직접 참조 할 수 없습니다. 따라서 적절한 이벤트 중에 FindControl을 사용하여 컨트롤에 액세스해야합니다.

다른 팁

흠, FormView 템플릿에서도 FindControl이 안정적으로 작동한다고 생각하지 않으며 일반적으로 ASP.NET 생성 된 컨트롤이 아닌 직선 HTML 렌더링 된 컨트롤과 함께 사용할 수 있습니다.

템플릿 컨트롤을 서버 측 코드에서 사용할 수 있어야한다고 확신합니다.

재귀적인 FindControl도 서버에서 세금을 부과하고 잠재적으로 신뢰할 수 없습니다.

FormView 컨트롤 내부의 요소에 액세스하려면 재귀 FindControl 메소드를 사용해야합니다. 사용 가능한 많은 구현이 있으며 그 중 하나는 다음과 같습니다.

http://www.highoncoding.com/articles/606_creating_a_betterfindcontrol_and_muchbetterfindcontrol.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top