1. 程式人生 > >拖拽改變DataGridView的行順序

拖拽改變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];

        }

    }

}