Динамическая кнопка не работает с AddHandler в VB.NET
Я работаю над проектом, в котором я пытаюсь динамически создать кнопку в коде для динамической отправки и загрузки файла на сервер. Я использую 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, Top и Left - это просто заполнители для тех мест, где я динамически генерирую содержимое страницы. Код для этой страницы просто вызывает функцию в классе, который я разработал, и добавляет ее к одному из элементов 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 возвращает объект в форме таблицы с сеткой, кнопкой и некоторым кодом JavaScript внутри. Важной частью этого класса является функция, которая создает часть, с которой у меня возникают проблемы. Эта часть содержит сетку, в которой перечислены элементы в папке на сервере. Если пользователь хочет, он нажимает кнопку загрузки под видом сетки, а затем 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
Извините, если я написал слишком много, но я искал ответы на эту проблему в течение нескольких дней и не могу понять это. Я не уверен, что это потому, что я загружаю его не в правильном порядке, потому что он в другом классе или потому, что я использую мастер-страницы или что-то еще.