Ext.net Grid拖动行排序,【最上】【最下】【上移】【下移】按钮排序

本文介绍如何使用Ext.NET实现GridPanel中拖动选中行进行排序的功能,并提供了完整的示例代码,包括拖动行调整顺序及【最上】【最下】【上移】【下移】按钮的排序功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 对于GridPanel中拖动选中行排序的实现,网上有不少ExtJs实现的例子,但是没有找到使用Ext.net实现的,正好最近有个需求要使用,干脆来写一个。

DEMO功能说明:

  • 1、拖动GridPanel选中行到新位置排序。
  • 2、在拖动结束后,重新会选中前面拖动的行。
  • 3、拖动排序功能支持Grid单选与多选模式。
  • 4、加了【最上】【最下】【上移】【下移】四个按钮排序的功能。目前按钮排序只能在Grid的单选模式下使用。

 

功能演示:

    1. 1、单选

 

2、多选

 

按钮的排序功能,有兴趣的朋友可以自己试一下,就不截图了,在使用按钮排序时,请将SingleSelect设置为true

 

代码:

ASPX页面

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GridRecordOrder.aspx.cs" Inherits="ExtNetSamples.GridDragDrop.GridRecordOrder" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
 <script type="text/javascript">
     var notifyDrop = function (ddSource, e, data) {
         var grid = data.grid;
         var store = grid.store;
         var rows = grid.getSelectionModel().getSelections();
         var cindex = ddSource.getDragData(e).rowIndex;
         if (cindex == undefined || cindex < 0) {
             e.cancel = true;
             return;
         }

         //纪录拖放后被拖放纪录的新rowIndex
         var dragDropedRowIndexs = new Array();

         var newRowIndex = cindex;
         var total = store.getTotalCount();
         //当在选中多行拖动调整时,计算新的行索引起始位置
         if ((cindex + rows.length) > total) {
             newRowIndex = total - rows.length;
         }

         for (var i = 0; i < rows.length; i++) {
             var rowdata = store.getById(rows[i].id);
             if (!this.copy) {
                 store.remove(store.getById(rows[i].id));
                 store.insert(cindex, rowdata);
                 dragDropedRowIndexs[i] = newRowIndex + i;

                 if (parseInt(cindex + 1) < parseInt(total)) {
                    /*
                     *	通过这里取得拖动后的顺序,可处理自己的逻辑,比如存数据库
                     */
                    //拖动行的Order(原顺序)
                     var hiDargId = store.getById(rows[i].id).get("Order");
                     //拖动后的Order(新顺序)
                     var newId = store.getAt(cindex + 1).get("Order");
                     
                 }
             }
         }
         grid.getSelectionModel().selectRows(dragDropedRowIndexs);
     };

     function showErrorMsg(msg) {
         Ext.Msg.show({
             title: '错误',
             msg: msg,
             buttons: Ext.Msg.OK,
             icon: Ext.MessageBox.ERROR
         });
     }

     var selectedRowIndex = undefined;
     /*
      *	行选中事件
      *参数:model:selectionModel,rowIndex:选中行索引
      */
     var rowSelect = function (model, rowIndex) {
         selectedRowIndex = rowIndex;
     }

     function changeOrder(grid, commandName) {
         if (!grid.getSelectionModel().singleSelect) {
             showErrorMsg("使用【最上】【上移】【下移】【最下】按钮调整顺序的方式,暂只支持单选模式,!请设置:ext:RowSelectionModel ID=\"RowSelectionModel1\" SingleSelect=\"<b>true</b>\" runat=\"server\"");
             return;
         }

         //获取选中行
         var selectedRow = grid.getSelectionModel().getSelected();
         //如果没有选中行,提示错误
         if (!selectedRow) {
             showErrorMsg("请选中要调整顺序的行!");
             return;
         }

         var cindex = undefined;
         var store = grid.getStore();
         var total = store.getTotalCount();

         store.remove(selectedRow);
         switch (commandName) {
             case "top":
                 cindex = 0;
                 store.insert(cindex, selectedRow);
                 break;
             case "bottom":
                 cindex = total -1;
                 store.insert(cindex, selectedRow);
                 break;
             case "up":
                 if (selectedRowIndex != undefined && selectedRowIndex > 0) {
                     cindex = selectedRowIndex - 1;
                     store.insert(cindex, selectedRow);
                 }
                 else {
                     cindex = 0;
                     store.insert(cindex, selectedRow);
                 }
                 break;
             case "down":
                 if (selectedRowIndex != undefined && selectedRowIndex < total -1) {
                     cindex = selectedRowIndex + 1;
                     store.insert(cindex, selectedRow);
                 }
                 else {
                     cindex = total -1;
                     store.insert(cindex, selectedRow);
                 }
                 break;
             default:
                 showErrorMsg("没有找到正确的CommandName!");
         }
         //重新选中行
         grid.getSelectionModel().selectRow(cindex);
     }
 </script>
</head>
<body>
    <form id="Form1" runat="server">
        <ext:ResourceManager ID="ResourceManager1" runat="server" />
        <div style="padding-left:20px;">
        <br />
        <h1>拖动Grid的行调整顺序</h1>
        
        <p style="font-size:12px;">拖动行调整顺序,若只使用拖动来调整行顺序,可支持选中多纪录,但若需要使用【最上】、【上移】、【下移】、【最下】按钮的功能,必须设置单选行模式.</p>    
        <br />
        <ext:Store ID="Store1" runat="server">
            <Reader>
                <ext:JsonReader>
                    <Fields>
                        <ext:RecordField Name="Id" />
                        <ext:RecordField Name="Name" />
                        <ext:RecordField Name="Sex" />
                        <ext:RecordField Name="Address" />
                        <ext:RecordField Name="Order" />
                    </Fields>
                </ext:JsonReader>
            </Reader>
        </ext:Store>
        
        <ext:Panel ID="Panel1" runat="server" Width="650" Height="300" Layout="FitLayout" Frame="true">
            <Items>              
                        <ext:GridPanel 
                            ID="GridPanel1" 
                            runat="server" 
                            DDGroup="DDGroup"
                            Draggable="true"
                            StoreID="Store1"
                            EnableDragDrop="true"
                            StripeRows="true"
                            AutoExpandColumn="Address"
                            Width="325"
                            Title="Left">
                            <ColumnModel>
                                <Columns>
                                    <ext:Column ColumnID="Name" Header="姓名" Width="160" DataIndex="Name" />
                                    <ext:Column Header="性别" Width="60" DataIndex="Sex" />
                                    <ext:Column Header="地址" Width="60" DataIndex="Address" ColumnID="Address" />
                                        <ext:Column Header="顺序" Width="60" DataIndex="Order" />
                                </Columns>
                            </ColumnModel>
                            <SelectionModel>
                                <ext:RowSelectionModel ID="RowSelectionModel1" SingleSelect="true" runat="server">
                                <Listeners>
                                <RowSelect Fn="rowSelect" />
                                </Listeners>
                                </ext:RowSelectionModel>
                            </SelectionModel>
                        </ext:GridPanel>                   
            </Items>            
            <BottomBar>
                <ext:Toolbar ID="Toolbar1" runat="server">
                    <Items>
                    <ext:Button runat="Server" ID="BtnTop" Icon="BulletArrowTop" Text="最上">
                    <Listeners>
                    <Click Handler="changeOrder(#{GridPanel1},'top')" />
                    </Listeners>
                    </ext:Button>
                    <ext:ToolbarSpacer />
                    <ext:Button runat="Server" ID="BtnUp" Icon="BulletArrowUp" Text="上移">
                    <Listeners>
                    <Click Handler="changeOrder(#{GridPanel1},'up')" />
                    </Listeners>
                    </ext:Button>   <ext:ToolbarSpacer />
                    <ext:Button runat="Server" ID="BtnDown" Icon="BulletArrowDown" Text="下移" >
                    <Listeners>
                    <Click Handler="changeOrder(#{GridPanel1},'down')" />
                    </Listeners>
                    </ext:Button>   <ext:ToolbarSpacer />
                    <ext:Button runat="Server" ID="BtnBottom" Icon="BulletArrowBottom" Text="最下">
                    <Listeners>
                    <Click Handler="changeOrder(#{GridPanel1},'bottom')" />
                    </Listeners>
                    </ext:Button>
                        <ext:ToolbarFill ID="ToolbarFill1" runat="server" />
                        <ext:Button ID="Button1" runat="server" Text="Reset">
                            <Listeners>
                                <Click Handler="Store1.loadData(Store1.proxy.data);" />
                            </Listeners>
                        </ext:Button>
                    </Items>
                </ext:Toolbar>
            </BottomBar>
        </ext:Panel> 
        
        <ext:DropTarget ID="DropTarget1" runat="server" Target="={GridPanel1.getView().mainBody}" Group="DDGroup">
            <NotifyDrop Fn="notifyDrop" />
        </ext:DropTarget> 
        </div>
    </form>    
</body>
</html>


 

CS:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ExtNetSamples.GridDragDrop
{
    public partial class GridRecordOrder : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            List<object> data = new List<object>();

            for (int i = 0; i < 10; i++)
            {
                data.Add(new
                {
                    Id = i,
                    Name = "Name " + i,
                    Sex = i % 2 == 0 ? "男" : "女",
                    Address = "四川省成都市XX区XX路XX号",
                    Order = i
                });
            }

            this.Store1.DataSource = data;
            this.Store1.DataBind();
        }

    }
}


 DEMO下载地址:http://download.youkuaiyun.com/download/llxchen/3687672

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值