- [DEVEXPRESS] Chia sẻ source code cách tạo biểu đồ sơ đồ tổ chức công ty Org Chart trên Winform C#
- [C#] Hướng dẫn tạo Auto Number trên Datagridview winform
- [DATABASE] Hướng dẫn tạo Procedure String Split in Mysql
- [C#] Thiết lập dấu (,) hay dấu (.) ở định dạng số đúng với định dạng số Việt Nam
- [C#] Chia sẻ source code Game Spin Lucky Wheel
- [C#] Hướng dẫn Encode and Decode HTML
- Danh sách tài khoản ChatGPT miễn phí - Hướng dẫn tạo tài khoản Chat Open AI GPT tại Việt Nam
- [C#] Hướng dẫn thay đổi giao diện ứng dụng Winform theo giao diện của Windows
- [VB.NET] Hiệu ứng Acrylic, Mica, Tabbed Blur Effect trên Winform
- [DEVEXPRESS] Hướng dẫn sử dụng HTML Template trên Combobox Edit
- [C#] Chia sẻ source code Orange Rain in Winform
- [DEVEXPRESS] Hướng dẫn sử dụng HTML Template trên XtraMessageBox Winform Devexpress 22.2.3
- [DEVEXPRESS] Hướng dẫn sử dụng HTML and CSS Code Viewer trên Winform
- [C#] Number Effect Counter up and down in winform
- [C#] Hướng dẫn Supend and Resume Process ID in Winform
- [C#] Hiển thị line number trên Richtextbox Winform
- [C#] Fake Blue Screen BSOD in winform
- [C#] Chia sẽ code demo sử dụng Async Parallel Foreach and For in Winform
- [C#] Sử dụng ActionBlock run X task at time winform
- [C#] Hướng dẫn sử dụng Property Grid để lưu và tải lại thông tin cấu hình user trên winform
C# - Kéo thả dòng từ một lưới sang một lưới khác trong cùng một form
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:

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 !!!
-
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ả.

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
.

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.

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

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
và 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
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 !