2013-03-14 19 views
6

Ho due pulsanti con i gestori di eventi onclick che elaborano le informazioni da due grid views nella pagina. Un pulsante per ogni gv. Questi sono situati l'uno sopra l'altro annidati in una struttura di tabella html.Impossibile valutare l'espressione perché il codice è ottimizzato o una cornice nativa è in cima allo stack di chiamate

I pulsanti sono utilizzati per esportare la data di grid in un documento Excel (vedi codice qui sotto)

Il pulsante in alto e grid quando click sul pulsante funziona bene, ma il pulsante in basso tiri un ThreadAbortException: Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.

Naturalmente Ho creato Google per questo, ma alcuni dei migliori risultati riguardavano le chiamate Response.Redirect() anziché Response.End(). Uno di questi post su Forums.asp.net ha lo stesso errore sulla stessa chiamata di metodo, ma la soluzione era di cambiare il codice Response.Redirect() con una pagina di errore come parametro - di nuovo non correlato a quello che ho.

Un altro search at Microsoft Suport page suggerisce una soluzione in cui HttpContext.Current.ApplicationInstance.CompleteRequest() sostituisce Response.End(). Ho provato questo, l'errore va via e così è il popup di download di Excel.

Quindi non so dove andare da qui. La cosa strana è che lo stesso codice (meno gridview id) funziona per uno ma l'altro. Ecco il codice per la tua recensione e ho indicato dove viene generato l'errore. Pensavo che forse avrei potuto generare un nuovo thread: questo avrebbe alleviato il problema? Non ho mai fatto un'app multi-threaded ma sono pronto per una sfida.

<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

Nello scenario in cui il secondo pulsante ha esito negativo, si fa clic sul secondo pulsante non appena viene caricata la pagina o solo dopo aver fatto clic sul primo pulsante? –

+0

Inoltre, perché è necessario creare un modulo per contenere la griglia? Solo curioso. –

+0

Il secondo pulsante fallisce anche se clicco prima del primo. La pagina può "sedersi" lì per un po '- non importa per quanto tempo. Non sono sicuro di aver compreso la tua seconda domanda sul bisogno di un modulo. il codice mi è stato dato da prendere in consegna, funziona in altre pagine eccetto qui. – Risho

risposta

8

Si runed che ho entrambe le griglie e bottoni in una Update Panel e solo il pulsante in alto è stato impostato come un PostBackTrigger. Dopo ho aggiunto il secondo <asp:PostBackTrigger ControlID="btnExport1" /> e questo risolve il problema.

4

C'è un modo pratico per gestire "Impossibile valutare l'espressione perché il codice è ottimizzato o una cornice nativa è in cima allo stack di chiamate." problemi. È necessario scrivere nella finestra Output.

Aggiungere utilizzando System.Diagnostics;

Aggiungi un try/catch per la linea che viene erroring

il fermo aggiungere queste righe

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

Basta eseguire il debug e controllare la finestra di output

Speranza che aiuta.

0

Può essere risolto utilizzando un ASPxGridViewExporter senza ottenere un ThreadAbortException.

provare il seguente frammento di codice:

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

scarica il file excel senza ottenere un ThreadAbortException con il messaggio di:

Impossibile valutare l'espressione perché il codice è ottimizzato o una cornice nativo è in cima allo stack delle chiamate.

e senza ottenere il seguente messaggio di errore quando si apre il file di Excel:

Excel trovato contenuti unreadble in myFilename.xlsx. Vuoi recuperare il contenuto di questa cartella di lavoro? Se ti fidi della fonte di questo libro, fai clic su Sì.

Spero che sia d'aiuto! :)

Problemi correlati