ページ上の2つの_grid views
_からの情報を処理するonclick
イベントハンドラーを備えた2つのボタンがあります。各gvに1つのボタン。これらは、html
テーブル構造にネストされた互いの上に配置されます。
ボタンは、grid
日付をExcel
ドキュメントにエクスポートするために使用されます(以下のコードを参照)
上のボタンとgrid
の場合、ボタンのclick
は正常に機能しますが、下のボタンは_ThreadAbortException: Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.
_をスローします
当然、私はこれをGoogleで行いましたが、上位の結果のいくつかはResponse.Redirect()
ではなくResponse.End()
の呼び出しを扱っていました。 Forums.asp.net でのそのような投稿の1つは、同じメソッド呼び出しで同じエラーが発生しますが、解決策は、パラメーターとしてエラーページを使用してコードResponse.Redirect()
を変更することでした-再度関連していません私が持っているものに。
別の Microsoftサポートページで検索HttpContext.Current.ApplicationInstance.CompleteRequest()
がResponse.End()
を置き換えるソリューションを提案します。私はこれを試しました、エラーはなくなり、Excelダウンロードポップアップも消えます。
だから、ここからどこに行くべきか分かりません。奇妙なのは、同じコード(gridview
idを除く)が一方に対してのみ機能することです。これがレビュー用のコードで、エラーがスローされる場所をマークしました。私はおそらく新しいスレッドを生成できると思いました-それで問題は軽減されますか?私は_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;
}
}
_
グリッドとボタンの両方を1つのUpdate Panel
で、一番上のボタンだけがPostBackTrigger
として設定されました。 2つ目を追加した後、<asp:PostBackTrigger ControlID="btnExport1" />
そして、それは問題を解決します。
「コードが最適化されているか、ネイティブフレームが呼び出しスタックの最上位にあるため、式を評価できません」を処理する便利な方法があります。問題。出力ウィンドウに書き込む必要があります。
System.Diagnosticsを使用して追加します。
エラーのある行にTry/Catchを追加します
キャッチでこれらの行を追加します
try
{ ..}
catch(Exception ex)
{
Debug.WriteLine(ex.Message);
Debug.WriteLine(ex.StackTrace);
Debug.WriteLine(ex.InnerException.ToString());
}
デバッグして出力ウィンドウを確認するだけです
それが役に立てば幸い。
ASPxGridViewExporter
を取得せずに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);
}
次のメッセージを含むThreadAbortException
を取得せずにExcelファイルをダウンロードします。
コードが最適化されているか、ネイティブフレームが呼び出しスタックの最上位にあるため、式を評価できません。
また、Excelファイルを開くときに次のエラーメッセージが表示されません。
Excelは、myFilename.xlsxに読み取り不可能なコンテンツを見つけました。このブックの内容を回復しますか?この本の提供元が信頼できる場合は、[はい]をクリックします。
それが役に立てば幸い! :)