【问题标题】:ASP GridView Refresh after Excel Export not workingExcel 导出后 ASP GridView 刷新不起作用
【发布时间】:2012-11-26 19:35:31
【问题描述】:

我在 Ajax UpdatePanel 中有一个 Gridview。在每个 GV 行内,我都有一个复选框字段。这个想法是用户检查他们想要的行,然后单击一个按钮以将该行中的标签更新为“已发货”,然后还将检查的行导出到 xls 文件(实际上是 csv)。

当我的代码隐藏触发时,它会遍历 gridview 行,查找检查,更新数据库以标记每一行,然后我使用 .DataBind() 刷新网格。这完美无缺,符合预期。

现在我还想将选中的行导出到 Excel。因此,我创建了一个方法来执行此操作,并在更新每一行以标记行并在 .DataBind() 刷新之前将其弹出。现在 .DataBind() 永远不会触发刷新。我确实收到了 XLS 下载,如果我手动刷新屏幕,这些行会按预期更新。

这是我的代码:

ASPX (Just a portion of the gridview):
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
        <asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False"
                DataKeyNames="MinqNum" DataSourceID="SqlDataSource1" Font-Size="Small" BorderColor="Black"
                BorderStyle="Solid" BorderWidth="1px" CellPadding="0">
                <RowStyle Font-Size="Small" HorizontalAlign="Left" VerticalAlign="Bottom" BorderColor="#999999"
                    BorderStyle="Solid" BorderWidth="1px" Wrap="true" />
                <Columns>
                    <asp:TemplateField>
                    <ItemStyle CssClass="ItemStyle"/>
                    <HeaderStyle Wrap="true" Font-Size="X-Small" HorizontalAlign="Center"
                            VerticalAlign="Bottom" BorderWidth="0px" />
                        <ItemTemplate>
                            <asp:ImageButton ID="btn_editss" runat="server" CommandName="Edit" ImageUrl="~/images/edit.gif" />
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:ImageButton ID="btn_savess" runat="server" CommandName="Update" ImageUrl="~/images/save.gif" />
                            <asp:ImageButton ID="btn_cancelss" runat="server" CommandName="Cancel" ImageUrl="~/images/cancel.gif" />
                        </EditItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Date" SortExpression="MinqDate">
                        <ItemStyle CssClass="ItemStyle" HorizontalAlign="Center" Font-Size="Smaller"/>
                        <HeaderStyle Wrap="true" Font-Size="X-Small" HorizontalAlign="Center" VerticalAlign="Bottom" BorderWidth="0px"/>
                        <ItemTemplate>
                            <asp:Label ID="lbl_minqdate" runat="server" Text='<%#Bind("MinqDate", "{0:MM/dd/yy}") %>'></asp:Label>
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:Label ID="lbl_minqdate" runat="server" Text='<%#Bind("MinqDate", "{0:MM/dd/yy}") %>'></asp:Label>
                        </EditItemTemplate>
                    </asp:TemplateField>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>


Button Click Event (codebehind):
Protected Sub btn_markshipped_clicked(ByVal sender As Object, ByVal e As EventArgs)
    For Each row As GridViewRow In GridView1.Rows
        If row.RowType = DataControlRowType.DataRow Then
            Dim isChecked As Boolean = DirectCast(row.FindControl("cb_supship"), CheckBox).Checked
            If isChecked Then
                'btn_markshipped.Text = "changed"
                Dim cmd As New SqlCommand("UPDATE InquiryV4.dbo.Main SET Sup_Shipped = 'S' WHERE MinqNum = @MinqNum")
                cmd.Parameters.AddWithValue("@MinqNum", row.Cells(5).Controls.OfType(Of Label)().FirstOrDefault().Text)
                'cmd.Parameters.AddWithValue("@Country", row.Cells(2).Controls.OfType(Of DropDownList)().FirstOrDefault().SelectedItem.Value)
                'cmd.Parameters.AddWithValue("@CustomerId", gvCustomers.DataKeys(row.RowIndex).Value)
                Me.ExecuteQuery(cmd, "UPDATE")
            End If
        End If
    Next
    'btnUpdate.Visible = False
    'Me.BindGrid()
    btn_exportexcel()
    GridView1.DataBind()
End Sub

btn_exportexcel sub (codebehind):
    Private Sub btn_exportexcel()
    Dim dt = New DataTable()
    dt.Columns.Add("MTX PN")
    dt.Columns.Add("Inq#")
    dt.Columns.Add("Customer")
    dt.Columns.Add("Qty")
    dt.Columns.Add("Eng")
    dt.Columns.Add("A/M")
    For Each gvrow As GridViewRow In GridView1.Rows
        Dim chk As Boolean = DirectCast(gvrow.FindControl("cb_supship"), CheckBox).Checked
        If chk = True Then
            Dim i = gvrow.RowIndex
            Dim lbl_mtxpn As Label = gvrow.FindControl("lbl_mtxpn")
            Dim lbl_inqnum As Label = gvrow.FindControl("lbl_inqnum")
            Dim lbl_customer As Label = gvrow.FindControl("lbl_customer")
            Dim lbl_SamplesRequested As Label = gvrow.FindControl("lbl_SamplesRequested")
            Dim lbl_AssignedTo As Label = gvrow.FindControl("lbl_AssignedTo")
            Dim lbl_LTN_Eng As Label = gvrow.FindControl("lbl_LTN_Eng")
            Dim lbl_AcctMGR As Label = gvrow.FindControl("lbl_AcctMGR")

            Dim dr = dt.NewRow()
            dr.Item("MTX PN") = Convert.ToString(lbl_mtxpn.Text)
            dr.Item("Inq#") = Convert.ToString(lbl_inqnum.Text)
            dr.Item("Customer") = Convert.ToString(lbl_customer.Text)
            dr.Item("Qty") = Convert.ToString(lbl_SamplesRequested.Text)
            dr.Item("Eng") = Convert.ToString(lbl_LTN_Eng.Text) + "(" + Convert.ToString(lbl_AssignedTo.Text) + ")"
            dr.Item("A/M") = Convert.ToString(lbl_AcctMGR.Text)

            dt.Rows.Add(dr)
        End If
    Next
    Dim GridView2 = New GridView()
    GridView2.DataSource = dt
    GridView2.DataBind()
    Response.Clear()
    Response.Buffer = True
    Response.ContentType = "application/ms-excel"
    Response.AddHeader("content-disposition", String.Format("attachment;filename={0}.xls", "selectedrows"))
    Response.Charset = ""
    Dim sw As New StringWriter()
    Dim hw As New HtmlTextWriter(sw)
    GridView2.RenderControl(hw)
    Response.Output.Write(sw.ToString())
    Response.End()
End Sub

正如我所说,如果没有导出功能,gridview.databind() 将按预期工作并更新 gridview。只要将导出函数放在中间,它就会阻止 .databind() 发生。

有什么想法吗?只是为了咯咯笑,我还尝试了 response.redirect ,但也有同样的问题。

【问题讨论】:

  • 所以似乎在我的 btn_exportexcel 子项目的“响应”部分的某个地方出现了问题。就好像 GridView1.DataBind() 正在尝试针对我为电子表格构建的 gridview 工作。如果这有任何意义......
  • 好吧。我将我的 Response.End 更改为 Response.Flush() Response.Close() 现在调试器将完成这些并退回到原始方法并进入 GridView1.Databind() 但屏幕仍然不会改变。我还有一个用于 Gridview1 的 onrowdatabound 方法,调试器永远不会介入。所以基本上调试器通过导出过程回到按钮单击事件步骤到 GridView1.DataBind(),然后立即到 END SUB。嗯...

标签: asp.net vb.net data-binding gridview export-to-excel


【解决方案1】:

发生这种情况是因为您是:

  1. 清除响应;
  2. 发送 Excel 文件;
  3. 结束响应。

也就是说,服务器对你的请求的回复是发送excel文件。它不会向浏览器发送新的一批 HTML,因为您告诉它在文件发送后停止。正如您所观察到的,您的页面没有改变,因为您没有向浏览器发送任何新的 HTML。

我认为既发送文件又发送新 HTML 到浏览器是不可能的,但我愿意被证明是错误的。我见过的大多数情况下,尝试这两种方法的人首先涉及重新绑定和页面刷新,然后对服务器进行类似 Ajax 的 GET 调用以获取 Excel 文件。其他选项包括打开一个新的非常小的窗口,它只执行 GET 并返回 Excel 文件,然后在发送后关闭。

【讨论】:

  • 感谢您的指导。我能够将文件构建并保存到服务器,并且仍然执行 DataBind() 来刷新 gridview。现在我只需要弄清楚如何启动文件下载然后清除文件。任何关于这个的cmets都会很棒,但是今天我的眼睛很痛......
  • 下载后要么删除文件,要么清空。
【解决方案2】:

您是要在同一个 GridView 中显示 2 个 GridView 还是相同数据的两个视图?

【讨论】:

  • 数据表是根据检查的 asp gridview 中的行为 excel 导出呈现的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
相关资源
最近更新 更多