asp.net - FindControl 如果从不同的类调用则不起作用

标签 asp.net vb.net findcontrol

page_Init 上,我创建了许多 UpdatePanel,并在这些 UpdatePanel 中创建了一个 Panel 。然后,我使用此面板进一步动态添加其他控件。例如,我在每个面板中添加了一些 TextBoxeButton 。此外,我将单击事件绑定(bind)到动态创建的所有按钮。这些点击事件的 AddressOf 位于另一个名为 Events 的类中。在 Event 类的 Sub 中,当我尝试查找控件时,它似乎不起作用。

这是 EVENT 类中的代码

Public Class Events
Inherits System.Web.UI.Page

    Public Sub Dynamic_Btn_Click(ByVal sender As Object, ByVal e As EventArgs)
        Dim SQL As New SQLControl

        Dim sTempPanel1 As UpdatePanel = FindControl("MyUpdatePanel1")
        MsgBox("MyUpdatePanel1" & ":" & (sTempPanel1 Is Nothing))

    End Sub
End Class

注意:如果将上述相同的子代码复制/粘贴到页面类的代码后面,则它可以工作。

我知道我在这里缺少一些链接。可能是 FindControl 没有被引用到应在其中搜索的页面。

最佳答案

这很清楚为什么它不起作用 - 您正在运行属于您的 Events 类的 FindControl。但按钮不在 Event 类上。为什么你选择这样的架构 - 这是不同的问题。

要获取按钮所在的面板,您可以调用

Dim b as Button = DirectCast(sender, Button)
Dim p as UpdatePanel = = DirectCast(b.Parent, UpdatePanel)

还请记住这一点:[FindControl] 方法仅搜索页面的直接容器或顶级容器;它不会递归搜索页面上包含的命名容器中的控件。

但是如果你确实不知道控件的确切位置,你可以编写递归函数来找到它

如果你知道你有

-- Page
   -- UpdatePanel
      -- Panel
         -- Button

您可以硬编码

button.Parent.Parent ' <-- this is your update panel

关于asp.net - FindControl 如果从不同的类调用则不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27510322/

相关文章:

c# - 在devexpress gridview Templates DetailRow中查找控件

c# - (403) 调用生成文件的控制台应用程序时被禁止

c# - 如何根据用户身份验证隐藏菜单项

c# - 如何使用 Microsoft fakes 填充在测试函数中多次调用的类

c - MSB6003 : The specified task executable "CL.exe" could not be run

c# - 从容器中查找动态添加的控件

javascript - 将 JSON 从文本字段解析为对象数组

VB.NET - 背景像 UAC 消息一样淡化?

vb.net - EmguCV Application Get 发生错误时崩溃 "Attempted Read or Write Protected Memory. This is Often Indication that Other Memory Is Corrupt"

c# - 从页面基类查找页面中的控件