datagrid拖动列头更换排列顺序

在做这个功能的时候在网上找了大量资料,发现都不适用,要不然就是代码太冗余,所以另起炉灶,自己封装了这个函数

下面是完整的代码:

  1 <!DOCTYPE html>
  2 <html>
  3 <head lang="en">
  4     <meta charset="UTF-8">
  5     <title></title>
  6     <link rel="stylesheet" href="easyui/themes/default/easyui.css"/>
  7     <link rel="stylesheet" href="easyui/themes/icon.css"/>
  8     <script src="easyui/jquery.min.js"></script>
  9     <script src="easyui/jquery.easyui.min.js"></script>
 10     <script src="easyui/locale/easyui-lang-zh_CN.js"></script>
 11 </head>
 12 <body>
 13 <div id="tab1">
 14     <table id="removeCell1">
 15     <thead>
 16     <tr>
 17         <th data-options="field:‘X‘,width:50,align:‘center‘,sortable:true">X</th>
 18         <th data-options="field:‘Y‘,width:50,align:‘center‘,sortable:true">Y</th>
 19         <th data-options="field:‘Z‘,width:50,align:‘center‘,sortable:true">Z</th>
 20         <th data-options="field:‘IMSI‘,width:50,align:‘center‘,sortable:true">A</th>
 21         <th data-options="field:‘Status‘,width:50,align:‘center‘,sortable:true">B</th>
 22         <th data-options="field:‘Online‘,width:50,align:‘center‘,sortable:true">C</th>
 23     </tr>
 24     </thead>
 25 </table>
 26 </div>
 27 <div id="tab2">
 28     <table id="removeCell2">
 29     <thead>
 30     <tr>
 31         <th data-options="field:‘X‘,width:50,align:‘center‘,sortable:true">X</th>
 32         <th data-options="field:‘Y‘,width:50,align:‘center‘,sortable:true">Y</th>
 33         <th data-options="field:‘Z‘,width:50,align:‘center‘,sortable:true">Z</th>
 34         <th data-options="field:‘IMSI‘,width:50,align:‘center‘,sortable:true">A</th>
 35         <th data-options="field:‘Status‘,width:50,align:‘center‘,sortable:true">B</th>
 36         <th data-options="field:‘Online‘,width:50,align:‘center‘,sortable:true">C</th>
 37     </thead>
 38 </table>
 39 </div>
 40 <script>
 41     $("#removeCell1").datagrid({
 42         rownumbers:true,
 43         width:380,
 44         height:300,
 45         singleSelect:true,
 46         multiSort:true,
 47         remoteSort:true,
 48         url:"query.json",
 49         onLoadSuccess:function() {
 50             remove("tab1");
 51         }
 52     })
 53     $("#removeCell2").datagrid({
 54         rownumbers:true,
 55         width:380,
 56         height:300,
 57         singleSelect:true,
 58         multiSort:true,
 59         remoteSort:true,
 60         url:"query.json",
 61         onLoadSuccess:function() {
 62             remove("tab2");
 63         }
 64     })
 65
 66     function remove(limit) {
 67         var dom=‘.datagrid-header-inner .datagrid-cell‘;
 68         var tbodyTr = $(".datagrid-view2 .datagrid-body .datagrid-btable tbody tr");
 69         if(limit){
 70             dom=‘#‘+limit+‘ .datagrid-header-inner .datagrid-cell‘;
 71             tbodyTr = $("#"+limit+" .datagrid-view2 .datagrid-body .datagrid-btable tbody tr");
 72         }
 73         $(dom).draggable({
 74             revert: true,
 75             proxy: ‘clone‘
 76         }).droppable({
 77             accept: dom,
 78             onDrop: function (e, source) {
 79                 var destination=$(e.currentTarget).parent().index();
 80                 var start=$(source).parent().index();
 81                 if(destination<start){
 82                     $(source).parent().insertBefore($(e.currentTarget).parent());
 83                 }else{
 84                     $(source).parent().insertAfter($(e.currentTarget).parent());
 85                 }
 86                 for(var i=0;i<tbodyTr.length;i++){
 87                     var cell1=$(tbodyTr[i]).find("td")[destination];
 88                     var cell2=$(tbodyTr[i]).find("td")[start];
 89                     if(destination<start){
 90                         $(cell2).insertBefore($(cell1));
 91                     }else{
 92                         $(cell2).insertAfter($(cell1));
 93                     }
 94                 }
 95             }
 96         });
 97     }
 98 </script>
 99 </body>
100 </html>

我定义了两个table,table外部必须包裹有唯一id的div,这是要保证两个table之间的操作互不影响.

主要实现功能的就是remove()这个函数,里面传入的参数是table外面div的ID,这样可以区分两个table的操作。

如果你的页面只有一个table的话不传参数也是可以的,也可以把limit参数相关的代码删除.

remove()函数需要在datagrid数据加载完成后调用,否则拖动时只有列头改变.

缺点:

这个函数虽然解决了列表拖动的问题,同时也产生了新的问题--------单击排序

当鼠标放到列头时会变成可拖动的标识,这时排序就没用了吗?当然不是,虽然单击时有影响,但是我发现双击还是有用的哦!

如果你对这个缺点不能容忍的话,欢迎提出新的解决方案.

请尊重别人的劳动成果,转载务必标明出处!

时间: 2024-08-09 10:42:48

datagrid拖动列头更换排列顺序的相关文章

WPF DataGrid DataGridTemplateColumn 列头checkbox如何在代码中取消选择

0 登录进行投票 <DataGrid Name="DG">                <DataGrid.Columns>                    <DataGridTemplateColumn Width="70">                        <DataGridTemplateColumn.HeaderTemplate>                            &l

DataGrid列头 checkBox 绑定方式

<DataGridTemplateColumn.HeaderTemplate> <DataTemplate> <CheckBox x:Name="chkSelectAll" HorizontalAlignment="Center" VerticalAlignment="Center" Click="SelectedAll_Checked" IsChecked="{Binding Rela

DataGridView使用技巧七:列顺序的调整、操作行头列头的标题

一.列顺序的调整 设定DataGridView的AllowUserToOrderColumns为True的时候,用户可以自由调整列的顺序. 当用户改变列的顺序的时候,其本身的Index不好改变,但是DisplayIndex改变了.也可以通过程序改变DisplayIndex来改变列的顺序.列顺序发生改变时会引发ColumnDisplayIndexChanged事件. 二.行头和列头 改变DataGridView的第一列列头内容: 1 this.dgv_PropDemo.Columns[0].Hea

DataGrid列头标题居中及列中文本居中

列头标题居中 1 <Style x:Key="ColumnHeaderStyleC" TargetType="DataGridColumnHeader"> 2 <Setter Property="HorizontalContentAlignment" Value="Center"/> 3 <Style.Triggers> 4 <Trigger Property="IsMous

WPF DataGrid某列使用多绑定后该列排序失效,列上加入 SortMemberPath 设置即可.

WPF DataGrid某列使用多绑定后该列排序失效 2011-07-14 10:59hdongq | 浏览 1031 次  悬赏:20 在wpf的datagrid中某一列使用了多绑定,但是该列排序失效,就是点击他的列表头无法进行排序了.xaml如下:<DataGridTextColumn Width="100" Header="{res:Localize Flexem.Studio.HMIControls.AddressLabel.DataType}">

C++ 简单实现MFC ListControl 点击列头排序

说明: SetItemData可以为每一行绑定一个DWORD类型的变量.用GetItemData可以获得这个变量.举个例子,假设CListCtrl中你需要显示某个数据表中的记录,该表有个流水号主键ID,一般这个ID值本身没有什么意义,用户也不需要看,因此在CListCtrl的可见列中,你不需要显示.但往往做具体查询等操作时,你又需要用这个ID来完成.这时,用SetItemData将其绑定到每一行,将非常方便,用户操作哪一行,则用GetItemData可以得到对应记录的ID,直接用来做操作,很爽.

表头列头固定页面

该文章主要是写了一个table页面,并固定表头或者列头,以达到excel冻结列的效果,主要使用的js的scrollTop,scrollLeft. 一.js中scrollTop及scrollLeft的使用说明 scrollTop指的是"元素中的内容"超出"元素上边界"的那部分的高度.例如:外层元素的高度值是200px,内层元素的高度值是300px.很明显,"外层元素中的内容"高过了"外层元素"本身.当向下拖动滚动条时,有部分内容

基于JQuery的可拖动列表格插件TadaTables

前言 最近项目中在使用能够拖动列调整列位置顺序的表格插件---TadaTables,这也是目前我找到的唯一一种存在有这种功能的插件. 在查找使用方法的过程中发现可用案例并不多,且大多言语不详.本文将全面介绍此插件的使用过程. 如果不是有拖动列调整列位置顺序的需求,建议不要使用此插件,坑点较多.后面有事件我写一个名为Bootstrap-table表格插件的使用方法,使用起来比这个插件强多了 正文 英文官网:https://datatables.net/ 中文官网:http://www.datata

WPF (DataGridColumnHeader)实现自义定列头样式 并绑定数据

原文:WPF (DataGridColumnHeader)实现自义定列头样式 并绑定数据 实现功能是这样的 自定义列头 样式 样式里的 数据来源于后台绑定 这篇就说头样式 和头样式数据绑定 思路 1)实现功能的时候 首先想的是编辑列头样式 选择使用DataGridTextColumn 编辑 DataGridColumnHeader 样式 样式很简单 就布局好了 这段结束 2)动态列 没有要求换肤 所以就没有完全使用MVVM 直接写后台循环   到这里数据有了 List<string> LS =