之前做的一个项目中需要到对gridcontrol中的行进行排序,鼠标选中需要排序的行,然后进行上移下移。寻找资料的过程不太容易,记录下来最终的成果,希望能对有同样需求的小伙伴有帮助。
上效果:(单行和多行移动)
上移:
数据源:
DataTable dtPostgreSql = new DataTable();
gridControl1.DataSource = dtPostgreSql;
if (gridView1.SelectedRowsCount < 1)
{
MessageBox.Show("未选中任何行");
return;
}
if (gridView1.SelectedRowsCount == 1)
{
int selectIndex = this.gridView1.GetDataSourceRowIndex(this.gridView1.FocusedRowHandle);
if (selectIndex - 1 >= 0)
{
object[] ot = dtPostgreSql.Rows[selectIndex].ItemArray;
DataRow dr = dtPostgreSql.Rows[selectIndex];
dtPostgreSql.Rows.Remove(dr);
DataRow drs = dtPostgreSql.NewRow();
drs.ItemArray = ot;
dtPostgreSql.Rows.InsertAt(drs, selectIndex - 1);
gridView1.FocusedRowHandle = selectIndex - 1;
dtPostgreSql.AcceptChanges();
}
else
MessageBox.Show("已到第一行不能继续上移");
}
if (gridView1.SelectedRowsCount > 1)
{
int[] index = new int[gridView1.SelectedRowsCount];
int[] rows = gridView1.GetSelectedRows();
int j=0;
if (rows[0] - 1 >= 0)
{
for (int i = rows[0]; i < rows[rows.Length - 1] + 1; i++)
{
object[] ot = dtPostgreSql.Rows[i].ItemArray;
DataRow dr = dtPostgreSql.Rows[i];
dtPostgreSql.Rows.Remove(dr);
DataRow drs = dtPostgreSql.NewRow();
drs.ItemArray = ot;
dtPostgreSql.Rows.InsertAt(drs, i - 1);
index[j] = i - 1;
j++;
}
gridView1.SelectRows(index[0], index[index.Length - 1]);
dtPostgreSql.AcceptChanges();
}else
MessageBox.Show("已到第一行不能继续上移");
}
下移:
if (gridView1.SelectedRowsCount < 1)
{
MessageBox.Show("未选中任何行");
return;
}
if (gridView1.SelectedRowsCount >= 1)
{
int[] index = new int[gridView1.SelectedRowsCount];
int[] rows = gridView1.GetSelectedRows();
int j = 0;
if (rows[rows.Length - 1] <= gridView1.RowCount-2)
{
for (int i = rows[rows.Length - 1]; i > rows[0]- 1; i--)
{
object[] ot = dtPostgreSql.Rows[i].ItemArray;
DataRow dr = dtPostgreSql.Rows[i];
dtPostgreSql.Rows.Remove(dr);
DataRow drs = dtPostgreSql.NewRow();
drs.ItemArray = ot;
dtPostgreSql.Rows.InsertAt(drs, i +1);
index[j] = i +1;
j++;
}
gridView1.SelectRows(index[0], index[index.Length - 1]);
dtPostgreSql.AcceptChanges();
}
else
MessageBox.Show("已到最后一条记录不能继续下移");
}
置顶:
if (gridView1.SelectedRowsCount == 1)
{
int top = this.gridView1.GetDataSourceRowIndex(this.gridView1.FocusedRowHandle);
DataRow drOne = this.gridView1.GetDataRow(top);
dtPostgreSql.Rows.InsertAt(dtPostgreSql.NewRow(), gridView1.TopRowIndex);
dtPostgreSql.Rows[gridView1.TopRowIndex].ItemArray = drOne.ItemArray;
drOne.Delete();//删除原来的数据行(该行所在父表中删除)
dtPostgreSql.AcceptChanges();//提交表所有的更改
gridView1.MoveFirst();
}
if (gridView1.SelectedRowsCount > 1)
{
int[] index = new int[gridView1.SelectedRowsCount];
int[] rows = gridView1.GetSelectedRows();
int j = 0;
if (rows[0] - 1 >= 0)
{
for (int i = rows[0]; i < rows[rows.Length - 1] + 1; i++)
{
object[] ot = dtPostgreSql.Rows[i].ItemArray;
DataRow dr = dtPostgreSql.Rows[i];
dtPostgreSql.Rows.Remove(dr);
DataRow drs = dtPostgreSql.NewRow();
drs.ItemArray = ot;
dtPostgreSql.Rows.InsertAt(drs, j);
index[j] = j;
j++;
}
gridView1.SelectRows(index[0], index[index.Length - 1]);
dtPostgreSql.AcceptChanges();
}
else
MessageBox.Show("已到第一行不能继续上移");
}
置底:
int bottom = dtPostgreSql.Rows.Count - 1;
if (gridView1.SelectedRowsCount >= 1)
{
int[] index = new int[gridView1.SelectedRowsCount];
int[] rows = gridView1.GetSelectedRows();
int j = 0;
if (rows[rows.Length - 1] <= gridView1.RowCount - 2)
{
for (int i = rows[rows.Length - 1]; i > rows[0] - 1; i--)
{
object[] ot = dtPostgreSql.Rows[i].ItemArray;
DataRow dr = dtPostgreSql.Rows[i];
dtPostgreSql.Rows.Remove(dr);
DataRow drs = dtPostgreSql.NewRow();
drs.ItemArray = ot;
dtPostgreSql.Rows.InsertAt(drs, bottom - j);
index[j] = bottom - j;
j++;
}
gridView1.SelectRows(index[0], index[index.Length - 1]);
dtPostgreSql.AcceptChanges();
}
else
MessageBox.Show("已到最后一条记录不能继续下移");
}