【问题标题】:Using FindControl: Accessing Controls in a Formview使用 FindControl:在 Formview 中访问控件
【发布时间】:2010-12-08 21:42:18
【问题描述】:

我正在开发一个简单的婚礼清单应用程序,客人可以在其中预订他们想为新娘和新郎购买的礼物。 Reserve 页面在几个面板中封装了一些字段,全部封装在一个 FormView 中。

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

我的第一个问题是在 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 变体,但实际上我还没有找到真正编译的变体!有什么建议吗?

一篇文章内容很多 - 在此先感谢。

免费代码片段:

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

【问题讨论】:

    标签: asp.net formview findcontrol


    【解决方案1】:

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

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

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

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

    编辑

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

    【讨论】:

    • 你看到了吗?!我知道我错过了一些东西……实际上,我确定我以前见过,但没有意识到其中的意义……有一颗金星! (好吧,+1 代表可能就足够了)。
    【解决方案2】:

    嗯,即使在 FormView 模板中,我也不认为 FindControl 会可靠地工作,通常我只会将它与直接 HTML 呈现的控件一起使用,而不是 ASP.net 生成的控件。

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

    递归 FindControl 对服务器来说也很费力,而且可能不可靠。

    【讨论】:

    • 我很欣赏这个建议,但我不知道我可能哪里出错了。给定上面的代码,在FormView_ItemCommand中,两个Panel中的控件都不能直接访问。
    • 这很奇怪,你有没有查看源代码看到控件的名称,很好奇为什么服务器无法识别...我不确定为什么控件不能可以直接访问,如果我没记错的话,FormView 只是单个记录的模板,并且通过将每个控件声明为 asp.net 控件,其行为不应与任何其他声明不同。我承认我从来不需要从代码中的 FormView 中访问......
    【解决方案3】:

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

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

    【讨论】:

    • 我不需要递归 FindControl(正如我在我的 OP 中提到的那样),但无论如何,它对将来的使用很有用。不过,我更喜欢VB版本,但我会尝试翻译这个......
    • 您好,您可以使用任何免费的在线翻译工具:developerfusion.com/tools/convert/csharp-to-vb
    • 虽然在这种情况下我不需要它,但我已经转换了那篇文章中提到的代码,它似乎运行良好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多