Динамическая кнопка не работает с AddHandler в VB.NET

Я работаю над проектом, в котором пытаюсь динамически создать кнопку в code-behind динамически отправлять и загружать файл на сервер. Я использую AddHandler, но кнопка не возвращается. Я везде читал, что мне нужно перегенерировать эту кнопку после каждого поста из-за того, как работают веб-страницы. Я до сих пор не могу заставить эту кнопку работать. У меня есть главная страница с HTML:

<%@ Page Language="vb"
    AutoEventWireup="false"
    MasterPageFile="~/Site.Master"
    CodeBehind="Departments.aspx.vb"
    Inherits="Homepage.Departments" %>

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <script type="text/javascript" src="~/Scripts/jquery-1.8.2.js"></script>
    <script src="~/Scripts/jquery-ui-1.8.24.custom.min.js" type="text/javascript"></script>
    <script type="text/javascript">
    </script>
    <div id="Top" runat="server"> </div>
    <div id="Left" runat="server"></div>
    <div id="Right" runat="server"></div>
</asp:Content>

Верхний, левый и правый div — это просто заполнители для динамического создания содержимого страницы. Код для страницы просто вызывает функцию в классе, который я разработал, и добавляет ее в один из div на странице (я слышал, что если бы я обработал ее в page_init, она должна создать страницу в правильном порядке. .):

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init

    *SNIP business logic to determine what information to pull*

    'NewWebPart is my class that creates the custom parts and returns them as an object

                For Each DeptLayoutRow As MyDataSet.DeptLayoutRow In DeptLayout
                    Dim NewPartObject As Object = NewWebPart.CreateNewPart

                    Select Case DeptLayoutRow.Area
                        Case 1
                            Top.Controls.Add(NewPartObject)
                        Case 2
                            Left.Controls.Add(NewPartObject)
                        Case 3
                            Right.Controls.Add(NewPartObject)
                    End Select

                    i += 1
                Next
            End If
        End If
    End If
End Sub

Функция CreateNewWebPart возвращает объект в виде таблицы с gridview, кнопкой и некоторым кодом JavaScript внутри. Важной частью этого класса является функция, создающая ту часть, с которой у меня возникли проблемы. Эта часть содержит представление сетки, в котором перечислены элементы в папке на сервере. Если пользователь хочет, он нажимает кнопку загрузки под gridview, а затем JavaScript создает оверлей, который позволяет ему щелкнуть нужный файл и загрузить его на сервер. Кнопка отправки - это та, с которой у меня проблемы:

Private Function CreateDocument() As Table
        Dim Documents As New GridView
        Documents.Width = width
        Documents.Height = height

        Dim table As New Table

        'Dim Files As String()
        Dim FileLocation As String = _
          ConfigurationManager.AppSettings.Item("DeptLoc").ToString + _
          "\" + DeptName + "\" + PartName

        If Directory.Exists(FileLocation) Then
            Dim DirInfo As New IO.DirectoryInfo(FileLocation)
            Dim FileArray As IO.FileInfo() = DirInfo.GetFiles()
            Dim FileInfo As IO.FileInfo

            Dim Dt As New DataTable
            Dt.Columns.Add("File Name", GetType(String))
            Dt.Columns.Add("File Link", GetType(String))
            Dt.Columns.Add("File Size", GetType(String))
            Dt.Columns.Add("Last Updated", GetType(Date))

            For Each FileInfo In FileArray
                Dt.Rows.Add(FileInfo.Name, _
                            FileInfo.FullName, _
                            Math.Round(FileInfo.Length / 1024).ToString, _
                            FileInfo.LastWriteTime)
            Next

            Documents.DataSource = Dt
            Documents.Attributes.Add("Class", "mGrid")
            Documents.ID = "Documents" + IDNum.ToString

            'This function creates and returns a table with Documents in the first cell
            table = CreatePartTable(Documents)

            'Create Upload file button'''''''''''''''''''''''''''''''''''''
            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            Dim btnUpload As New HtmlGenericControl
            btnUpload.InnerHtml = "<button id='btnUpload" + IDNum.ToString + "'>Upload File</button>"

            Dim UploadRow As New TableRow
            Dim UploadRowCell As New TableCell
            UploadRowCell.Controls.Add(btnUpload)
            UploadRow.Cells.Add(UploadRowCell)

            Dim UploadDiv As New HtmlGenericControl("DIV")

            UploadDiv.ID = "UploadDiv" + IDNum.ToString
            Dim lbl As New Label With {.Text = "Choose what files you would like to upload!"}
            Dim FileUpload As New HtmlInputFile With {.ID = "FileUpload" + IDNum.ToString}
            Dim btnSubmit As New Button With {.ID = "Submit" + IDNum.ToString, .Text = "Submit"}
            'Neither of these seem to work either....
            'btnSubmit.Attributes.Add("runat", "server")
            'btnSubmit.Attributes.Add("onclick", "btnUploadSubmit_OnClick")

            UploadDiv.Controls.Add(lbl)
            UploadDiv.Controls.Add(New LiteralControl("<br />"))
            UploadDiv.Controls.Add(New LiteralControl("<br />"))
            UploadDiv.Controls.Add(FileUpload)
            UploadDiv.Controls.Add(New LiteralControl("<br />"))
            UploadDiv.Controls.Add(New LiteralControl("<br />"))
            UploadDiv.Controls.Add(btnSubmit)
            AddHandler btnSubmit.Click, AddressOf btnUploadSubmit_OnClick

            Dim UploadDialogRow As New TableRow
            Dim UploadDialogRowCell As New TableCell
            UploadDialogRowCell.Controls.Add(UploadDiv)
            UploadDialogRow.Cells.Add(UploadDialogRowCell)

            Dim UploadDivJQuery As New UI.HtmlControls.HtmlGenericControl
            Dim JQueryString As New StringBuilder
            JQueryString.Append("<script type='text/javascript'>")
            JQueryString.Append("   $(function() {")

            JQueryString.Append("       $(""*[id$='UploadDiv" + IDNum.ToString + "']"").dialog({")
            JQueryString.Append("           autoOpen: false,")
            JQueryString.Append("           modal: true,")
            JQueryString.Append("           show: 'clip',")
            JQueryString.Append("           hide: 'clip'")
            JQueryString.Append("       }); ")
            JQueryString.Append("       $(""*[id$='btnUpload" + IDNum.ToString + "']"").click(function() {")
            JQueryString.Append("       $(""*[id$='UploadDiv" + IDNum.ToString + "']"").dialog( 'open' );")
            JQueryString.Append("            return false; ")
            JQueryString.Append("       }); ")
            JQueryString.Append("   });")
            JQueryString.Append("</script>")
            UploadDivJQuery.InnerHtml = JQueryString.ToString

            Dim UploadDivJQueryRow As New TableRow
            Dim UploadDivJQueryRowCell As New TableCell
            UploadDivJQueryRowCell.Controls.Add(UploadDivJQuery)
            UploadDivJQueryRow.Cells.Add(UploadDivJQueryRowCell)

            table.Rows.Add(UploadRow)
            table.Rows.Add(UploadDialogRow)
            table.Rows.Add(UploadDivJQueryRow)

            'To fix up the document's DataGrid the way we want it!
            'This addhanlder for the documents gridview works fine...
            AddHandler Documents.DataBound, AddressOf DocumentsDataGridHandler
            Documents.DataBind()

        End If
        Return Table
    End Function

Извините, если я написал слишком много, но я несколько дней искал ответ на эту проблему и, похоже, не могу понять. Я не уверен, что это из-за того, что я загружаю его не в правильном порядке, из-за того, что он находится в другом классе, или из-за того, что я использую мастер-страницы или что-то в этом роде.


person Christopher Alich    schedule 06.12.2012    source источник
comment
Так. Я изменил свою кнопку в коде Dim btnSubmit As New Button With {.ID = Submit + IDNum.ToString, .Text = Submit} на следующую кнопку link: Dim btnSubmit As New LinkButton With {.ID = Submit + IDNum.ToString, . Text = Submit, .CommandArgument = PartName.ToString} Это работает. Я НЕ ПОНИМАЮ, почему кнопка ссылки работает, а кнопка - нет. Но я хочу использовать кнопку, поскольку это кнопка отправки, и я не хочу, чтобы пользователи думали, что они нажимают на ссылку...   -  person Christopher Alich    schedule 20.12.2012
comment
Хотя я заметил, что когда я перешел на кнопку ссылки, когда я просматриваю источник, для обратной передачи вставлен javascript. Когда он установлен на кнопку, это просто значение=Отправить. В любом случае у меня проблемы с сохранением файла в моем ящике для загрузки... :(   -  person Christopher Alich    schedule 03.01.2013