拖拽改變DataGridView的行順序
DataGridView並沒有屬性可以設定改變行順序,需要做如下操作,假設改變dataGridView2的行順序,
定義全域性變數記錄最後一次選中的行號:
int selectionIdx = 0;
在DragEnter事件中新增如下程式碼:
private void dataGridView2_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
在CellMouseMove事件中新增如下程式碼:
private void dataGridView2_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
{
if ((e.Clicks < 2) && (e.Button == MouseButtons.Left))
{
if ((e.ColumnIndex == -1) && (e.RowIndex > -1))
dataGridView2.DoDragDrop(dataGridView2.Rows[e.RowIndex], DragDropEffects.Move);
}
}
在DragDrop事件中新增如下程式碼:
private void dataGridView2_DragDrop(object sender, DragEventArgs e)
{
int idx = GetRowFromPoint(e.X, e.Y);
if (idx < 0) return;
if (e.Data.GetDataPresent(typeof(DataGridViewRow)))
{
DataGridViewRow row = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow));
dataGridView2.Rows.Remove(row);
selectionIdx = idx;
dataGridView2.Rows.Insert(idx, row);
}
}
private int GetRowFromPoint(int x, int y)
{
for (int i = 0; i < dataGridView2.RowCount; i++)
{
Rectangle rec = dataGridView2.GetRowDisplayRectangle(i, false);
if (dataGridView2.RectangleToScreen(rec).Contains(x, y))
return i;
}
return -1;
}
在RowsAdded事件中新增如下程式碼:
private void dataGridView2_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
if (selectionIdx > -1)
{
dataGridView2.Rows[selectionIdx].Selected = true;
dataGridView2.CurrentCell = dataGridView2.Rows[selectionIdx].Cells[0];
}
}
通過上面的設定即可完成拖動來改變行順序。
注意:此方法要求dataGridView2資料不能是繫結的,必須是靜態新增進去的。
可以通過如下方式給新增資料:
dataGridView2.Rows.Clear();
StringBuilder sql = new StringBuilder();
sql.Append("select * from BAS_UserStandard ");
DataTable dt = SqlProxy.GetData(sql.ToString());
if (dt.Rows.Count > 0)
{
int N = dt.Columns.Count;
for (int col_index = 0; col_index < N; col_index++)
{
dataGridView2.Columns.Add(dt.Columns[col_index].ColumnName, dt.Columns[col_index].ColumnName);
}
foreach (DataRow item in dt.Rows)
{
int index = dataGridView2.Rows.Add();
for (int col_index = 0; col_index < N; col_index++)
{
dataGridView2.Rows[index].Cells[col_index].Value = item[col_index];
}
}
}