获取DataTable中隐藏列的值

Posted

技术标签:

【中文标题】获取DataTable中隐藏列的值【英文标题】:Get value of hidden column in DataTable 【发布时间】:2021-10-16 00:38:02 【问题描述】:

在我的页面上选择按钮后,我需要遍历 DataTable,找到带有选中单选按钮的行,然后从该行的隐藏列中获取值。我已经尝试了几乎所有东西,但我的隐藏列无法访问,只有我的 3 个可见列。我的代码示例有几个我尝试过的选项,如果有点混乱,我深表歉意。这是我第一次发帖,如果我在这里搞砸了,请不要生气。我见过 .fnGetData 选项,但它被列为“旧版”,所以我宁愿不使用它 (???)。

表设置:

    var thisurl = '@Url.Action("Addresses", new  AddUID = "000" )';
    thisurl = thisurl.replace("000", @ViewBag.AddUID);
    
    $('#@ViewBag.TblID').dataTable(
        "columnDefs": [
            
                "targets": [0, 1],
                "visible" : false
            
        ],
        "searching": false,
        "info": false,
        "paging": false,
        "order": [1, "desc"],
        "ajax": 
            "type": "POST",
            "url": thisurl,
            "contentType": 'application/json; charset=utf-8',
            "data": function (data)  return data = JSON.stringify(data); 
        ,
        "columns": [
             "data": "Adrs_UID" ,
             "data": "revision_id" ,
            
                "render": function (data, type, row) 
                    var url = '@html.RadioButton("000", "select", false, htmlAttributes: new  @id = "111", onclick = "ResetRadioBtns()" )';
                    url = url.replace("000", '@ViewBag.ChkID').replace("111", '@ViewBag.ChkID');
                    return url;
                
            ,
            
                "render": function (data, type, row) 
                    return row.Adrs_One + ' ' + row.Adrs_City + ' ' + row.Adrs_St + ' ' + row.Adrs_Zip;
                
            ,
            
                "render": function (data, type, row) 
                    var text = 'Print';
                    var target = '_blank';
                    var link = '../DocGen/DocGen_AB.aspx?AUID=' + row.Adrs_UID + '&REV=' + row.revision_id;
                    return '<a href="' + link + '" target="' + target + '">' + text + '</a>';
                
            
        ]
    );

脚本

                $('.btnAPL_DTV').click(function (e) 
                
                        var table = $('#tblAPLAddress_DTV').DataTable();
                        table.rows().every(function (value, index) 
                                node = table.row(value).node();
                                var check = $(node).find("input[id$='chbxAPLAdSelect_DTV']");
                                var data1 = $('#tblAPLAddress_DTV').DataTable().row(this).data();
                                data = data1[0];
                                
                                if (check.prop("checked") == true) 
                                    // Get Rev_Id & Adrs_UID from Hiddent Field
                                    var allData = table.row(index).data();
                                    var revData = allData[0].data();
                                    adrsUID = node.data()[0];
                                    revId = node.data()[1];
                                
                        );
                );


2021 年 8 月 13 日更新

Andrew - 这里是脚本代码和我昨天使用您的示例的结果(包括使用索引值,以便您可以看到我昨天做了什么):

$("#tblAPLAddress_DTV").on("click", ":radio", function () 
    var table = $('#tblAPLAddress_DTV').DataTable();
    var rowNode = $(this).parent().parent()[0];
    console.log("Result using .Adrs_UID:  " + table.row(rowNode).data().Adrs_UID);
    console.log("Result using Index Value: " + table.row(rowNode).data()[0]);
);

这是我在控制台中显示的结果:

Result using .Adrs_UID:  undefined
Result using Index Value: <input id="chbxAPLAdSelect_DTV" name="chbxAPLAdSelect_DTV" onclick="ResetRadioBtns()" type="radio" value="select">

我不确定您指的是哪个 HTML。这是我的 HTML 表格设置。 @ViewBag.TblID = "tblAPLAddress_DTV":

<div class="row">
    <div class="col-md-offset-1">
        <table id=@ViewBag.TblID class="table text-nowrap" style="padding-top:1em">
            <thead>
                <tr>
                    <th>Address UID</th>
                    <th>RevisionID</th>
                    <th></th>
                    <th>Address</th>
                    <th>Address Block</th>
                </tr>
            </thead>
        </table>
    </div>
</div>

我认为这并不重要,但如果确实如此,我深表歉意。我上面的表格 HTML 设置和表格定义脚本位于部分视图中。 这是索引视图中调用 PartialView 的 Html 调用:

@ Html.RenderAction("_Addresses", "DocGeneration", new  id = "tblAPLAddress_DTV", chkId = "chbxAPLAdSelect_DTV", AddUID = ViewBag.AddUID );

希望这能为您提供所需的信息。


更新 2 更新脚本:

$("#tblAPLAddress_DTV").on("click", ":radio", function () 
    var table = $('#tblAPLAddress_DTV').DataTable();
    var rowNode = $(this).parent().parent()[0];
    console.log(rowNode);
);

控制台结果 - 我没有深入研究。

<tr role="row" class="odd">
    <td class="sorting_1">
        <input id="chbxAPLAdSelect_DTV" name="chbxAPLAdSelect_DTV" onclick="ResetRadioBtns()" type="radio" value="select">
    </td>
    <td>17647 157TH STREET BONNER SPRINGS XX 66000</td>
    <td><a href="../DocGen/DocGen_AB.aspx?AUID=9546&amp;REV=3" target="_blank">Print</a></td>
</tr>

这些控制台结果与生成的 HTML 相同。 谢谢!

【问题讨论】:

【参考方案1】:

我采用了您的表格和代码的简化版本来展示一种可能的方法:

$(document).ready(function() 

  var table = $('#example').DataTable( 
    "columnDefs": [
      
        "targets": [0, 1],
        "visible" : false
      
    ]
   );

  $( "#example" ).on( "click", ":radio", function() 
    var rowNode = $( this ).parent().parent()[0];
    console.log( table.row(rowNode).data()[0] );
  );

 );
<!doctype html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Demo</title>
  <script src="https://code.jquery.com/jquery-3.5.1.js"></script>
  <script src="https://cdn.datatables.net/1.10.22/js/jquery.dataTables.js"></script>
  <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.22/css/jquery.dataTables.css">
  <link rel="stylesheet" type="text/css" href="https://datatables.net/media/css/site-examples.css">

</head>

<body>

<div style="margin: 20px;">

    <table id="example" class="display dataTable cell-border" style="width:100%">
        <thead>
            <tr>
                <th>Name</th>
                <th>Position</th>
                <th>Office in Country</th>
                <th>Age</th>
                <th>Start date</th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Tiger Nixon</td>
                <td>System Architect</td>
                <td>Edinburgh</td>
                <td>61</td>
                <td>2011/04/25</td>
                <td><input type="radio"></td>
            </tr>
            <tr>
                <td>Garrett Winters</td>
                <td>Accountant</td>
                <td>Tokyo</td>
                <td>63</td>
                <td>2011/07/25</td>
                <td><input type="radio"></td>
            </tr>
            <tr>
                <td>Ashton Cox</td>
                <td>Junior "Technical" Author</td>
                <td>San Francisco</td>
                <td>66</td>
                <td>2009/01/12</td>
                <td><input type="radio"></td>
            </tr>
            <tr>
                <td>Cedric Kelly</td>
                <td>Senior javascript Developer</td>
                <td>London</td>
                <td>22</td>
                <td>2012/03/29</td>
                <td><input type="radio"></td>
            </tr>
            <tr>
                <td>Airi Satou</td>
                <td>Accountant</td>
                <td>Milan</td>
                <td>33</td>
                <td>2008/11/28</td>
                <td><input type="radio"></td>
            </tr>
        </tbody>
    </table>

</div>

</body>
</html>

(在我的例子中,单选按钮在每次点击后都不会被清除,因为我没有添加那个逻辑。)

这是如何工作的:

我使用委托的事件处理程序:

$( "#example" ).on( "click", ":radio", function()  ... 

这允许将事件附加到最初可能未绘制的单选按钮 - 例如,如果它们不在 DataTable 的分页数据的第 1 页上。

我使用 jQuery 提取行节点(&lt;tr&gt; 元素):

var rowNode = $( this ).parent().parent()[0];

在我的例子中,行节点是单选按钮的祖父母 (.parent().parent())。您的情况可能略有不同。我不知道你最终渲染的 HTML 结构是什么。

在我的例子中,每一行数据都存储为一个值数组(而不是一个对象),所以我可以使用以下方法来访问第一个隐藏值:

table.row(rowNode).data()[0]

请注意,table 变量已定义为 DataTable 声明的一部分。

如果您的行数据以对象 ... 而不是数组[ ... ] 的形式提供,您将需要相应地调整您的代码。

您可以将table.row(rowNode).data() 登录到控制台以亲自查看。您尚未向我们展示您的 JSON 数据,但您似乎需要访问命名值,例如 adrsUID - 所以可能是这样:

table.row(rowNode).data().adrsUID

【讨论】:

感谢您回复安德鲁。我尝试了您的代码,但结果是:&lt;input id="chbxAPLAdSelect_DTV" name="chbxAPLAdSelect_DTV" onclick="ResetRadioBtns()" type="radio" value="select"&gt; 我的一行数据如下所示:"Adrs_UID": 9546, "Adrs_One": "17647 157TH STREET", "Adrs_City": "B SPRINGS","Adrs_St": "XX","Adrs_Zip": "00000","Updated_Date": "/Date(1378740584860)/","revision_id": 3。关于我正在做的不同的事情有什么想法吗? 您应该编辑您的问题并在此处添加此信息。在 cmets 中添加代码并不是很有效。但是...(1)如果您的行数据使用Adrs_UID,那么您需要在我的代码版本中使用它:table.row(rowNode).data().Adrs_UID。 (2) 你需要准确地展示你的尝试是什么样子。否则,这只是我的猜测。我真的不知道您所说的“我的结果是……”是什么意思,因为我不知道您使用什么代码来生成该结果。 (3) 您还需要显示您正在使用的 HTML。 嗨安德鲁(詹姆斯?)。我更新了我的问题。谢谢。 感谢您的更新。首先,console.log( rowNode ); 显示什么?它应该为包含单击的单选按钮的行打印&lt;tr&gt; 节点。如果没有,那么我需要在此处查看您的代码生成的 HTML(最终结果 HTML,而不是源 HTML)。这样我就可以看到您的单选按钮是如何创建的,以及典型行的结构。看到最终结果的示例&lt;tr&gt;...&lt;/tr&gt; HTML 就足够了。 您的 rowNode 结构看起来与我预期的一样 - 所以,很抱歉,但我看不出您的代码行为与我的示例不同的任何明显原因。

以上是关于获取DataTable中隐藏列的值的主要内容,如果未能解决你的问题,请参考以下文章

datatable隐藏列设置及获取隐藏列的值

jquerydatatable 获取隐藏列

如何遍历jquery数据表中的隐藏列

如何遍历jquery数据表中的隐藏列

从datatable里取某行某列的值

怎么修改datatable中某一列的值?