6

我有两个带有onclick事件处理程序的按钮,它们处理来自grid views页面上两个的信息。每个 gv 一个按钮。它们位于彼此之上,嵌套在html表结构中。

这些按钮用于将grid日期导出到Excel文档中(参见下面的代码)

顶部按钮和gridclick按钮工作正常但底部按钮抛出一个ThreadAbortException: Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.

当然,我为此使用了 Google-d,但一些最佳结果是处理Response.Redirect()调用而不是Response.End(). Forums.asp.net上的一篇这样的帖子在同一个方法调用上存在相同的错误,但解决方案是使用错误页面作为参数更改代码Response.Redirect()- 再次与我所拥有的无关。

Microsoft 支持页面上的另一个搜索建议了一个解决方案,其中HttpContext.Current.ApplicationInstance.CompleteRequest()替换Response.End(). 我已经尝试过了,错误消失了,Excel 下载弹出窗口也消失了。

所以我不知道从这里去哪里。奇怪的是,相同的代码(更少的gridviewid)适用于一个但另一个。这是供您查看的代码,我已经标记了引发错误的位置。我想也许我可以产生一个新线程 - 这会缓解这个问题吗?我从未做过multi-threaded应用程序,但我准备迎接挑战。

<table>
  <tr>
   <td align="left">
     <asp:Button ID="btnExport" runat="server" OnClick="btnExport_Click"
          Text="Export" Visible="false" />
   </td>
  </tr>
  <tr>
   <td>                    
     <asp:Panel runat="server" ID="pnl1" Visible="false">
      <asp:GridView ID="gvCountTotalsCat" runat="server" 
          AutoGenerateColumns="false"
          CellPadding="3" PageSize="25" BackColor="White" BorderColor="MidnightBlue"
          BorderStyle="Groove" BorderWidth="1px" CssClass="TextCompact" 
          GridLines="Vertical"
          OnRowDataBound="gridView_OnRowDataBound"
          EmptyDataText="Your request has returned zero records">
          <Columns>
           <asp:TemplateField>
            <HeaderTemplate>
             <asp:Label runat="server" ID="lblHeader" Text="Cat" />
            </HeaderTemplate>
           <ItemTemplate>
            <asp:Literal ID="litWuc" runat="server" />
           </ItemTemplate>
           </asp:TemplateField>
            <asp:BoundField DataField="Cat Entries" HeaderText="Cat Entries" />
           <asp:TemplateField>
           <HeaderTemplate>
            <asp:Label runat="server" ID="lblHeader" />
           </HeaderTemplate>
           <ItemTemplate>
            <asp:Literal ID="litSum" runat="server" />
           </ItemTemplate>
          </asp:TemplateField>
         </Columns>                                              
        </asp:GridView>
       </asp:Panel>
   </td>
  </tr>
  <tr>
   <td align="left">
    <asp:Button ID="btnExport1" runat="server" OnClick="btnExport_Click1" 
         Text="Export" Visible="false" />
   </td>
  </tr>
  <tr>
   <td>                         
    <asp:Panel runat="server" ID="pnl2" Visible="false">
     <asp:GridView ID="gvCountTotalsCat1" runat="server" 
          AutoGenerateColumns="false"
          AllowPaging="false" CellPadding="3" PageSize="25" BackColor="White"
          BorderColor="MidnightBlue" BorderStyle="Groove" BorderWidth="1px" 
          CssClass="TextCompact" GridLines="Vertical" 
          OnRowDataBound="gridView_OnRowDataBound"
          EmptyDataText="Your request has returned zero records">
          <Columns>
            <asp:TemplateField>
             <HeaderTemplate>
              <asp:Label runat="server" ID="lblHeaderWuc" Text="Wuc" />
             </HeaderTemplate>
            <ItemTemplate>
            <asp:Literal ID="litWuc" runat="server" />
            </ItemTemplate>
           </asp:TemplateField>
           <asp:BoundField DataField="Wuc Entries" HeaderText="Wuc Entries" />
           <asp:TemplateField>
            <HeaderTemplate>
              <asp:Label runat="server" ID="lblHeader" />
            </HeaderTemplate>
            <ItemTemplate>
              <asp:Literal ID="litSum" runat="server" />
            </ItemTemplate>
           </asp:TemplateField>
          </Columns>     
         </asp:GridView>
        </asp:Panel>
       </td>
      </tr>
     </table>



public void btnExport_Click(object sender, System.EventArgs e)
{
    string attachment = string.Empty;
    StringWriter sw = new StringWriter();
    HtmlTextWriter htw = new HtmlTextWriter(sw);

    // Create a form to contain the grid
    HtmlForm frm = new HtmlForm();
    frm.Attributes["runat"] = "server";

    attachment = "attachment; filename=gvCountTotalsCat_" + _selectedSite + ".xls";
    gvCountTotalsCat.Parent.Controls.Add(frm);
    frm.Controls.Add(gvCountTotalsCat);

    Response.ClearContent();
    Response.AddHeader("content-disposition", attachment);
    Response.ContentType = "application/ms-excel";

    frm.RenderControl(htw);

    Response.Write(sw.ToString());

    Response.End();
}



public void btnExport_Click1(object sender, System.EventArgs e)
{
    string attachment = string.Empty;
    StringWriter sw = new StringWriter();
    HtmlTextWriter htw = new HtmlTextWriter(sw);
    Response.Clear();
    Response.ClearHeaders();

    // Create a form to contain the grid
    HtmlForm frm = new HtmlForm();
    frm.Attributes["runat"] = "server";

    attachment = "attachment; filename=gvCountTotalsCat1_" + _selectedSite + ".xls";
    gvCountTotalsCat1.Parent.Controls.Add(frm);
    frm.Controls.Add(gvCountTotalsCat1);

    Response.ClearContent();
    Response.AddHeader("content-disposition", attachment);
    Response.ContentType = "application/ms-excel";

    frm.RenderControl(htw);

    Response.Write(sw.ToString());

    try
    {
 >> Error thrown here >>     Response.End();

    }
    catch (System.Threading.ThreadAbortException lException)
    {
        lException;
    }
}
4

3 回答 3

8

用完我同时拥有网格和按钮,Update Panel并且只有顶部按钮设置为PostBackTrigger. 在我添加了第二个<asp:PostBackTrigger ControlID="btnExport1" />并解决了问题之后。

于 2013-03-15T16:54:48.657 回答
4

有一种方便的方法来处理“由于代码已优化或本机框架位于调用堆栈顶部而无法评估表达式”。问题。您需要在输出窗口上书写。

使用 System.Diagnostics 添加;

为出错的行添加 Try/Catch

在 Catch 添加这些行

try
{ ..}
 catch(Exception ex)
{
    Debug.WriteLine(ex.Message);
    Debug.WriteLine(ex.StackTrace);
    Debug.WriteLine(ex.InnerException.ToString());
}

只需调试并检查输出窗口

希望能帮助到你。

于 2014-12-05T12:22:12.270 回答
0

可以使用 a 解决ASPxGridViewExporter而不获得 a ThreadAbortException

试试下面的代码片段:

try
{
    using (MemoryStream stream = new MemoryStream())
    {
        // Write the content of the xlsx to the stream
        gridViewExporter.WriteXlsx(stream, new XlsxExportOptions(TextExportMode.Text, false, false));

        if (Response == null)
        {
            return;
        }

        // Write the byte content to the output
        Response.Clear();
        Response.AppendHeader("Content-Disposition", StringMngr.SafeFormat("attachment; filename=\"{0}.xlsx\"", "xlsxFileName"));
        Response.ContentType = "Text/xlsx";
        Response.ContentEncoding = System.Text.Encoding.Unicode;

        if (stream.Length > 0)
        {
            Response.BinaryWrite(stream.ToArray());
        }

        Response.Flush();
        Response.SuppressContent = true;
    }
}
catch (Exception ex)
{
    log.Error("An error occured while downloading in xlsx format.", ex);
}

它下载 excel 文件而没有收到ThreadAbortException以下消息:

无法计算表达式,因为代码已优化或本机框架位于调用堆栈顶部。

并且在打开 excel 文件时没有收到以下错误消息:

Excel 在 myFilename.xlsx 中发现了不可读的内容。是否要恢复此工作簿的内容?如果您信任本书的来源,请单击是。

希望能帮助到你!:)

于 2015-04-09T09:06:27.223 回答