我正在使用带有 ASP.NET GridView 和 C# 的 DevExpress 2015。我需要将数据从 GridView 导出为 .xls 或 .xlsx 格式。执行 DevExpress ASPxGridViewExporter.WriteXlsxToResponse
方法时,将引发异常,并显示消息:"线程正在中止"。我已经研究过了,这似乎是响应重定向方法的问题;解决方案是将false
作为 bool 参数值的值传递。
但是,我需要帮助来解决 DevExpress ASPxGridViewExporter.WriteXlsxToResponse
方法的此错误。
.ASPX
<div class="form-group">
<dx:ASPxGridView ID="Grid" ClientInstanceName="Grid" runat="server" Theme="Office2010Silver" EnableTheming="True" style="width: calc(100% - 70px); border-radius:4px; -o-border-radius:4px; -moz-border-radius:4px; -webkit-border-radius:4px;" AutoGenerateColumns="False" KeyFieldName="Codigo" OnSelectionChanged="gdvVale_SelectionChanged" EnableCallBacks="false" OnHtmlDataCellPrepared="gdvVale_HtmlDataCellPrepared">
<SettingsPager PageSize="100" >
<Summary AllPagesText="Páginas: {0} - {1} ({2} itens)" EmptyText="Sem dados para paginar" Text="Página {0} de {1} ({2} itens)" />
</SettingsPager>
<Settings ShowFilterRow="True" ShowGroupPanel="True" VerticalScrollableHeight="200" VerticalScrollBarMode="Auto" VerticalScrollBarStyle="Standard" ShowHeaderFilterButton="true" />
<SettingsBehavior AllowSelectByRowClick="True" AllowSelectSingleRowOnly="True" ColumnResizeMode="NextColumn" AutoExpandAllGroups="true" ProcessSelectionChangedOnServer="true" />
<SettingsDataSecurity AllowDelete="False" AllowEdit="False" AllowInsert="False" />
<SettingsText GroupPanel="Arraste a coluna para agrupar os dados" />
<Columns>
<dx:GridViewDataTextColumn FieldName="Codigo" Caption="Codigo" VisibleIndex="0" Visible="false" Width="10%">
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn FieldName="Pedido" Caption="Pedido" VisibleIndex="0" Width="5%">
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn FieldName="DataLancamento" Caption="Data Lançamento" VisibleIndex="1" Width="10%" PropertiesTextEdit-DisplayFormatString="dd/MM/yyyy HH:mm">
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn FieldName="Cliente.Razao_social" Caption="Cliente" VisibleIndex="2" Width="35%">
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn FieldName="Representante" Caption="Representante" VisibleIndex="2" Width="25%">
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn FieldName="DataBaixa" Caption="Data Baixa" VisibleIndex="3" Width="10%" PropertiesTextEdit-DisplayFormatString="dd/MM/yyyy HH:mm">
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn FieldName="Status" Caption="Status" VisibleIndex="4" Width="10%">
</dx:GridViewDataTextColumn>
<dx:GridViewDataTextColumn FieldName="ValorPedido" Caption="Valor" VisibleIndex="5" Width="10%">
</dx:GridViewDataTextColumn>
</Columns>
<Settings ShowGroupPanel="False" ShowFooter="True" ShowGroupFooter="VisibleIfExpanded" />
<TotalSummary>
<dx:ASPxSummaryItem FieldName="Pedido" SummaryType="Count" DisplayFormat="n0" ShowInColumn="Pedido" />
<dx:ASPxSummaryItem FieldName="ValorPedido" SummaryType="Sum" DisplayFormat="c2"/>
</TotalSummary>
</dx:ASPxGridView>
<dx:ASPxGridViewExporter ID="ASPxGridViewExporter1" runat="server" GridViewID="Grid" Landscape="false" ExportEmptyDetailGrid="true" >
<Styles>
<Header Font-Size="X-Small" Font-Names="Calibri (Corpo)"></Header>
<Cell Font-Size="X-Small" Font-Names="Calibri (Corpo)" ></Cell>
<GroupRow Font-Size="X-Small" Font-Names="Calibri (Corpo)"></GroupRow>
</Styles>
</dx:ASPxGridViewExporter>
</div>
<asp:LinkButton ID="btn_excel_xlsx" CssClass="btn btn-app" runat="server" OnClick="btn_excel_xlsx_Click" TabIndex="103" ToolTip="Exportar Arquivo em Excel XLSX">
<i class="fa fa-file-excel-o"></i> Exportar XLSX
</asp:LinkButton>
C#
protected void btn_excel_xlsx_Click(object sender, EventArgs e)
{
try
{
ASPxGridViewExporter1.WriteXlsxToResponse();
}
catch (Exception err)
{
this.EscreverMensagemErrorAjax(err.Message);
UpdatePanelGrid.Update();
}
}
大概ASPxGridViewExporter.WriteXlsxToResponse
方法调用HttpResponse.End
方法。 HttpResponse.End
方法抛出ThreadAbortException
。 这是设计使然,您无法抓住ThreadAbortException
. 相反,应用程序应该在调用 HttpResponse.End
之前执行所需的任何操作,并让ThreadAbortException
终止当前请求。