微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多次上传,ajax控件

如何解决多次上传,ajax控件

im尝试上传多个文件并将所有文件保存在数据表中。 数据表仅存储一个文件

帮我解决,其他部分出错。 dtupload突出显示

以下是我尝试过的内容

Private Sub AjaxFileUpload1_UploadComplete(sender As Object,e As AjaxControlToolkit.AjaxFileUploadEventArgs) Handles AjaxFileUpload1.UploadComplete
        Try
            

            
                dt.Rows.Add(UploadDocPath,UploadDoc)
                MsgBox(dt.Rows.Count.ToString)

            Else
                dt.Rows.Add(UploadDocPath,UploadDoc)
            End If





        Catch ex As Exception

        End Try

    End Sub

解决方法

好吧,您在一个本地例程中创建一个表,添加一行。然后例程结束,所有值,变量现在超出范围。如果第二个文件被上载,则该例程将再次被调用,然后您重新创建该表。该例程(实际上是任何例程)中的变量,在例程结束时,即使不是asp.net,也会变大。

至少对于桌面应用程序,您可以在表单级别(而不是子例程级别)声明表,然后可以向该temp表变量添加新行。但是,使用asp.net,则您的网页“状态变少”。这意味着在代码运行时,所有变量仅具有其状态。代码完成的那一刻,后面的代码中的所有状态都会丢失。

但是我有些困惑,您会认为数据表将在每次调用时都保持不变?也许您只希望var dtUpload在调用例程的每个单独时间的生命周期中存在?但是,那么您又对表什么也不做??

那么,对于每个上传的文件?该例程被调用。 因此,假设要上传5个文件。

真的很疯狂吗?我假设我们希望该表/数组随着时间的推移而建立。

因此,我们需要确保dtUpload表可以“存活”超过单个页面周期和往返行程。 因此,让我们保存/放置/放置/停放一个可以“超出”该例程的dtUpload表。

说完之后,这真的取决于您要使用该列表做什么?

由于桌子很小?然后,您当然可以在表单加载事件中创建不带任何行的表,然后将其推到Session()中。然后,在每个文件上载时,您可以将文件名推送到该数组中。

因此,您的代码可以像这样工作:

仅在第一次加载事件中,创建dtUpload表。然后将其推入/保存到session()中。

因此,我们的负载看起来像这样:

    If IsPostBack = False Then
        ' fist time page load - create our table
        Dim dtUpload As New DataTable
        dtUpload.Columns.Add("PATH")
        dtUpload.Columns.Add("FILENAME")

        Session("FileList") = dtUpload
    End If

好,因此,在页面加载时(仅限第一次),我们创建dtTable,然后将其保存在会话中。

现在,在文件上传完成事件中,从会话中获取表,添加行(文件+路径)。 请注意,我们如何不必将dtUpload表推回会话中! (它现在是我们会话中的持久对象)。

好,现在我们的单个文件加载事件(完成后)可以/将如下所示:

Protected Sub AjaxFileUpload1_UploadComplete(sender As Object,e As AjaxControlToolkit.AjaxFileUploadEventArgs) Handles AjaxFileUpload1.UploadComplete

    Dim dtUpload As DataTable = Session("FileList")

    Dim strPath As String = "c:\Test\MyUpload\"
    Dim strFile As String = e.FileName
    dtUpload.Rows.Add(strPath,strFile)
    AjaxFileUpload1.SaveAs(strPath & strFile)

End Sub

因此,请注意我们如何将一行添加到表中。 (并且我们并没有指出必须将对象推回会话中-在这种情况下,dtUpload实际上是指向持久化我们放置在Session()中的dtUpload表的对象。

好吧,现在让我们说所有5个文件都已完成。

好吧,您现在必须决定要对拥有的dtUpload表做什么?

也许我们要显示所有文件?

请记住,网页不会回发信息。

但是,假设我们现在要显示所有文件。

将一个Datagrid控件拖到窗体上。 将按钮拖到窗体上。

因此,我们现在有了这个: enter image description here

然后点击上载,您会得到:

enter image description here

单击按钮时,可以运行以下代码:

Protected Sub Button1_Click(sender As Object,e As EventArgs) Handles Button1.Click
    Me.GridView1.DataSource = Session("FileList")
    Me.DataBind()
End Sub

现在单击该按钮吗?

您会看到:

enter image description here

现在,这是将按钮放置在表单上的一个非常重要的非常重要的原因。当然,原因是ajax上传何时完成?

该网页不做回发。因此,这就是上面的按钮起作用的地方。

通过单击按钮,我们的代码存根运行,我们填充gridview,然后当然页面进行往返并重新显示我们的文件列表。

现在,我们可以让最后的CLient端ajaxfileupload事件为我们单击该按钮,从而代替用户单击该按钮继续吗?

您可以让客户端代码点击该按钮。

因此,将OnClientUpLoadCompleteAll设置为js例程:

    <script>
        function uerror() {
            alert('upload error');
        }

        function myalldone() {
            var btn = document.getElementById('<%=Button1.ClientID%>');
            btn.click();
        }
    </script>

因此,它现在将单击该按钮(您甚至可以为该按钮设置style =“ display:none”。因此,现在您有了最终的例行服务器端,但回发了整页内容。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。