web-dev-qa-db-ja.com

コードが最適化されているか、ネイティブフレームがコールスタックの上にあるため、式を評価できません

ページ上の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;
    }
}
_
6
Risho

グリッドとボタンの両方を1つのUpdate Panelで、一番上のボタンだけがPostBackTriggerとして設定されました。 2つ目を追加した後、<asp:PostBackTrigger ControlID="btnExport1" />そして、それは問題を解決します。

8
Risho

「コードが最適化されているか、ネイティブフレームが呼び出しスタックの最上位にあるため、式を評価できません」を処理する便利な方法があります。問題。出力ウィンドウに書き込む必要があります。

System.Diagnosticsを使用して追加します。

エラーのある行にTry/Catchを追加します

キャッチでこれらの行を追加します

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

デバッグして出力ウィンドウを確認するだけです

それが役に立てば幸い。

4
Santhosh

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に読み取り不可能なコンテンツを見つけました。このブックの内容を回復しますか?この本の提供元が信頼できる場合は、[はい]をクリックします。

それが役に立てば幸い! :)

0
ChocapicSz