【问题标题】:Show/hide jquery datatable columns conditionally in an aspx page在 aspx 页面中有条件地显示/隐藏 jquery 数据表列
【发布时间】:2017-11-25 23:23:05
【问题描述】:

我在 apsx 页面中有一个单选按钮列表,并希望根据单选按钮选择显示/隐藏 jQuery 数据表中的列。

我设法做到了,但与仅根据单选按钮选择在数据表中填充数据而不触及列的可见性相比,它的速度非常慢。

这就是我所拥有和尝试过的:

(假设单选按钮列表包含“选项 1”、“选项 2”、“选项 3”和“选项 4”作为选项,加上“全部”)。

<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>

Javascript 代码:

<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;
        }
    }

更新

我调整了 Alex 的建议,如下所示,尽管我不确定我是否正确理解了 Alex 以及是否正确执行。我猜不是因为我放入脚本中的“调试器”永远不会被击中。:

$(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;
    }
});

【问题讨论】:

  • 你的 RadioButtonList 有 ID="rblOptions 而在 JS 中你使用 #rblSysType。

标签: jquery asp.net datatables show-hide


【解决方案1】:

&lt;asp:RadioButtonList 呈现为input type="radio" 的列表,而您示例中的Repeater 是table。因此,您可以在客户端轻松完成您想要的操作。像这样。

基于 OP 更新的更新

ASP.NET 可以为控件 ID 添加前缀,因此使用 CSS 类来代替是明智的。只需确保它们在页面上是唯一的即可。

 <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

【讨论】:

  • 谢谢亚历克斯。选项值和表列不完全匹配;如果我选择“选项 2”,我不想隐藏第 2 列。我以这些为例。该选项实际上是机器类型,并且某些列不适用于选定的机器类型(例如,某些列对于选定的机器类型始终为空),因此我需要删除这些列。可以是“选择选项 1 时删除第 1、3 和 4 列”和“选择选项 2 时删除第 2 和 5 列”。查看我问题的 javascript 部分中的“switch”语句。
  • 我根据 Alex 的回复更新了我的问题。仍然无法让它工作。
  • 从RadioButtonList 中删除AutoPostBack="true"。该解决方案适用于客户端。
  • 我按照说明进行操作;添加了 css 类,删除了自动回发,但是当我单击一个选项时,该函数没有被命中(我在函数内添加了“调试器”以查看它是否被命中)。不知道我做错了什么。
  • 我的意思是我在代码中的函数内添加了“调试器”,而不是 sn-p。我确实设法通过添加“onclick='Some_function();”使它工作到单选按钮列表,并在该函数中添加了您提供的代码(带有 case 语句和隐藏列)。但是,因为我删除了自动回发,所以现在当我选择不同的选项时表中的数据不会更新,如果我添加自动回发,列隐藏不起作用。我的头发只剩下最后几根了!
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
相关资源
最近更新 更多