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;
}
}
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? –
Warum müssen Sie auch ein Formular erstellen, um das Raster zu halten? Nur neugierig. –
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