使用FindControl:访问窗体视图中的控件

时间:2009-10-21 22:09:33

标签: asp.net formview findcontrol

我正在开发一个简单的婚礼清单应用程序,客人可以预订他们想要为新娘和新郎购买的礼物。 Reserve页面包含几个面板中的几个字段,所有字段都包含在FormView中。

用户输入他们的姓名,电子邮件和他们想要保留的项目数量,页面将在数据库中进行必要的预订。

我的第一个问题是在FormView_ItemCommand中,我无法引用FormView中的任何其他控件....我认为这是FindControl的一个案例 - 但是为什么我需要在Formview时使用Formview从来没有为Lis​​tViews或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 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]+@((\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>

3 个答案:

答案 0 :(得分:8)

对于第二个问题,FindControl返回一个通用Control,并且必须强制转换为特定类型的控件,以便获取对该特定控件类型属性的访问权。

你可以在一个班轮中完成,如下所示:

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

关于你的第一个问题,我也很想知道答案。

修改

查看了一些其他StackOverflow响应(特别是this onethis one)。由于FormView模板中的控件在模板是活动模板之前不存在,因此您无法在后面的代码中直接引用它们。因此,您必须在适当的事件期间使用FindControl来访问控件。

答案 1 :(得分:0)

嗯,即使在FormView模板中,我也不认为FindControl可以正常工作,通常我只会使用直接HTML渲染控件,而不是ASP.net生成的控件。

我很确定模板化控件应该在服务器端代码中可用,(即.txtEmail.text)如果没有,请仔细检查模板

递归的FindControl在服务器上也非常沉重,而且可能不可靠。

答案 2 :(得分:0)

您需要使用递归FindControl方法才能访问FormView控件中的元素。有许多可用的实现,其中一个实现如下:

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