动态创建的按钮不会在回发时调用函数

时间:2013-04-24 14:27:43

标签: asp.net vb.net vba postback

在我的visual basic web应用程序中,我有一个生成按钮的列表,这些按钮应该允许在点击时下载文件。

我让这个例子在pageload上使用生成的按钮,但突然下载函数停止在回发后调用,现在所有按钮点击(对于任何按钮)都会导致页面回发。

我的代码:

Public folder As String
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        folder = "Main"
        PopulateFiles(folder)
    End If
End Sub

Protected Sub PopulateFiles(ByVal folder As String)
    Dim myConnection As SqlConnection
    Dim conString As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
    Dim myCommand As SqlCommand
    Dim myDataReader As SqlDataReader
    Dim text As String
    Dim size As Decimal
    Dim name As String
    Dim type As String
    Dim id As Integer
    folderName.Text = folder
    container.Controls.Clear()
    myConnection = New SqlConnection(conString)
    myConnection.Open()
    myCommand = New SqlCommand("Uploads_GetAllFiles", myConnection)
    myCommand.CommandType = CommandType.StoredProcedure
    myCommand.Parameters.AddWithValue("@folder", folder)
    Try
        myDataReader = myCommand.ExecuteReader()
        If myDataReader.HasRows Then
            Do While myDataReader.Read()
                name = myDataReader.Item("Name")
                type = myDataReader.Item("Type")
                id = myDataReader.Item("File_ID")
                size = Math.Round(myDataReader.Item("Size") / 1000, 2)
                container.Controls.Add(New LiteralControl("<div class='newRow'>"))
                text = "<div class='fileName'>" & name & "</div>"
                container.Controls.Add(New LiteralControl(text))
                text = "<div class='fileType'>" & type & "</div>"
                container.Controls.Add(New LiteralControl(text))
                text = "<div class='fileSize'>" & size.ToString() & "kb</div>"
                container.Controls.Add(New LiteralControl(text))
                container.Controls.Add(New LiteralControl("<div class='fileDownload'>"))
                Dim newBtn As New Button
                newBtn.ID = "link" & id
                newBtn.Text = "Download"
                newBtn.CssClass = "newbie"
                AddHandler newBtn.Click, AddressOf Retreive_Doc
                newBtn.CommandArgument = id
                container.Controls.Add(newBtn)
                container.Controls.Add(New LiteralControl("</div>"))
                container.Controls.Add(New LiteralControl("<div class='fileDelete'>"))
                Dim newDelBtn As New Button
                newDelBtn.ID = "delete" & id
                newDelBtn.Text = "Delete"
                newDelBtn.CssClass = "delBtn"
                AddHandler newDelBtn.Click, AddressOf Retreive_Xls
                newDelBtn.CommandArgument = id
                container.Controls.Add(newDelBtn)
                container.Controls.Add(New LiteralControl("</div>"))
                container.Controls.Add(New LiteralControl("</div>"))
            Loop
        End If

    Catch ex As Exception
        MsgBox(ex.ToString())
    Finally
        myConnection.Close()
    End Try
End Sub

Protected Sub Retreive_Doc(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
    Dim button As Button = sender
    Dim id As Integer = button.CommandArgument
    Dim cmd As SqlCommand = New SqlCommand("Uploads_GetFile")
    cmd.CommandType = CommandType.StoredProcedure
    cmd.Parameters.AddWithValue("@id", id)
    Dim dt As DataTable = GetData(cmd)
    If dt IsNot Nothing Then
        download(dt)
    End If
End Sub

我可以显示从这个函数调用的函数,但是初始函数甚至没有被调用,所以我不确定是否有一点。

我的HTML如下:

<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:FileUpload ID="upload1" runat="server" /><asp:Button ID="test1" runat="server" Text="Upload" />
<asp:TextBox ID="folderTag" runat="server" ></asp:TextBox>
<asp:Button ID="search" runat="server" Text="Search" />
<asp:Label ID="folderName" runat="server">General</asp:Label><br />
<div id="navContainer" runat="server">

</div>
    <div id="hiddenContent">      
    <asp:LinkButton ID="LinkButton1" CssClass="hide" runat="server" OnClick = "Retreive_Doc">Download Doc</asp:LinkButton>
    <asp:LinkButton ID="LinkButton2" CssClass="hide" runat="server" OnClick = "Retreive_Xls">Download xls</asp:LinkButton>
    </div>
<div id="container" runat="server">
</div>
</form>

正如我之前所说。这是在几天前工作,并通过添加一些其他功能的过程,我失去了它。

我不确定为什么它在没有调用任何函数的情况下回发。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果您动态创建它们,则需要在回发中重新创建具有相同ID的控件。否则,它们会在回发后消失。

在页面加载事件中删除If Not IsPostBack Then

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
  Handles Me.Load
   folder = "Main"
   PopulateFiles(folder)
End Sub

另一个想法

如果您想要CommandArgument,是否有理由不使用CommandEvent而不是Click事件?

同样,是否有理由不使用PlaceHolder代替<div id="container" runat="server">

AddHandler newBtn.Command, AddressOf Retreive_Doc
newBtn.CommandArgument = id

....

protected void Retreive_Doc(object sender, CommandEventArgs e)