【问题标题】:Dynamically Added Event Handler Not Firing in VB.NET在 VB.NET 中动态添加的事件处理程序未触发
【发布时间】:2020-04-17 02:25:33
【问题描述】:

由于某种原因,当我单击“删除”按钮时,没有任何反应。我假设这与视图状态和在页面加载时丢失处理程序有关,尽管我仍然无法理解它。每次页面加载时我都在重新创建处理程序,为什么这不起作用?

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load

    If IsPostBack Then
        If Not IsNothing(fileUpload.PostedFile) AndAlso fileUpload.PostedFile.ContentLength > 0 Then
            _files = TryCast(Session("FilesToSend"), List(Of document))
            _files.Add(New Document(fileUpload.FileName, fileUpload.FileBytes, fileUpload.FileBytes.Length))
            loadTable()
        End If
    Else
        Session("FilesToSend") = New List(Of document)
    End If

End Sub

Private Sub loadTable()

    Dim count As Integer = 0
    For Each doc In _files
        Dim r As New TableRow()

        'Add Filename Cell
        Dim filenameCell As New TableCell()
        filenameCell.Text = doc.filename
        r.Cells.Add(filenameCell)

        'Add Size Cell
        Dim sizeCell As New TableCell()
        sizeCell.Text = doc.fileSize
        r.Cells.Add(filenameCell)

        'Add Remove Button Cell
        Dim deleteButton As New Button
        Dim deleteCell As New TableCell()
        With deleteButton
            .Text = "Remove"
            '.ID = "deleteButton" + count.ToString()
            deleteCell.Controls.Add(deleteButton)
            AddHandler deleteButton.Click, AddressOf deleteRow_Click
        End With
        r.Cells.Add(deleteCell)
        'AddHandler deleteButton.Click, New EventHandler(AddressOf deleteRow_Click)

        'Add Row to Table
        uploadedDocumentsTable.Rows.Add(r)

        count += 1
    Next
End Sub

Protected Sub deleteRow_Click(sender As Object, e As System.EventArgs)
    _files = TryCast(Session("FilesToSend"), List(Of Document))
    Dim deleteButton = TryCast(sender, Button)
    _files.RemoveAt(sender.ID)
    loadTable()
End Sub

【问题讨论】:

  • 您是否尝试过以下修复:stackoverflow.com/questions/15569857/…
  • 这些不是动态添加到后面的代码中的。话虽如此,我几乎尝试了所有我能找到的东西,但都无济于事。

标签: asp.net vb.net webforms eventhandler


【解决方案1】:

经过多次反复试验,我终于弄明白了。所以第一个问题是我需要添加“.CausesValidation = False”。这触发了回发,但随后我需要重新安排以确保控件仍在加载。这是有效的:

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load

    If IsPostBack Then
        _files = TryCast(Session("FilesToSend"), List(Of Document))
        If Not IsNothing(fileUpload.PostedFile) AndAlso fileUpload.PostedFile.ContentLength > 0 Then
            _files.Add(New Document(fileUpload.FileName, fileUpload.FileBytes, fileUpload.FileBytes.Length))
        End If
    Else
        Session("FilesToSend") = New List(Of document)
    End If
    loadTable()

End Sub

Private Sub loadTable()
    uploadedDocumentsTable.Rows.Clear()
    Dim count As Integer = 0
    For Each doc In _files
        Dim r As New TableRow()

        'Add Filename Cell
        Dim filenameCell As New TableCell()
        filenameCell.Text = doc.filename
        r.Cells.Add(filenameCell)

        'Add Size Cell
        Dim sizeCell As New TableCell()
        sizeCell.Text = doc.fileSize
        r.Cells.Add(filenameCell)

        'Add Remove Button Cell
        Dim deleteButton As New Button
        Dim deleteCell As New TableCell()
        With deleteButton
            .Text = "Remove"
            .CausesValidation = False
            .ID = count.ToString()
            deleteCell.Controls.Add(deleteButton)
            AddHandler deleteButton.Click, AddressOf deleteRow_Click
        End With
        r.Cells.Add(deleteCell)

        'Add Row to Table
        uploadedDocumentsTable.Rows.Add(r)

        count += 1
    Next
End Sub

Protected Sub deleteRow_Click(sender As Object, e As System.EventArgs)
    _files.RemoveAt(sender.ID)
    loadTable()
End Sub

【讨论】:

  • 我建议不要使用 IsNothing 这是一个遗留支持功能。使用 IsIsNot 运算符,例如If fileUpload.PostedFile IsNot Nothing ...。另外,你正在做一个TryCast,然后没有确认它成功了;如果您要继续前进,请执行CType 以便在失败时抛出类型转换异常,而不是稍后抛出更模糊的空引用异常。
【解决方案2】:

您忘记将按钮添加到表单。这样修改:

'Add Remove Button Cell
    Dim deleteButton As New Button
    Dim deleteCell As New TableCell()
    With deleteButton
        .Text = "Remove"
        '.ID = "deleteButton" + count.ToString()
        deleteCell.Controls.Add(deleteButton)
        AddHandler deleteButton.Click, AddressOf deleteRow_Click
    End With
    Me.Controls.Add(deleteButton)

惊喜,您的按钮现在位于位置 (0, 0),并且现在可以监听事件。我猜你可能也想修改它的位置。

玩得开心!

【讨论】:

  • Button 显然正在显示,因为它正在被点击。该代码将Button 添加到单元格中,该单元格添加到行中,该行添加到表中,该表可能已经在页面上。我认为显示Button 不是问题。
  • 再次挫败。我会留下这个,所以没有人再写它了。
猜你喜欢
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 2010-12-04
相关资源
最近更新 更多