2013-03-14 3 views
6

Ich habe zwei Schaltflächen mit onclick Event-Handler, die Informationen von zwei grid views auf der Seite verarbeiten. Ein Knopf für jedes gv. Diese liegen übereinander in einer html Tabellenstruktur.Ausdruck kann nicht ausgewertet werden, weil der Code optimiert ist oder ein nativer Rahmen über dem Aufrufstack ist

Die Tasten das grid Datum in ein Excel Dokument (siehe Code unten)

Die obere Taste und grid wenn click auf der Schaltfläche funktioniert gut, aber die untere Taste wirft ein ThreadAbortException: Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.

Natürlich exportieren verwendet Ich habe Google-d dafür, aber einige der Top-Ergebnisse wurden mit Response.Redirect() Anrufe statt Response.End() behandelt. Ein solcher Beitrag bei Forums.asp.net hat den gleichen Fehler auf dem gleichen Methodenaufruf, aber die Lösung war, den Code Response.Redirect() mit einer Fehlerseite als Parameter zu ändern - wieder nicht mit dem, was ich habe.

Eine andere search at Microsoft Suport page schlägt eine Lösung vor, bei der Response.End() ersetzt. Ich habe das versucht, der Fehler verschwindet und das Excel-Download-Popup.

Also ich weiß nicht, wohin ich von hier gehen soll. Was komisch ist, ist, dass der gleiche Code (weniger gridview ID) für den einen aber den anderen funktioniert. Hier ist der Code für Ihre Überprüfung und ich habe markiert, wo der Fehler ausgelöst wird. Ich dachte, ich könnte vielleicht einen neuen Thread erstellen - würde das das Problem lindern? Ich habe noch nie eine multi-threaded App gemacht, aber ich bin bereit für eine Herausforderung.

<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; 
    } 
} 
+0

In dem Szenario, in dem die zweite Schaltfläche fehlschlägt, klicken Sie auf die zweite Schaltfläche, sobald die Seite geladen wird, oder nur nach dem Klicken auf die erste Schaltfläche? –

+0

Warum müssen Sie auch ein Formular erstellen, um das Raster zu halten? Nur neugierig. –

+0

Die zweite Schaltfläche schlägt fehl, auch wenn ich vor der ersten klicke. Die Seite kann dort für eine Weile "sitzen" - egal wie lange. Ich bin mir nicht sicher, ob ich Ihre zweite Frage über das Bedürfnis nach einem Formular verstehe. Der Code wurde mir übergeben, er funktioniert auf anderen Seiten als hier. – Risho

Antwort

8

Es runed heraus, dass ich beide Gitter und Tasten in einem Update Panel und nur die obere Taste wurde als PostBackTrigger gesetzt. Nachdem ich die zweite <asp:PostBackTrigger ControlID="btnExport1" /> hinzugefügt habe und das Problem löst.

4

Es gibt eine praktische Möglichkeit, mit "Kann Ausdruck nicht auswerten, da der Code optimiert ist oder ein nativer Rahmen auf der Call-Stack ist." Probleme. Sie müssen auf das Ausgabefenster schreiben.

Hinzufügen mit System.Diagnostics;

einen Try/Catch für die Zeile hinzufügen, die

Im Fang fügen Sie diese Zeilen

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

Nur Debug und überprüfen Sie das Ausgabefenster

Hoffe, es hilft ist erroring.

0

Kann mit einem ASPxGridViewExporter gelöst werden, ohne eine ThreadAbortException zu bekommen.

Versuchen Sie den folgenden Code-Schnipsel:

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); 
} 

Es lädt die Excel-Datei ohne ein ThreadAbortException mit der Botschaft zu bekommen:

kann nicht Ausdruck bewerten, da der Code optimiert ist, oder ein gebürtiger Rahmen befindet sich oben auf dem Aufrufstapel.

und ohne die folgende Fehlermeldung zu erhalten, wenn die Excel-Datei öffnen:

Excel gefunden unreadble Inhalt in myFilename.xlsx. Möchten Sie den Inhalt dieser Arbeitsmappe wiederherstellen? Wenn Sie der Quelle dieses Buchs vertrauen, klicken Sie auf Ja.

Hoffe es hilft! :)

Verwandte Themen