动态生成的Linkbutton无法触发VB.Net中的Onclick事件

11

我已经按照一些指示,在运行时创建了一个带有事件触发器的新LinkButton,并为生成的LinkButton添加了一个事件处理程序。我不知道为什么这个新的LinkButton没有触发添加到它上面的事件。请问有人可以指导/纠正我吗?

这是我现在拥有的。

ASPX:

<form id="myForm" runat="server">
 <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

 <asp:UpdatePanel ID="UpdatePanel1" runat="server">

 <ContentTemplate>

 <table class="mel-table" style="text-align: center" runat="server" id="mytab1">

    <tbody>
        <tr>
            <td>Case Number :</td>

            <td>
            <asp:TextBox ID="caseNumber" runat="server"></asp:TextBox>
            </td>

        </tr>

    </tbody>
  </table>

   <asp:Button OnClick="btnOK1_Click" ID="btnOK1" runat="server" Text="Save" />

  </ContentTemplate>

  </asp:UpdatePanel>
 </form>

ASPX.VB:

Protected Overloads Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Session("tablecontent") IsNot Nothing Then
        mytab1 = CType(Session("tablecontent"), HtmlTable)
    End If
End Sub

Public Function checking() As Boolean

        Dim caseNo As Double
            Try
                caseNo = Convert.ToDouble((caseNumber.Text).Trim())
            Catch ex As Exception
            caseNo = 0
            End Try

        Dim r As New HtmlTableRow
        Dim c0 As New HtmlTableCell
        r.Cells.Add(c0)

        Dim but As New LinkButton
        but.ID = caseNo 
        but.Text = caseNo.ToString() 
        AddHandler but.Click, AddressOf LinkButton1_Click
        c0.Controls.Add(but)

        mytab1.Rows.Add(r)
        Session("tablecontent") = mytab1
        Return True
End Function

Protected Sub LinkButton1_Click(sender As Object, e As EventArgs)

    'My Code here

End Sub

Protected Sub btnOK1_Click(sender As Object, e As EventArgs)

    If (checking()) Then

        ScriptManager.RegisterStartupScript(Page, Page.GetType, "Alert", "<script type='text/javascript'>alert('Success');</script>", False)

    End If

End Sub

我并没有说那会解决问题。只是想知道为什么类型与你设置的不同?如果你需要的类型是 Double,那么它应该是这个类型。 - OneFineDay
在“Postback”时,该控件和委托不存在。 - OneFineDay
我在那部分犯了错误。但是你能帮我克服这个问题吗? - Giri Dharan
在页面加载事件中,您必须拥有一个介质来加载它们,可以是数据库、会话变量等,并将它们加载到页面上。这样它就可以继续存在。 - OneFineDay
请确保在每次回传时调用checking()函数,否则动态控件将在屏幕上回传后不可用。 - Sandeep
显示剩余7条评论
2个回答

4
当您点击“保存”按钮时,请将数据保存在本地存储或数据库中,并尝试重新加载页面以用存储中的内容填充页面。这样,您就可以在页面上拥有内容,因此还可以利用事件。

1
每当您创建动态控件时,都必须在 postback 上重新加载它。我正在使用 ReloadRows() 方法重新加载保存在 ViewState 中的已添加情况:

        <asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional" >
            <ContentTemplate>
                <asp:Table class="mel-table" style="text-align: center" runat="server" id="mytab1">
                    <asp:TableRow>
                        <asp:TableCell>Case Number :</asp:TableCell>
                        <asp:TableCell>
                            <asp:TextBox ID="caseNumber" runat="server"></asp:TextBox>
                        </asp:TableCell>
                    </asp:TableRow>
                </asp:Table>
                <asp:Button OnClick="btnOK1_Click" ID="btnOK1" runat="server" Text="Save" />
            </ContentTemplate>
        </asp:UpdatePanel>

--------------------------------------------------------------------------------------------------------

Public Partial Class _Default
    Inherits System.Web.UI.Page

    Private listCaseNo As List(Of Double) = Nothing

    Protected Sub Page_Init(sender As Object, e As EventArgs)

    End Sub


    Protected Sub Page_Load(sender As Object, e As EventArgs)
        If ViewState("ListCases") IsNot Nothing Then
            listCaseNo = DirectCast(ViewState("ListCases"), List(Of Double))
        Else
            listCaseNo = New List(Of Double)()
        End If

        ReloadRows()
    End Sub

    Public Function checking() As Boolean

        Dim caseNo As Double = 0
        Try
            caseNo = Convert.ToDouble((caseNumber.Text).Trim())
        Catch ex As Exception
            caseNo = 0
        End Try

        Dim r As New TableRow()
        Dim c0 As New TableCell()
        r.Cells.Add(c0)

        Dim but As New LinkButton()
        but.ID = Convert.ToString(caseNo)
        but.Text = caseNo.ToString()
        AddHandler but.Click, AddressOf LinkButton1_Click
        c0.Controls.Add(but)

        mytab1.Rows.Add(r)

        listCaseNo.Add(caseNo)

        ViewState("ListCases") = listCaseNo

        Return True
    End Function


    Private Sub ReloadRows()
        For Each objCase As var In listCaseNo
            Dim r As New TableRow()
            Dim c0 As New TableCell()
            r.Cells.Add(c0)

            Dim but As New LinkButton()
            but.ID = Convert.ToString(objCase)
            but.Text = objCase.ToString()
            AddHandler but.Click, AddressOf LinkButton1_Click
            c0.Controls.Add(but)

            mytab1.Rows.Add(r)
        Next
    End Sub

    Protected Sub LinkButton1_Click(sender As Object, e As EventArgs)
        'My Code here

    End Sub


    Protected Sub btnOK1_Click(sender As Object, e As EventArgs)


        If (checking()) Then
        End If

    End Sub

End Class

对于每个objCase,var在listCaseNo中。这里的“var”是什么意思?另外,“ReloadRows()”方法会在面板刷新时向表格添加一行。面板也可能因其他元素的事件而刷新。 - Giri Dharan
@GiriDharan 你可以使用 double 而不是 var。我已经在 C# 中编写了这段代码,然后转换成了 VB。 - Sandeep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接