`
babydeed
  • 浏览: 238275 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过拖拽Grid改变行的顺序

    博客分类:
  • Ext
阅读更多
 <script> 
    var meta = [
        {header:'编号',dataIndex:'id', name: 'id'},
        {header:'名称',dataIndex:'name', name: 'name'},
        {header:'描述',dataIndex:'descn', name: 'descn'},
        {header:'日期',dataIndex:'date', name: 'date', type: 'date', dateFormat: 'Y-m-dTH:i:s', renderer: Ext.util.Format.dateRenderer('Y-m-d')}
    ];

    var data = [
        ['1','name1','descn1','1970-01-15T02:58:04'],
        ['2','name2','descn2','1970-01-15T02:58:04'],
        ['3','name3','descn3','1970-01-15T02:58:04'],
        ['4','name4','descn4','1970-01-15T02:58:04'],
        ['5','name5','descn5','1970-01-15T02:58:04']
    ];

    var grid = new Ext.grid.GridPanel({
        height: 380,
        width: 450,
  		renderTo: Ext.getBody(),
        enableDragDrop: true,
        title: '通过拖拽Grid改变行的顺序',
        frame: true,
        enableDrag: true,
        store: new Ext.data.Store({
            autoLoad: true,
            proxy: new Ext.data.MemoryProxy(data),
            reader: new Ext.data.ArrayReader({}, meta)
        }),
        columns: meta,
        viewConfig: {
            columnsText: '显示的列',
            scrollOffset: 30,
            sortAscText: '升序',
            sortDescText: '升序',
            forceFit: true
        },  
        stripeRows: true,
            autoExpandColumn: 1,
            tbar: [{
                text: '上移',
                iconCls: 'up',
                scope: this,
                handler: function(){
                    buttonMove(-1);
                }
            }, {
                text: '下移',
                iconCls: 'down',
                scope: this,
                handler: function(){
                    buttonMove(1);
                }
            }, '-', {
                text: '保存',
                iconCls: 'save',
                scope: this,
                handler: function(){
                    var ds = grid.getStore();
                    var sortIndex = [];
                    for (var i = 0; i < ds.getCount(); i++) {
                        sortIndex.push(ds.data.items[i].id);
                    }
                    Ext.fly('op').dom.value += '------------\n' + sortIndex + '\n';
                    Ext.Ajax.request({
                        url: 'gridDD_sort.ashx?act=save',
                        params: {
                            sortIndex: sortIndex
                        },
                        success: function(response, op){
                            var msg = response.responseText;
                            var obj = Ext.decode(msg);
                            if (obj) {
                                msg = obj.success?"新的行顺序已保存!":obj.data;
                            }
                            Ext.Msg.alert('信息', msg);
                        },
                        failure: function(response, op){
                            Ext.Msg.alert('信息', response.responseText);
                        }
                    });
                }
            }]
        });
                
        function buttonMove(toward){
            var sm = grid.getSelectionModel();
            var data = sm.getSelections();
            if (sm.hasSelection()) {
                //获取选择行第1行
                var rec = sm.getSelected();
                var ds = grid.getStore();
                //默认的插入行
                var rowIndex = ds.indexOfId(rec.id) + toward;
                //判断插入是否已选择,如果已选择,重新获取插入行
                var ri = []; //插入行的行号数组
                for (var i = 1; i < data.length; i++) {
                    var index = ds.indexOfId(data[i].id)
                    ri.push(index);
                }
                //对插入行数组进行排序,下移顺序排序,上移反序排序
                if (toward == 1) {
                    ri.sort(function(x, y){
                        if (parseInt(x) > parseInt(y)) 
                            return 1
                        else 
                            return -1
                    })
                }
                else {
                    ri.sort(function(x, y){
                        if (parseInt(x) > parseInt(y)) 
                            return -1
                        else 
                            return 1
                    })
                }
                //如果插入行是选择行,则插入行前移或后移
                for (var i = 0; i < ri.length; i++) {
                    if (rowIndex == ri[i]) 
                        rowIndex += toward;
                }
                //判断插入行是否已在顶部或底部,不是则执行移动操作
                if (rowIndex < 0) {
                    Ext.Msg.alert('信息', '记录已在顶部');
                }
                else 
                    if (rowIndex >= ds.getCount()) {
                        Ext.Msg.alert('信息', '记录已在底部');
                    }
                    else {
                        move(rowIndex, data);
                    }
            }
            else {
                Ext.Msg.alert('信息', '请选择记录');
            }
        }
                
        function move(rindex, data){
            var ds = grid.getStore(), rdata = ds.getAt(rindex); // 获取插入行的记录
            var toward = 0; // 默认是上移操作
            var index = ds.indexOfId(data[0].id);
            
            if (rindex > index){
                toward = 1 // 如果是下移,修改方向值
            }
                
            // 移除选择行
            for (i = 0; i < data.length; i++) {
                ds.remove(ds.getById(data[i].id));
            }
            // 根据id获取插入行的新位置并根据移动操作计算出插入位置
            rindex = ds.indexOfId(rdata.id) + toward;
            // 从插入位置依次插入选择行
            for (i = 0; i < data.length; i++) {
                ds.insert(rindex, data[i]);
                rindex++;
            }
            
            var sm = grid.getSelectionModel();
            if (sm)sm.selectRecords(data);// 重新选择选择行
        }
        
        new Ext.dd.DropTarget(grid.getEl(), {
            ddGroup: grid.ddGroup || 'GridDD',
            grid: grid,
            gridDropTarget: this,
            notifyDrop: function(dd, e, data){
                
                var t = e.getTarget();// 获取选择行
                var rindex = this.grid.view.findRowIndex(t);
                if (rindex === false) 
                    return false;
                var ds = this.grid.getStore();
                var rdata = ds.getAt(rindex);
                
                // 判断插入行是否选择行,如果是不允许插入
                for (i = 0; i < data.selections.length; i++) {
                    var rowIndex = ds.indexOfId(data.selections[i].id);
                    if (rindex == rowIndex) 
                        rindex = false;
                }
                move(rindex, data.selections)
                return true;
            },
            
            notifyOver: function(dd, e, data){
                var t = e.getTarget();
                var rindex = this.grid.view.findRowIndex(t);
                var ds = this.grid.getStore();
                for (i = 0; i < data.selections.length; i++) {
                    var rowIndex = ds.indexOfId(data.selections[i].id);
                    if (rindex == rowIndex) 
                        rindex = false;
                }
                return (rindex === false) ? this.dropNotAllowed : this.dropAllowed;
            }
        });

    </script>

  

  • 大小: 26.3 KB
分享到:
评论

相关推荐

    通过cookie保存portal的位置和grid的列的顺序,以及grid的列是否显示的保存

    1. **事件监听**:在用户对portal或grid进行操作(如拖动模块、改变列顺序、隐藏/显示列)时,需要监听这些事件并记录用户的选择。 2. **数据序列化**:将用户的设置(如位置坐标、列顺序、显示状态)转换为可存储的...

    SimpleGrid-可拖动,可排序

    1. **拖动功能**:SimpleGrid允许用户直接通过鼠标拖放单元格或行来改变表格中的数据顺序。这种直观的交互方式使得数据管理变得更加便捷,尤其适用于需要频繁调整数据顺序的场景。 2. **排序功能**:在SimpleGrid中...

    仿Zaker拖动grid

    在Android开发中,"仿Zaker拖动grid"是一个常见的需求,主要涉及到的是自定义网格视图(GridView)以及手势识别技术,目的是实现类似Zaker新闻应用中的可拖动、可翻页的效果。Zaker是一款知名的资讯阅读应用,其用户...

    拖动div的四个拐角改变其大小

    标题“拖动div的四个拐角改变其大小”所描述的就是这样一个功能,允许用户通过拖动div的四个角来动态调整div的宽度和高度。 实现这个功能通常会涉及到JavaScript库,例如jQuery。jQuery是一个广泛使用的JavaScript...

    javascript 拖动表格行和列

    在JavaScript编程中,拖动表格行和列的功能可以极大地提升用户交互体验,使得数据操作更加直观和便捷。本文将深入探讨如何实现这个功能,并提供一些关键知识点。 首先,我们需要了解HTML表格的基本结构,即`&lt;table&gt;...

    UltimateGrid

    此外,它的排序、过滤和分页功能让数据管理更为便捷,用户可以通过简单的拖拽或菜单操作来改变数据的展示顺序和范围。 在MFC应用中,UltimateGrid能够无缝集成,提供了丰富的API接口和消息映射机制,方便开发者扩展...

    jquery grid表格插件

    通过集成jQuery UI库中的draggable和droppable组件,用户可以直接通过鼠标拖拽来改变列的顺序,这种直观的操作方式极大地提升了用户的交互体验。实现这一功能的关键在于设置合适的事件监听器,捕获拖放动作,并更新...

    ExtJS获取字段宽度顺序调整后的状态

    3. **列顺序的改变**:用户可以通过拖拽列头到新的位置来改变列的顺序。这依赖于`column.move`事件,当列的位置发生变化时,该事件会携带新旧位置的信息,我们可以通过监听这个事件来记录列的新顺序。 4. **记录...

    JQ JS javascript 拖拽 排序功能 列表排序 菜单排序 表格排序

    拖拽排序是一种用户交互设计,允许用户通过鼠标拖动来改变元素的顺序。这种功能在列表、菜单和表格中尤为常见,提供了直观和便捷的操作体验。在JavaScript中,我们可以监听鼠标事件来实现这一功能。 二、jQuery实现...

    GridView拖拽Item完美实现

    在拖动过程中,我们不仅需要改变界面中的视图位置,还需要相应地调整数据源中的数据顺序。可以使用 `swapItems` 函数来交换数据集中的元素,确保视图和数据的一致性。 4. **动画效果**: 为了提高用户体验,我们...

    原生js可拖拽排列图片布局代码.zip

    这个系统允许用户通过直观地拖拽图片来改变它们在页面上的位置,从而实现自定义的图片排列顺序。下面我们将详细探讨涉及的关键知识点: 1. **事件监听**: - 在JavaScript中,我们需要监听`mousedown`(鼠标按下)...

    仿支付宝首页可拖动可排序可删除

    用户可以通过拖放操作改变元素的顺序,实现这一功能的关键在于跟踪拖放过程中的数据交换,并更新后台的数据源(如数据库或数组)。同时,视图层也需要同步更新以反映这些变化。 4. **可删除功能(Deletable)**: ...

    拖拽时间轴

    在IT领域,时间轴是一种常见的视觉工具,用于呈现和组织按照时间顺序发生的事件或过程。在Web开发中,实现拖拽功能的时间轴可以提供用户友好的交互体验,让用户能够自由地移动时间点或区间,以查看不同的时间段。...

    前端项目-gridstack.js.zip

    - **拖放功能**:利用 jQuery UI 的拖放API,用户可以直观地通过拖拽来改变小部件的位置。 - **响应式设计**:gridstack.js 自动适应不同屏幕尺寸,确保在各种设备上保持良好的视觉效果。 2. **主要功能**: - *...

    SlickGrid一个闪电快速JavaScript网格电子表格

    6. **拖放列**:用户可以自由调整列宽,甚至可以拖动列来改变其顺序。 7. **自定义插件和格式器**:SlickGrid允许开发者创建自定义的插件和单元格格式器,以满足特定的需求。 8. **事件驱动**:提供了丰富的事件API...

    网页模块拖动 灵活布局

    Flexbox适用于一维布局,如行或列,适合处理模块化的容器和子元素的对齐、顺序调整。Grid则为二维布局提供了强大的工具,能够精确控制元素在网格中的位置和大小,适用于创建复杂的网页结构。 3. **JavaScript/ ...

    ext三列拖动

    总结来说,"ext三列拖动"是使用ExtJS实现的一种交互特性,允许用户通过拖放操作自由调整数据表格的列顺序。这个功能的实现涉及到了ExtJS的组件、布局、事件处理以及与后端数据的同步。理解和掌握这一特性,对于开发...

    Jquey购物车拖拽效果

    "jQuery购物车拖拽效果"是指利用jQuery实现的一种交互式功能,让用户能够通过鼠标拖动来调整购物车中商品的位置,提供更直观、友好的用户体验。下面我们将深入探讨这一主题。 首先,jQuery的拖拽效果主要依赖于`...

    可以左右拖动的iframe框架

    **框架布局** 这种左右拖动的iframe框架可能基于CSS布局技术,如Flexbox或Grid。这些现代布局模式使得我们可以方便地控制元素的对齐方式、大小和顺序,特别是在响应式设计中,它们可以帮助我们创建出适应不同屏幕...

Global site tag (gtag.js) - Google Analytics