2016-09-29 17 views
6

私はC#とJQuery Datatablesを使用してレポートダッシュボードを構築しています。このページのレポートの1つに、ドロップダウンリストを含む更新パネルが含まれています。ユーザーが選択を変更すると、ddlの選択に基づいてデータがリフレッシュされます。各ブロック内には、データをExcelにエクスポートするサーバー側の呼び出しを行うリンクもあります。問題は、Excelのエクスポートリンクをクリックすると、他のExcelのダウンロードリンクと同様に、ドロップダウンリストが機能を失うことです。ここでjQuery Datatables ASP.NETの問題

は私のコードです:

<div id="dTopProducts" class="dashboardDiv" style="height:400px; width:485px; margin-top: 15px; margin-bottom:15px; margin-right: 15px;" runat="server"> 

    <asp:UpdatePanel ID="upProducts" runat="server"> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="ddlProductsSector" EventName="SelectedIndexChanged" /> 
     </Triggers> 
     <ContentTemplate> 

      <div style="float: left;"> 
       <h2>Top Products&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</h2> 
      </div> 

      <div style="float: left; "> 
       <asp:DropDownList 
        ID="ddlProductsSector" 
        AutoPostBack="true" 
        EnableViewState="true" 
        OnSelectedIndexChanged="ddlProductsSector_SelectedIndexChanged" 
        runat="server" /> 
      </div> 

      <asp:UpdateProgress ID="prgProducts" AssociatedUpdatePanelID="upProducts" runat="server"> 
       <ProgressTemplate> 
        <epriLoader:Loader runat="server" /> 
       </ProgressTemplate> 
      </asp:UpdateProgress> 

      <asp:ListView 
       ID="lvTopProducts" 
       runat="server"> 

       <ItemTemplate> 
        <tr style="padding-top: 5px; padding-bottom: 5px;"> 
         <td style="padding-left: 0px;"><%# Eval("productId") %></td> 
         <td><%# Eval("productDesc") %></td> 
         <td style="text-align: right;"><%# Eval("quantity") %></td> 
        </tr> 
       </ItemTemplate> 

       <EmptyDataTemplate> 
        <div style="float: left; padding-top: 25px;"> 
         There are no product records found for the criteria provided 
        </div> 
       </EmptyDataTemplate> 

       <LayoutTemplate> 
        <table id="tblTopProducts" style="width: 100%"> 

         <thead> 
          <tr style="padding-bottom: 10px; border: none;"> 
           <th style="text-align: left; border: none; padding-left: 0px;">ID</th> 
           <th style="text-align: left; border: none; padding-left: 0px;">Name</th> 
           <th style="text-align: right; border: none;">Quantity</th> 
          </tr> 
         </thead> 

         <tfoot> 
          <tr> 
           <td style="border: none;"></td> 
           <td style="border: none;"></td> 
           <td style="border: none;"></td> 
          </tr> 
         </tfoot> 

         <tbody runat="server"> 
          <asp:PlaceHolder ID="itemPlaceholder" runat="server" /> 
         </tbody> 

        </table> 
       </LayoutTemplate> 
      </asp:ListView> 

     </ContentTemplate> 
    </asp:UpdatePanel> 

    <%--Link that calls full export from funding page--%> 
    <a id="aTopProducts" class="invoicesLink" title="Click here to download full report" onserverclick="ExportTopProductsToExcel" runat="server">Download full Report</a> 
</div> 

はここでjQueryの:

function bindTopProductsTable() { 

    var topProductsTable = $('#tblTopProducts').dataTable(
     { 
      "scrollY": "225px", 
      "scrollCollapse": true, 

      "bSort": true, 
      "order": [[2, "desc"]], 
      "paging": false, 

      dom: '<"toolbar">rt<"floatRight"B><"clear">', 

      buttons: { 
       buttons: [ 
        { extend: 'excel', text: 'Export to Excel', exportOption: { page: 'current' }, footer: true, className: 'productsExportButton' } 
       ] 
      } 

     }); 

}; 

このコードは、更新パネルを処理するための場所である:

$(function() { 
    bindTopProductsTable(); // bind data table on first page load 

    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(bindTopProductsTable); // bind data table on every UpdatePanel refresh 
}); 

私は取得していますエラー:

未定義またはnull参照のプロパティ 'スタイル'を取得できません。

これはIE JSデバッガから完全なエラーは次のとおりです。

j.find("thead, tfoot").remove();j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());j.find("tfoot th, tfoot td").css("width","");n=qa(a,j.find("thead")[0]);for(m=0;m<i.length;m++)o=c[i[m]],n[m].style.width=null!==o.sWidthOrig&&""!==o.sWidthOrig?x(o.sWidthOrig):"",o.sWidthOrig&&f&&h(n[m]).append(h("<div/>").css({width:o.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(m=0;m<i.length;m++)t=i[m],o=c[t],h(Gb(a,t)).clone(!1).append(o.sContentPadding).appendTo(r);h("[name]", 

は驚くことではないが、これは、Chromeで完全に正常に動作IEに吹きます。

+0

テンプレートのスタイル属性を削除するとどうなりますか?それがうまくいくなら、おそらくクラス(css)を使うことができます。これはより良いアプローチです:)。それらが再びIEをひそかにしてしまうのであれば、おそらくdataTablesに未完成のイベントがあり、あなたを接続して目的のCSSを適用させることができます。 –

+0

UpdatePanelから 'Triggers'セクションを削除することができます。 'ChildrenAsTriggers'はデフォルトで' true'なので、 'ddlProductsSector'はすでに非同期ポストバックトリガーです。 – ConnorsFan

+0

'add_endRequest'の代わりに' add_pageLoaded'を使って 'bindTopProductsTable'イベントハンドラを設定することもできます。 UpdatePanelがリフレッシュされるたびに実行されます。 – ConnorsFan

答えて

2

私はそれを理解しました。 Sharepointには、誰かがボタンを2回クリックしないようにするフラグがあります。私はこのコードを追加しました:

function setFormSubmitToFalse() { 
    setTimeout(function() { _spFormOnSubmitCalled = false; }, 3000); 
    return true; 
} 

今はうまくいきます。