You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET ASPX运行时为动态创建的Div添加脚本无法触发问题

问题根因与解决方案

核心错误

你的实现逻辑完全不符合ASP.NET Web Forms的服务端控件生命周期与事件绑定规则,这是事件无法触发的根本原因。

具体错误点

  • 动态生成<script runat="server">块完全无效:ASP.NET仅会在页面首次编译阶段解析处理服务端脚本,运行时动态插入的这类脚本、以及你存到静态文件里引用的VB代码,都不会被服务端引擎编译执行。
  • 控件属性设置错误:ID、OnClick、runat、DescriptionUrl这些都是控件本身的属性,你全部错误添加到了Style集合里,这些属性根本不会生效。
  • 事件绑定逻辑错误:动态生成的服务端控件不需要为每个控件单独生成Click方法,直接绑定通用处理方法,通过Command参数传递业务值即可,你生成独立方法的逻辑没有可执行性。
  • 循环逻辑错误:你用了双层循环遍历数据行,For Each row里嵌套了For i = 0 to 行数-1,会导致每条记录被重复生成n次,属于冗余逻辑。
  • 控件生命周期缺失:动态创建的服务端控件必须在每次页面回发时重新创建,否则回发后控件丢失,事件自然无法触发。

修正方案

第一步:删除冗余代码

删掉所有生成vbs文件、动态创建script标签的相关代码,这部分逻辑完全不需要。

第二步:修正动态控件创建与事件绑定逻辑

' 首先定义通用的ImageButton点击事件处理方法
Protected Sub MyIMG_Click(sender As Object, e As ImageClickEventArgs)
    Dim btn As ImageButton = CType(sender, ImageButton)
    Dim JobName As String = btn.DescriptionUrl
    Dim JobID As String = btn.CommandName
    Response.Redirect(String.Format("~/476.aspx?JobName={0}&JobID={1}", JobName, JobID))
End Sub

Sub ThumbView()
    lbl_Status.Text = "ThumbView"
    ListPanel.Visible = False
    Dim MyTable As String = "[Estimate_Info4]"
    Dim Sql As String = "SELECT * FROM [Estimate_Info4]"
    Dim dbConnection = New SqlConnection(connString)
    Dim dbCommand = New SqlCommand(Sql, dbConnection)
    Dim data As New SqlDataAdapter(dbCommand)
    Dim table As New DataTable(MyTable)
    dbConnection.Open()
    data.Fill(table)
    ' 删掉外层的For Each,只保留一层循环
    For i As Integer = 0 To (table.Rows.Count - 1)
        Try
            Dim row As DataRow = table.Rows(i)
            Dim NumberName As String = CStr(row("EstNumber")) & " " & CStr(row("JobName"))
            Dim CleanName As String = RemoveWhitespace(NumberName)
            Dim RecID As Integer = CInt(row("Id"))
            Dim RecID2 As String = CStr(row("Id"))
            
            ' 其余div、label等创建逻辑保留,这里只列ImageButton的修正部分
            Dim MyIMG As ImageButton = New ImageButton()
            ' 注意:属性直接赋值,不要加到Style里
            MyIMG.ID = CleanName
            MyIMG.DescriptionUrl = NumberName
            MyIMG.CommandName = RecID2
            MyIMG.CssClass = "inner"
            MyIMG.ImageUrl = "~/Images/BLDG1.jpg"
            ' 绑定通用点击事件
            AddHandler MyIMG.Click, AddressOf MyIMG_Click
            
            ' 其余控件添加逻辑不变
            ' ..... 省略你原来的div、label创建添加代码 .....
        Catch ex As Exception
            ' 注意:服务端不要用MsgBox,会弹出在服务器上,用户看不到
            ' 可以改为存到lbl_Status显示错误
            lbl_Status.Text = "遇到错误:" & ex.Message
        End Try
    Next
    Panel1.Style.Add("Height", "800px")
    Panel1.Style.Add("width", "1800px")
    Panel1.Style.Add("overflow", "scroll")
    Panel1.Style.Add("overflow-y", "Scroll")
    Panel1.Style.Add("overflow-x", "scroll")
    Panel1.Visible = True
End Sub

第三步:修正页面调用逻辑

在Page_Load方法中调用ThumbView,每次页面加载(包括回发)都要执行,保证动态控件可以被重新创建,事件正常绑定:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        ' 首次加载的其他逻辑
    End If
    ' 每次加载都要执行,动态创建控件
    ThumbView()
End Sub

内容的提问来源于stack exchange,提问作者Mark Tarver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:09:02