【问题标题】:FindControl Not working if its being called from a different Class如果从不同的类调用 FindControl 则不起作用
【发布时间】:2014-12-16 17:20:51
【问题描述】:

page_Init 上,我正在创建多个UpdatePanels,在这些UpdatePanels 中每个Panel。然后,我使用此面板进一步继续并动态添加其他控件。例如,我在每个面板中添加了 TextBoxes 和 Buttons 的数量。此外,我将单击事件绑定到动态创建的所有按钮。 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

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

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

【问题讨论】:

  • FindControl 在您的代码中是Events 页面实例的方法。此实例不会包含已添加到另一个页面的控件。
  • 感谢伊戈尔的快速响应,我将对此进行挖掘并更新此线程。我明白你的意思。

标签: asp.net vb.net findcontrol


【解决方案1】:

这很清楚为什么它不起作用 - 您正在运行属于您的 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

【讨论】:

  • 我已将过程添加到页面后面的相同代码中,即添加到我从中动态生成按钮的同一类中。尽管如此,它只是让它发挥作用。我想从另一个类创建点击事件的真正原因只是为了保持主页/类后面的代码干净,否则它看起来太杂乱了代码行。我只是一只新的蜜蜂,我一边编码一边学习。有没有更好的方法来设计整个架构?
  • 事实上,我很想告诉你我想要实现的目标,有人可以帮助我就架构应该是什么样子提出建议。目前我看待我设计的东西的方式我猜编码太多了...... :(
  • @ManishRajput 有很多方法可以实现相同的目标。这就是为什么存在模式和反模式的原因。这意味着,程序员开发了两种不太好的通用方法来解决类似问题。对于普通的 ASP.net,好的模式是 MVP [Model-View-Presenter]。看一下这个。 stackoverflow.com/questions/2056/… 看起来你的问题在这里得到了回答。我们知道为什么您不能在不是父级控制的类的实例中使用FindControl,并且您现在也知道如何访问它。结束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2023-03-23
  • 2018-10-12
  • 1970-01-01
相关资源
最近更新 更多