在VB.NET中动态添加未激发的事件处理程序



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

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

经过更多的尝试和错误,我终于明白了。所以第一个问题是我需要添加".CausesValidation=False"。这触发了Postback,但随后我需要进行一些重新排列,以确保控件仍在加载中。以下是行之有效的方法:

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

您忘记将按钮添加到表单中。按以下方式修改:

'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(,事件现在被监听。我想你可能也想修改它的位置。

玩得开心!

最新更新