2017-11-25 24 views
0

라디오 버튼 목록을 apsx 페이지에두고 라디오 버튼 선택에 따라 jQuery 데이터 테이블의 열을 표시하거나 숨기려고합니다.aspx 페이지에서 jquery datatable 열을 조건부로 표시/숨기기

나는 그럭저럭 할 수 있었지만 라디오 버튼 선택에 기반한 데이터 테이블에 데이터를 채우고 열 가시성을 만지지는 못했지만 느려졌다.

(라디오 버튼리스트를 가정하면, 선택, 플러스 "모든으로"옵션 3 "와"옵션 4 "를"옵션 2 "를"옵션 1 "을 포함

내가 무엇을 내가 시도 것입니다 ").

<asp:RadioButtonList runat="server" ID="rblOptions" 
    ClientIDMode="Static" 
    DataSourceID="odsOptionss" 
    DataTextField="Option" 
    DataValueField="OptionID" 
    AutoPostBack="true" 
    AppendDataBoundItems="true"> 
    <asp:ListItem Text="All" Value="-1" Selected="True" /> 
</asp:RadioButtonList> 

<div runat="server" id="divAll" clientidmode="Static"> 
    <table id="svDataTable" class="table table-striped table-bordered table-hover table-responsive"> 
     <thead> 
      <tr> 
       <th>Col1</th> 
       <th>Col2</th> 
       <th>Col3</th> 
       <th>Col4</th> 
       <th>Col5</th> 
      </tr> 
     </thead> 

     <tbody> 
      <asp:Repeater runat="server" ID="rptTableData"> 
       <ItemTemplate> 
        <tr> 
         <td runat="server" id="tdCol1"><%# Eval("Col1Data") %></td> 
         <td runat="server" id="tdCol2"><%# Eval("Col2Data") %></td> 
         <td runat="server" id="tdCol3"><%# Eval("Col3Data") %></td> 
         <td runat="server" id="tdCol4"><%# Eval("Col4Data") %></td> 
         <td runat="server" id="tdCol5"><%# Eval("Col5Data") %></td> 
        </tr> 
       </ItemTemplate> 
      </asp:Repeater> 
     </tbody> 
    </table> 
</div> 

자바 스크립트 코드 :

<script typeof="text/javascript"> 
    $(function() { 
     bindDataTable(); // bind data table on first page load 
     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(bindDataTable); // bind data table on every UpdatePanel refresh 
    }); 

    function bindDataTable() { 
     var selectedOption = $("#rblOptions input[type=radio]:checked"); 
     var optionId = selectedOption.val(); 
     var option = selectedOption.next().html(); 

     if ($.fn.dataTable.isDataTable('#svDataTable')) { 
      table = $('#svDataTable').DataTable(); 
     } 
     else { 
      table = $('#svDataTable').DataTable({ 
       "bStateSave": true, 
       "fnStateSave": function (oSettings, oData) { 
        localStorage.setItem('svDataTable', JSON.stringify(oData)); 
       }, 
       "fnStateLoad": function (oSettings) { 
        return JSON.parse(localStorage.getItem('svDataTable')); 
       } 
      }); 
     } 
     switch (option) { 
      case 'All': 
       break; 

      case 'Option 1': 
       table.column(3).visible(false); 
       table.column(4).visible(false); 
       table.column(5).visible(false); 
       break; 

      case 'Option 2': 
       table.column(2).visible(false); 
       table.column(3).visible(false); 
       break; 

      case 'Option 3': 
       break; 

      case 'Option 4': 
       table.column(1).visible(false); 
       table.column(2).visible(false); 
       break; 
     } 
    } 

업데이트

는 내가 확실하지 오전하지만 나는 알렉스를 제대로 이해하면, 아래와 같은 알렉스의 제안을 채택하고 생각하면 그 일을 바르게. 내가 "디버거"becuasee하지 같아요 나는

$(function() { 
    bindDataTable(); // bind data table on first page load 
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(bindDataTable); // bind data table on every UpdatePanel refresh 
}); 

function bindDataTable() { 
    if ($.fn.dataTable.isDataTable('#svDataTable')) { 
     table = $('#svDataTable').DataTable(); 
    } 
    else { 
     table = $('#svDataTable').DataTable({ 
      "bStateSave": true, 
      "fnStateSave": function (oSettings, oData) { 
       localStorage.setItem('svDataTable', JSON.stringify(oData)); 
      }, 
      "fnStateLoad": function (oSettings) { 
       return JSON.parse(localStorage.getItem('svDataTable')); 
      } 
     }); 
    } 
} 

$('#rblSysType').on('click', '[type=radio]', function() { 
    var tbl = $('#svDataTable'); 
    $('td, th', tbl).show(); 
debugger 
    var selectedSysType = $("#rblSysType input[type=radio]:checked"); 
    var sysTypeId = selectedSysType.val(); 
    var sysType = selectedSysType.next().html(); 

    switch (sysType) { 
     case 'Option 2': 
     case 'Opion 4': 
     case 'All': 
      break; 

     case 'Option 1': 
      $('tr>*:nth-child(8)', tbl).hide(); 
      $('tr>*:nth-child(9)', tbl).hide(); 
      $('tr>*:nth-child(10)', tbl).hide(); 
      $('tr>*:nth-child(11)', tbl).hide(); 
      $('tr>*:nth-child(12)', tbl).hide(); 
      $('tr>*:nth-child(13)', tbl).hide(); 
      break; 

     case 'Option 3': 
      $('tr>*:nth-child(11)', tbl).hide(); 
      $('tr>*:nth-child(12)', tbl).hide(); 
      $('tr>*:nth-child(13)', tbl).hide(); 
      break; 

     case 'Option 5': 
      $('tr>*:nth-child(11)', tbl).hide(); 
      $('tr>*:nth-child(12)', tbl).hide(); 
      break; 
    } 
}); 
+0

귀하의'RadioButtonList'이 **'ID가 = "rblOptions' ** 그리고 JS에서 당신은 **'# rblSysType' ** ** –

답변

0

<asp:RadioButtonListinput type="radio" 목록으로 렌더링 : 절대 공격 않겠다 스크립트에 넣어 당신의 예에서 Repeatertable이다. 따라서 클라이언트 측에서 원하는 것을 쉽게 수행 할 수 있습니다. 이 같은. 대신 CSS 클래스를 사용하는 스마트 그래서 OP 업데이트를 기반으로

업데이트

ASP.NET은 제어 ID에 접두사를 추가 할 수 있습니다. 페이지에서 고유한지 확인하십시오.

<asp:RadioButtonList runat="server" ID="rblOptions" CssClass="make-list"... 

최종 갱신

먼저 당신이 정확하게 원하는 것을 결정한다.

중계기의이 RadioButtonList 선택에 따라 내용 및 레이아웃은 다음 최선의 선택이 (RadioButtonList AutoPostBack="true"과) 서버 측 코드를 사용 repeater_ItemDataBound 핸들러에서/숨기기를 표시할지 결정하는 경우. 여전히

ScriptManagerRegisterStartupScript(... 

$('.make-list').on('click', '[type=radio]', function() { 
 
    //var make = this.parentNode.innerText; //if you want to use text instead of value (not recommended) 
 
    var tbl = $('#svDataTable'); 
 
    $('td, th', tbl).show(); 
 
    if (this.value == -1) 
 
    return; //show all 
 
    switch (this.value) {//**this** is radio button clicked 
 
    case "1": 
 
     $('tr>*:nth-child(1),tr>*:nth-child(3)', tbl).hide(); 
 
     break; 
 
    case "2": 
 
     $('tr>*:nth-child(2),tr>*:nth-child(3),tr>*:nth-child(5)', tbl).hide(); 
 
     break; 
 
    default: 
 
     $('tr>*:nth-child(' + this.value + ')', tbl).hide(); 
 
     break; 
 
    } 
 
});
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="opts" class="make-list">Hide a column 
 
    <label><input type="radio" name="opt" value="-1" />show all</label> 
 
    <label><input type="radio" name="opt" value="1" />one</label> 
 
    <label><input type="radio" name="opt" value="2" />two</label> 
 
    <label><input type="radio" name="opt" value="3" />three</label> 
 
    <label><input type="radio" name="opt" value="4" />four</label> 
 
    <label><input type="radio" name="opt" value="5" />five</label> 
 
</div> 
 
<table id="svDataTable" class="table table-striped table-bordered table-hover table-responsive"> 
 
    <thead> 
 
    <tr> 
 
     <th>Col1</th> 
 
     <th>Col2</th> 
 
     <th>Col3</th> 
 
     <th>Col4</th> 
 
     <th>Col5</th> 
 
    </tr> 
 
    </thead> 
 

 
    <tbody> 
 
    <tr> 
 
     <td>dat 1.1</td> 
 
     <td>dat 1.2</td> 
 
     <td>dat 1.3</td> 
 
     <td>dat 1.4</td> 
 
     <td>dat 1.5</td> 
 
    </tr> 
 
    <tr> 
 
     <td>dat 2.1</td> 
 
     <td>dat 2.2</td> 
 
     <td>dat 2.3</td> 
 
     <td>dat 2.4</td> 
 
     <td>dat 2.5</td> 
 
    </tr> 
 
    </tbody> 
 
</table>

플러스 bootstrap.css에서 해당 코드를 다음 몇 가지 클라이언트 측 코드를 추가 호출 할 경우

+0

Alex에게 감사드립니다. 옵션 값과 테이블 열이 정확히 일치하지 않아서,"옵션 2 "를 선택하면 열을 숨기고 싶지 않습니다. 2. 나는 이것을 예제로 사용했다. 옵션은 실제로는 컴퓨터 유형이다. 일부 열은 선택한 시스템 유형에 적용되지 않습니다 (예 : 일부 열은 선택한 컴퓨터 유형에서 항상 비어 있음) 이러한 열을 제거해야합니다.옵션 1이 선택되면 1, 3, 4 열을 제거하고 2는 옵션 2가 선택된 경우 열 2와 5를 제거 할 수 있습니다. 내 질문의 자바 스크립트 부분에서 "스위치"성명을 봐. – NoBullMan

+0

알렉스의 답변에 따라 질문을 업데이트했습니다. 아직도 작동시킬 수는 없습니다. – NoBullMan

+0

'RadioButtonList'에서'AutoPostBack = "true"를 제거하십시오. 이 솔루션은 클라이언트 측에서 작동합니다. –