NEWS

C# - Kéo thả dòng từ một lưới sang một lưới khác trong cùng một form

C# - Kéo thả dòng từ một lưới sang một lưới khác trong cùng một form
Đăng bởi: TONA Cody - Lượt xem: 20026 22:10:21, 20/03/2018DEVEXPRESS   In bài viết

Như tiêu đề đã nêu, bài viết này sẽ hướng dẫn cách lập trình cho gridcontrol để có thể kéo một dòng từ gridcontrol này sang một gridcontrol khác.

Drop and drag row from gridcontrol to another in the same form

Source code sử dụng VS2015 kèm Devexpress 16.2.4

Thực hiện ngay và luôn. Tạo một form gồm 2 gridcontrol như hình:

Tạo form gồm 2 gridcontrol
Tạo form gồm 2 gridcontrol

Kéo 2 cái GridControl từ Toolbox vào form, sau đó chỉnh thuộc tính cho cả 2 GridControl.

Lưu ý:  GridControl khác GridView nha !!!

  1. Thiết lập thuộc tính cho GridControl: Click chuột trái vào gridControl1 và nhấn F4 để mở bảng Properties,  chỉnh AllowDrop thành True. Điều này nhằm cho phép GridControl nhận lệnh nhấn giữ chuột và kéo thả.

laptrinhvb_net-drop-drag-row-gridcontrol-to-another-same-form-2
Thiết lập thuộc tính cho GridControl

Tiếp tục click vào biểu tượng Events (Hình tia sét trong bảng Properties), chuyển sang danh mục các sự kiện của GridControl, click đúp chuột vào sự kiện có tên DragDrop và sự kiện DragOver, để VS sẽ tạo sẵn cho mình 2 cái Events đó. Thực hiện đủ 2 bước cho gridControl2.

laptrinhvb_net-drop-drag-row-gridcontrol-to-another-same-form-3
Tạo sự kiện DragDrop và DragOver cho Grid​​​​​Control

Thiết lập thuộc tính cho GridView: Click chuột vào gridView1, nhấn F4 để mở bảng Properties, trong mục OptionBehavior, chỉnh thuộc tính EditTable thành False.

Bước này nhằm cho phép người dùng có thể nhấn chuột bất kì chỗ nào trong lưới và kéo thả tự do. Bạn có thể bỏ qua bước này, và thay vì kéo thả tự do, bạn có thể nắm đầu dòng và kéo thì vẫn Ô cê như thường.

laptrinhvb_net-drop-drag-row-gridcontrol-to-another-same-form-4
Chọn false cho thuộc tính EditTable cho GridView

Tiếp đến chuyển qua tab Events click đúp chuột vào MouseDown MouseMove. Mình sẽ sử dụng 4 sự kiện này cho chức năng kéo thả dòng.

laptrinhvb_net-drop-drag-row-gridcontrol-to-another-same-form-5
Tạo 2 sự kiện MouseDown và MouseMove cho GridView

Thực hiện tương tự cho gridView2.

Một lưu ý nữa là: Ở gridControl1 và gridView1 chúng ta click chuột vào 2 sự kiện cho mỗi đứa thì ở gridControl2 gridView2 ở các sự kiện đó, chúng ta nhấn chọn sự kiện đã tạo chứ không phải click đúp chuột. Vì 2 cái thằng này sẽ gọi chung một sự kiện tương ứng với từng loại. Ví dụ ở trên tên sự kiện là gridView1_MouseDown, nếu thao tác click đúp chuột ở gridView2 thì nó sẽ tạo ra sự kiện khác là gridView2_MouseDown, thực chất mình chỉ cần trõ tới gridView1_MouseDown là được. Nhớ đánh dấu chỗ này. 

Sau khi hoàn tất các thiết lập, trỡ lại form và nhấn F7 để thực hiện code cho các sự kiện đã tạo ra trên.

public Form1()
        {
            InitializeComponent();

            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));

            dt.Rows.Add(new object[] { 1, "TONA Dinh" });
            dt.Rows.Add(new object[] { 2, "Thảo Meo" });
            dt.Rows.Add(new object[] { 3, "Cái Trí Minh" });
            dt.Rows.Add(new object[] { 4, "Trịnh Quốc Khang" });
            dt.Rows.Add(new object[] { 5, "Mr.Cùi Bắp" });
            dt.Rows.Add(new object[] { 6, "Hoàng Thảo" });
            
            gridControl1.DataSource = dt;
            //DataTable dt3 = new DataTable();
            //dt3.Columns.Add("ID", typeof(int));
            gridControl2.DataSource = dt.Clone();//sẽ copy cấu trúc của Datable nhưng không có dữ liệu
        }

        GridHitInfo downHitInfor = null; //biến lưu cái dòng mình nhấn chuột

        private void gridView1_MouseDown(object sender, MouseEventArgs e)
        {//xử lý hốt cái dòng mình đã nhấn
            GridView view = sender as GridView;
            downHitInfor = null;
            GridHitInfo hitInfor = view.CalcHitInfo(new Point(e.X,e.Y));
            if (Control.ModifierKeys != Keys.None) return;
            if(e.Button==MouseButtons.Left && hitInfor.RowHandle >= 0)
            {
                downHitInfor = hitInfor;
            }
        }

        private void gridView1_MouseMove(object sender, MouseEventArgs e)
        {//Xác định vị trí mà mình nhả chuột ra
            GridView view = sender as GridView;
            if(e.Button==MouseButtons.Left && downHitInfor != null)
            {
                Size dragSize = SystemInformation.DragSize;
                Rectangle dragRect = new Rectangle(new Point(downHitInfor.HitPoint.X - dragSize.Width / 2, downHitInfor.HitPoint.Y - dragSize.Height / 2), dragSize);
                if(!dragRect.Contains(new Point(e.X, e.Y)))
                {
                    DataRow row = view.GetDataRow(downHitInfor.RowHandle);
                    view.GridControl.DoDragDrop(row, DragDropEffects.Move);
                    downHitInfor = null;
                    DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
                }
            }
        }

//Ôi thôi, cứ copy qua là xài thôi.. 
        private void gridControl1_DragDrop(object sender, DragEventArgs e)
        {
            GridControl grid = sender as GridControl;
            DataTable table = grid.DataSource as DataTable;
            DataRow row = e.Data.GetData(typeof(DataRow)) as DataRow;
            if(row!=null && table!=null && row.Table != table)
            {
                table.ImportRow(row);
                row.Delete();
            }
        }

        private void gridControl1_DragOver(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(DataRow)))
            {
                e.Effect = DragDropEffects.Move;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }

Như vậy là đã xong. Nếu thực hiện đủ các bước thì kết quả sẽ là như này. Quá dễ phải không ?  Mặc dù nhìn như kiến bò chẳng hiểu gì hết :D . Kệ đi code ngon á :v

Download Source

Cám ơn đã theo dõi bài viết, nhấn like và share nếu thấy hưu ích hoặc comment góp ý để mình có những bài viết tốt hơn. Chúc các bạn thành công !

HAPPY CODING !

Tags: gridview

THÔNG TIN TÁC GIẢ

BÀI VIẾT LIÊN QUAN

C# - Kéo thả dòng từ một lưới sang một lưới khác trong cùng một form
Đăng bởi: TONA Cody - Lượt xem: 20026 22:10:21, 20/03/2018DEVEXPRESS   In bài viết

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

Đọc tiếp
.