Tip: Auto Scroll While Implementing Drag & Drop for Reordering Rows in DataGridView
Rating: none

gr8buddy (view profile)
February 28, 2008

Environment: .NET, C#

There are tons of articles detailing how to re-order rows in a data grid but none handle this nuance of allowing the user to scroll up and down while dragging a row to a point beyond the displayed rows on the screen.

The Problem

Say a form hosts a datagrid that was sized to display 10 rows, and the gridvew has 100 rows. If the user has scrolled down to a point where the gridview displays rows 30 to 40, and if the user wants to move the 35th row to the second position, the gridview by default doesn't scroll up when user drags row 25 beyond the row header (or beyond row 40). This can be very annoying.

The Solution

This solution, in just four lines of code, implements the scroll up and scroll down feature when user drags a row beyond the datagridview's top and bottom bounds. After implementing the code to do a drag and drop re-ordering, in the DragOver event handler, add the following lines (the code assumes you have a datagridvew object called dataGridView1.)
Theo Codeguru.com

Hướng dẫn: Tự động cuộn lên trên hoặc xuống dưới khi kéo thả dòng trên dataGridview

Có rất nhiều các bài viết hướng dẫn cách sắp xếp lại các dòng trên dataGridview nhưng hình như chưa thấy có bài nào hướng dẫn kéo thả một dòng đang hiển thị đến một vị trí không hiển thị nằm tuốt bên trên hay bên dưới một dataGridview.

Vấn đề:

Chẳng hạn có một form chứa một dataGridview được chỉnh kích cỡ lúc design để chỉ hiển thị khoảng 10 dòng, trong khi cái Grid này chứa tổng cộng khoảng 100 dòng. Nếu người dùng kéo xuống khu vực dữ liệu chứa các dòng từ 30 - 40, và rồi họ muốn di chuyển dòng thứ 35 lên vị trí số 2 ở tít trên cùng, cái dataGridview này theo mặc định không làm được cái việc tự động cuốn lên trên khi họ nhấn chuột vào dòng đó và kéo thả. Như thế thì rất dở.

Giải pháp:

Chỉ trong 4 dòng lệnh, cách làm sau đây giúp thực hiện việc cuốn lên cuốn xuống tự động khi người dùng kéo thả như đã trình bày. Đoạn code này giả định bạn đã có dataGridview1 chứa đầy dữ liệu trên form.

Visual C# Code:
  1. private void dataGridView1_DragOver(object sender, DragEventArgs e)
  2. {
  3.    e.Effect = DragDropEffects.Move;
  4.  
  5.    if (e.Y <= PointToScreen(new Point(dataGridView1.Location.X,
  6.       dataGridView1.Location.Y)).Y+40)
  7.       dataGridView1.FirstDisplayedScrollingRowIndex -= 1;
  8.    if (e.Y >= PointToScreen(new Point(dataGridView1.Location.X+
  9.       dataGridView1.Width, dataGridView1.Location.Y+
  10.       dataGridView1.Height)).Y - 10)
  11.    dataGridView1.FirstDisplayedScrollingRowIndex += 1;
  12. }

(ccom lược dịch)