我正在使用FindControl函数在页面上查找控件。它似乎在MSDN上超级简单直接但我无法让它找到控件。我正在使用的页面有一个MasterPageFile,它更多地包含了我在aspx文件中给出contorl的id。一个不起作用的简单示例:
aspx页面
<%@ Page Title="Inventory Control Test" Language="VB" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeFile="Default2.aspx.vb" Inherits="Sales_ajaxTest_Default2" %>
<asp:Content ID="conHead" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="conBody" ContentPlaceHolderID="MainBody" Runat="Server">
<asp:Button ID="saveAllBtn" runat="server" Text="Save All" />
</asp:Content>
背后的代码
Partial Class Sales_ajaxTest_Default2
Inherits System.Web.UI.Page
Protected Sub saveAllBtn_Click(sender As Object, e As System.EventArgs) Handles saveAllBtn.Click
Dim myControl1 As Control = FindControl("ctl00_MainBody_saveAllBtn")
If (Not myControl1 Is Nothing) Then
MsgBox("Control ID is : " & myControl1.ID)
Else
'Response.Write("Control not found.....")
MsgBox("Control not found.....")
End If
End Sub
结束班
我知道msgbox不是一个web事物,我只是在这个例子中使用它。 如果我使用“saveAllBtn”,这是给控件的id,在FindControl中我得到“控件未找到”。如果我试试这个,在没有母版页的独立页面上工作正常。
如果我使用chrome检查元素,我发现按钮的ID已更改为“ctl00_MainBody_saveAllBtn”,但如果我在FindControl中使用它,我仍然会“找不到控件”
答案 0 :(得分:7)
当您使用FindControl时,您将指定控件的“服务器ID”(您将其命名为),而不是控件的最终呈现“客户端ID”。例如:
Dim myControl as Control = MainBody.FindControl("saveAllBtn")
但是,在您的具体示例中,由于您处于saveAllBtn.Click
事件中,因此您要查找的控件实际上是sender
参数(因为您单击该按钮以触发事件in)ex:
Dim myControl as Button = CType(sender, Button)
答案 1 :(得分:4)
如果你只是想找到saveAllBtn
控件,wweicker的第二种方法using CType(sender, Button)
是首选方法。
但是,如果您想按名称查找其他控件,则不能仅使用FindControl
。您需要递归地找到控件,因为它嵌套在其他控件中。
这是辅助方法 -
Protected Sub saveAllBtn_Click(sender As Object, e As EventArgs)
Dim button = TryCast(FindControlRecursive(Me.Page, "saveAllBtn"), Button)
End Sub
Public Shared Function FindControlRecursive(root As Control, id As String) As Control
If root.ID = id Then
Return root
End If
Return root.Controls.Cast(Of Control)().[Select](Function(c) FindControlRecursive(c, id)).FirstOrDefault(Function(c) c IsNot Nothing)
End Function
注意:我的VB代码可能有点奇怪,因为我在C#中编写并使用converter转换为VB。
答案 2 :(得分:1)
FindControl无法递归工作。您必须从一个点(例如Me)开始,如果这不是您要查找的控件,请搜索起点的Controls集合。等等。