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;
}
}
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? –
Inoltre, perché è necessario creare un modulo per contenere la griglia? Solo curioso. –
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