如何使用AddHandler AddressOf

时间:2019-04-15 09:48:31

标签: asp.net vb.net

我正在使用Visual Studio VB.NET开发Web应用程序。我有一个带有两个面板的Web表单。我有以下代码:

Protected Sub WebForm2_load(sender As Object, e As EventArgs) Handles Me.Load
    Dim y As Integer = 1
    Protected cr(100) As Button 

    If con.State = ConnectionState.Open Then
        con.Close()
    End If
    con.Open()
    Dim requ As String
    requ = "SELECT DISTINCT ENSEIGNEMENTS.Code_Mat From ENSEIGNANT INNER Join ENSEIGNEMENTS On ENSEIGNANT.Code_Ens = ENSEIGNEMENTS.Code_Ens where NomUser='" + un + "' and Sem='S1'"
    cmd = New SqlCommand(requ, con)
    Dim rd As SqlDataReader = cmd.ExecuteReader()
    While rd.Read()
        cr(y) = New Button
        cr(y).Text = rd("Code_Mat").ToString
        cr(y).ID = "btn" & y.ToString
        Panel1.Controls.Add(cr(y))
        AddHandler cr(y).Click, AddressOf btnc
        y = y + 1
    End While 
End Sub

Protected Sub btnc(ByVal sender As Object, ByVal e As System.EventArgs)
    Protected cr1(100) As Button 
    If con.State = ConnectionState.Open Then
        con.Close()
    End If
    con.Open()
    Dim btn As Button()
    Dim x As Integer = 1

    Dim requete As String
    cdmat = CType(sender, Button).Text
    'Response.Redirect("TestGroupes.aspx")
    requete = "SELECT ENSEIGNEMENTS.Gr FROM ENSEIGNANT INNER JOIN ENSEIGNEMENTS ON ENSEIGNANT.Code_Ens = ENSEIGNEMENTS.Code_Ens WHERE (((ENSEIGNEMENTS.Code_Mat)='" + cdmat + "') AND ((ENSEIGNANT.[NomUser])='" + un + "') AND ((ENSEIGNEMENTS.[Sem])='S1'))"
    Dim commande As New SqlCommand
    commande = New SqlCommand(requete, con)
    Dim reader As SqlDataReader = commande.ExecuteReader()
    While reader.Read()
        cr1(x) = New Button()
        cr1(x).Text = reader("Gr").ToString
        cr1(x).ID = "bt" & x.ToString
        Panel2.Controls.Add(cr1(x))
        AddHandler cr1(x).Click, AddressOf Groupe
        x = x + 1
    End While
End Sub

Protected Sub Groupe(sender As Object, e As EventArgs)
    MsgBox("hhhhh")
End Sub

我的问题是AddHandler cr(y).Click, AdressOf btncWenForm2_load可以正常工作,但是AddHandler cr1(x).Click, AdressOf Groupe却不能:当我在Panel2中单击一个按钮时,什么也没发生。

1 个答案:

答案 0 :(得分:1)

您始终创建主按钮(Code_Mat),但是在回发时也需要重新创建辅助按钮(Gr),因此您需要保存用于创建那些辅助按钮的变量

作为演示,我创建了一个名为“ testing”的新Web窗体项目,其页面名为“ index.aspx”:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="index.aspx.vb" Inherits="testing.index" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Panel ID="Panel1" runat="server"></asp:Panel>
            <asp:Panel ID="Panel2" runat="server"></asp:Panel>
        </div>
        <asp:Literal id="msg" runat="server">msg</asp:Literal>
    </form>
</body>
</html>

使用以下代码:

Public Class index
    Inherits System.Web.UI.Page

    Sub Groupe(sender As Object, e As EventArgs)
        Dim bn = DirectCast(sender, Button)
        msg.Text = bn.CommandArgument

    End Sub

    Sub CreateSecondaryButtonsHelper(codeMat As String)
        Panel2.Controls.Clear()
        For i = 1 To 3
            Dim bn As New Button With {.Text = "Gr" & i & codeMat, .ID = "bnB" & i, .CommandArgument = "Hello from " & codeMat & i}
            AddHandler bn.Click, AddressOf Groupe
            Panel2.Controls.Add(bn)
        Next

    End Sub

    Sub CreateSecondaryButtons(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim clickedButton = DirectCast(sender, Button)
        CreateSecondaryButtonsHelper(clickedButton.Text)

        Session("CodeMat") = clickedButton.Text

    End Sub

    Sub CreateMainButtons()
        For i = 1 To 3
            Dim bn As New Button With {.Text = "CodeMat" & i, .ID = "bnA" & i}
            AddHandler bn.Click, AddressOf CreateSecondaryButtons
            Panel1.Controls.Add(bn)
        Next

        If Session("CodeMat") IsNot Nothing Then
            CreateSecondaryButtonsHelper(CStr(Session("CodeMat")))
        End If

    End Sub

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

    End Sub

End Class

这很乏味,但我认为它表明了您想要做什么。


每次使用它时,都应该创建一个新的SqlConnection,并在使用完毕后立即对其调用.Dispose()。另外,使用SQL参数传递值而不是使用它们来组成字符串将使它更可靠并避免SQL注入攻击。