【问题标题】:find control on page using vb.net使用 vb.net 在页面上查找控件
【发布时间】:2013-07-03 16:52:48
【问题描述】:

我正在使用 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 不是一个网络东西,我只是在这个例子中使用它。 如果我使用“saveAllBtn”,这是给控件的 id,在 FindControl 中我会得到“找不到控件”。如果我尝试这个,在没有母版页的独立页面上它可以正常工作。

如果我使用 chrome 检查元素,我发现按钮的 ID 已更改为“ctl00_MainBody_saveAllBtn”,但如果我在 FindControl 中使用它,我仍然会收到“找不到控件”

【问题讨论】:

  • 可能是this 阅读可能会有所帮助.. 它是在 c# 中完成的。

标签: asp.net vb.net


【解决方案1】:

当您使用 FindControl 时,您将指定控件的“服务器 ID”(您命名它的名称),而不是控件最终呈现的“客户端 ID”。例如:

Dim myControl as Control = MainBody.FindControl("saveAllBtn")

但是,在您的具体示例中,由于您处于 saveAllBtn.Click 事件中,因此您要查找的控件实际上是 sender 参数(因为您单击了该按钮以触发您所在的事件)例如:

Dim myControl as Button = CType(sender, Button)

【讨论】:

  • 是的,您对发件人的看法是正确的,这是我使用不良示例的错'我真的很想做。如果我使用 MainBody.FindControl 视觉工作室说 MainBody 没有声明。但是我可以将我需要的控件包装在带有 runat 服务器的 div 中,并使用相同的想法访问它。 divID.findcontrol 有效。谢谢
【解决方案2】:

如果你只想找到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。

【讨论】:

  • 递归函数总是很有趣,我会试试这个。感谢您指出我不能只使用 findcontrol(IdName)
【解决方案3】:

FindControl 不能递归工作。您必须从某一点开始(例如我),如果这不是您要查找的控件,请搜索您的起点的 Controls 集合。等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多