NEWS

[DEVEXPRESS] Di chuyển vào sắp xếp dữ liệu trên GridView sử dụng Behavior Manager

[DEVEXPRESS] Di chuyển vào sắp xếp dữ liệu trên GridView sử dụng Behavior Manager
Đăng bởi: Thảo Meo - Lượt xem: 5901 11:28:50, 14/09/2020C#   In bài viết

Xin chào các bạn, bài viết hôm nay mình sẽ hướng dẫn các bạn cách DragDrop dùng để sắp xếp từng dòng trên GridView sử dụng Behavior Manager Devexpress C# Winform.

[DEVEXPRESS] Re Order Row in GridView C# winform using Behavior manager

Dưới đây là giao diện demo ứng dụng sắp xếp dữ liệu trên Gridview, dưới đây là giao diện demo ứng dụng:

re_order_gridview_devexpress

Ở hình trên, các bạn thấy mình dễ dàng sắp xếp từng dòng theo ý muốn của mình.

Bên thanh công cụ, toolbox các bạn kéo behaviorManager vào project và cấu hình như hình bên dưới:

behavior_devexpress

Full source code Re order drag and drop gridview devexpress C#:

using DevExpress.Utils.DragDrop;
using DevExpress.Utils.Drawing;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace reOrderGridView
{
    public partial class Form1 : DevExpress.XtraEditors.XtraForm
    {
        public Form1()
        {
            InitializeComponent();
            var datatable = new DataTable();
            datatable.Columns.Add("avatar", typeof(byte[]));
            datatable.Columns.Add("stt", typeof(int));
            datatable.Columns.Add("name", typeof(string));
            datatable.Columns.Add("address", typeof(string));
            datatable.Columns.Add("gender", typeof(string));
           

            datatable.Rows.Add(GetImageFromName("Nguyễn Thảo"), 1, "Nguyễn Thảo", "Bà Rịa Vũng Tàu", "Nam");
            datatable.Rows.Add(GetImageFromName("Nguyễn Thị Cẩm Tú"), 2, "Nguyễn Thị Cẩm Tú", "Kiên Giang", "Nữ");
            datatable.Rows.Add(GetImageFromName("Nguyễn Đình Tuyên"), 3, "Nguyễn Đình Tuyên", "Quảng Bình", "Nữ");
            datatable.Rows.Add(GetImageFromName("Nguyễn Phương Nhi"), 4, "Nguyễn Phương Nhi", "Quảng Bình", "Thừa Thiên Huế");
            datatable.Rows.Add(GetImageFromName("Võ Sơn Băng"), 5, "Võ Sơn Băng", "Vĩnh Long", "Nam");
            datatable.Rows.Add(GetImageFromName("Hoàng Thị Thảo"), 6, "Hoàng Thị Thảo", "Nghệ An", "Nữ");
            datatable.Rows.Add(GetImageFromName("Dương Quá"), 7, "Dương Quá", "Trung Quốc", "Nam");
            datatable.Rows.Add(GetImageFromName("Long Cô Cô"), 8, "Long Cô Cô", "Trung Quốc", "Nữ");

            gridControl1.DataSource = datatable;
            HandleBehaviorDragDropEvents();
           gridView1.OptionsBehavior.Editable = false;
        }

        public void HandleBehaviorDragDropEvents()
        {
            DragDropBehavior gridControlBehavior = behaviorManager1.GetBehavior<DragDropBehavior>(this.gridView1);
            gridControlBehavior.DragDrop += Behavior_DragDrop;
            gridControlBehavior.DragOver += Behavior_DragOver;
        }
        private void Behavior_DragOver(object sender, DragOverEventArgs e)
        {
            DragOverGridEventArgs args = DragOverGridEventArgs.GetDragOverGridEventArgs(e);
            e.InsertType = args.InsertType;
            e.InsertIndicatorLocation = args.InsertIndicatorLocation;
            e.Action = args.Action;
            Cursor.Current = args.Cursor;
            args.Handled = true;
           


        }
        private void Behavior_DragDrop(object sender, DevExpress.Utils.DragDrop.DragDropEventArgs e)
        {
            GridView targetGrid = e.Target as GridView;
            GridView sourceGrid = e.Source as GridView;
            if (e.Action == DragDropActions.None || targetGrid != sourceGrid)
                return;
            DataTable sourceTable = sourceGrid.GridControl.DataSource as DataTable;

            Point hitPoint = targetGrid.GridControl.PointToClient(Cursor.Position);
            GridHitInfo hitInfo = targetGrid.CalcHitInfo(hitPoint);

            int[] sourceHandles = e.GetData<int[]>();

            int targetRowHandle = hitInfo.RowHandle;           
            int targetRowIndex = targetGrid.GetDataSourceRowIndex(targetRowHandle);

            List<DataRow> draggedRows = new List<DataRow>();
            foreach (int sourceHandle in sourceHandles)
            {
                int oldRowIndex = sourceGrid.GetDataSourceRowIndex(sourceHandle);
                DataRow oldRow = sourceTable.Rows[oldRowIndex];
                draggedRows.Add(oldRow);
            }

            int newRowIndex;

            switch (e.InsertType)
            {
                case InsertType.Before:
                    newRowIndex = targetRowIndex > sourceHandles[sourceHandles.Length - 1] ? targetRowIndex - 1 : targetRowIndex;
                    for (int i = draggedRows.Count - 1; i >= 0; i--)
                    {
                        DataRow oldRow = draggedRows[i];
                        DataRow newRow = sourceTable.NewRow();
                        newRow.ItemArray = oldRow.ItemArray;
                        sourceTable.Rows.Remove(oldRow);
                        sourceTable.Rows.InsertAt(newRow, newRowIndex);
                    }
                    break;
                case InsertType.After:
                    newRowIndex = targetRowIndex < sourceHandles[0] ? targetRowIndex + 1 : targetRowIndex;
                    for (int i = 0; i < draggedRows.Count; i++)
                    {
                        DataRow oldRow = draggedRows[i];
                        DataRow newRow = sourceTable.NewRow();
                        newRow.ItemArray = oldRow.ItemArray;
                        sourceTable.Rows.Remove(oldRow);
                        sourceTable.Rows.InsertAt(newRow, newRowIndex);
                    }
                    break;
                default:
                    newRowIndex = -1;
                    break;
            }
            int insertedIndex = targetGrid.GetRowHandle(newRowIndex);
            targetGrid.FocusedRowHandle = insertedIndex;
            targetGrid.SelectRow(targetGrid.FocusedRowHandle);

            if (checkEdit1.Checked)
            {
                ReOrder();
            }
           
        }

        public byte[] GetImageFromName(string name)
        {
            var char_name = GetFirstAndLastLetterFromName(name);
            Size imageSize = new System.Drawing.Size(32, 32);
            Image img_name = GlyphPainter.CreateRoundedStubGlyph(defaultLookAndFeel1.LookAndFeel, imageSize, char_name);
            using (var ms = new MemoryStream())
            {
                img_name.Save(ms, ImageFormat.Png);
                return ms.ToArray();
            }
        }


        public string GetFirstAndLastLetterFromName(string name)
        {
            string first = name.Substring(0, 1);
            char[] charArray = name.ToCharArray();
            Array.Reverse(charArray);
            string last = new string(charArray);

            if (last.Contains(' '))
            {
                char[] splitchar = { ' ' };
                string[] temp = last.Split(splitchar);
                int b = temp[0].ToString().Length - 2;
                int c = temp[0].ToString().Length - 1;
                last = temp[0].ToString().Substring(c, 1);
            }
            else
            {
                return first.ToUpper();
            }

            return ConvertToUnsign(first + last).ToUpper();
        }

        Regex ConvertToUnsign_rg = null;

        public string ConvertToUnsign(string strInput)
        {
            if (ReferenceEquals(ConvertToUnsign_rg, null))
            {
                ConvertToUnsign_rg = new Regex("p{IsCombiningDiacriticalMarks}+");
            }
            var temp = strInput.Normalize(NormalizationForm.FormD);
            return ConvertToUnsign_rg.Replace(temp, string.Empty).Replace("đ", "d").Replace("Đ", "D").ToLower();
        }

        public void ReOrder()
        {
            var dataView = gridView1.DataSource as DataView;
            int index = 1;
            foreach (DataRowView rowView in dataView)
            {
                DataRow row = rowView.Row;
                row["stt"] = index;
                index++;
            }
        }

        private void btn_reorder_Click(object sender, EventArgs e)
        {
            ReOrder();
        }
    }
}

Thanks for watching!

DOWNLOAD SOURCE

THÔNG TIN TÁC GIẢ

BÀI VIẾT LIÊN QUAN

[DEVEXPRESS] Di chuyển vào sắp xếp dữ liệu trên GridView sử dụng Behavior Manager
Đăng bởi: Thảo Meo - Lượt xem: 5901 11:28:50, 14/09/2020C#   In bài viết

CÁC BÀI CÙNG CHỦ ĐỀ

Đọc tiếp
.