本文共 4794 字,大约阅读时间需要 15 分钟。
尝试了很多方法,终于找到了GridControl中GridView表格行拖拽的方式,从这个链接()中获得的灵感,但还存在问题,
比如用gridView1.Columns[“排序列名”].SortOrder = DevExpress.Data.ColumnSortOrder.Ascending;实现的排序,
只是在界面显示上实现了排序,但绑定的数据表格行并没有变动!
所以我直接对绑定的表格操作,实现行的排序。
示例图如下(不知道怎么做动图):
实现代码如下:
const string OrderFieldName = "序号"; GridHitInfo downHitInfo = null; DataTable dt = new DataTable(); public Form1() { InitializeComponent(); } ////// 窗体加载 /// /// /// private void Form1_Load(object sender, EventArgs e) { //填充数据 dt.Columns.Add(OrderFieldName); dt.Columns.Add("列2"); dt.Columns.Add("列3"); dt.Rows.Add("1", "第一行数据", "1"); dt.Rows.Add("2", "第二行数据", "2"); dt.Rows.Add("3", "第三行数据", "3"); dt.Rows.Add("4", "第四行数据", "4"); dt.Rows.Add("5", "第五行数据", "5"); dt.Rows.Add("6", "第六行数据", "6"); gridControl1.DataSource = dt; gridView1.OptionsCustomization.AllowSort = false; gridView1.OptionsView.ShowGroupPanel = false; gridControl1.AllowDrop = true; gridView1.OptionsBehavior.Editable = false; } ////// 上移行 /// /// /// private void btn_up_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { gridControl1.Focus(); int index = gridView1.FocusedRowHandle; if (index <= 0) return; ChangeRow(index, index - 1); } ////// 下移行 /// /// /// private void btn_down_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { gridControl1.Focus(); int index = gridView1.FocusedRowHandle; if (index >= gridView1.DataRowCount - 1) return; ChangeRow(index, index + 1); } private void gridView1_MouseDown(object sender, MouseEventArgs e) { downHitInfo = null; GridHitInfo hitInfo = gridView1.CalcHitInfo(new Point(e.X, e.Y)); //鼠标左键单击,在行内,且不为新行 if (e.Button == MouseButtons.Left && hitInfo.InRow && hitInfo.RowHandle != GridControl.NewItemRowHandle) downHitInfo = hitInfo; } private void gridView1_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && downHitInfo != null) { Size dragSize = SystemInformation.DragSize; Rectangle dragRect = new Rectangle(new Point(downHitInfo.HitPoint.X - dragSize.Width / 2, downHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize); if (!dragRect.Contains(new Point(e.X, e.Y))) { gridControl1.DoDragDrop(downHitInfo, DragDropEffects.Move); downHitInfo = null; } } } private void gridControl1_DragOver(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(GridHitInfo))) { GridHitInfo downHitInfo = e.Data.GetData(typeof(GridHitInfo)) as GridHitInfo; if (downHitInfo == null) return; GridHitInfo hitInfo = gridView1.CalcHitInfo(gridControl1.PointToClient(new Point(e.X, e.Y))); if (hitInfo.InRow && hitInfo.RowHandle != downHitInfo.RowHandle && hitInfo.RowHandle != GridControl.NewItemRowHandle) e.Effect = DragDropEffects.Move; else e.Effect = DragDropEffects.None; } } private void gridControl1_DragDrop(object sender, DragEventArgs e) { GridHitInfo srcHitInfo = e.Data.GetData(typeof(GridHitInfo)) as GridHitInfo; GridHitInfo hitInfo = gridView1.CalcHitInfo(gridControl1.PointToClient(new Point(e.X, e.Y))); int sourceRowIndex = srcHitInfo.RowHandle; int targetRowIndex = hitInfo.RowHandle; if (sourceRowIndex == targetRowIndex) return; ChangeRow(sourceRowIndex, targetRowIndex); } ////// 删除源行,并在目标位置插入源行 /// /// /// private void ChangeRow(int sourceRowIndex, int targetRowIndex) { DataRow sourceRow = gridView1.GetDataRow(sourceRowIndex); DataRow targetRow = gridView1.GetDataRow(targetRowIndex); //复制源行,再重新添加(直接复制的话,删除源行后复制行也会为空) object[] objArray = sourceRow.ItemArray; DataRow dragRowCopy = dt.NewRow(); dragRowCopy.ItemArray = objArray; sourceRow.Delete(); dt.Rows.InsertAt(dragRowCopy, targetRowIndex); //调整焦点到目标行上 gridView1.FocusedRowHandle = targetRowIndex; }
转载地址:http://chikf.baihongyu.com/