zoukankan      html  css  js  c++  java
  • 实现DataGridView行的拖动,即实现行的顺序交换

    1.界面准备
    (1)首先在form中添加一个DataGridView控件,将默认AllowDrop=false 的属性设置为True,否侧不能拖动!
    (2)对DataGridView的对象实现非数据源的绑定,因为设置DataSource属性即当控件被数据绑定时,无法以编程方式向 DataGridView 的行集合中添加行。
     
     
    2.代码准备
    (1)控制移动时鼠标的图形,否则是一个禁止移动的标识
            private void dataGridView1_DragEnter(object sender, DragEventArgs e)
            {
                e.Effect = DragDropEffects.Move;
            }
     
    (2)控制拖动的条件,也可以自行放宽条件
            private void  dataGridView1 _CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
            {
                if ((e.Clicks < 2) && (e.Button == MouseButtons.Left))
                {
                    if ((e.ColumnIndex == -1) && (e.RowIndex > -1))
                        dataGridView1.DoDragDrop(dataGridView1.Rows[e.RowIndex], DragDropEffects.Move);
                }
            }
     
    (3)拖动后实现行的删除和添加,实现行交换位置的错觉
            int selectionIdx = 0;
            private void  dataGridView1_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));
                    dataGridView1.Rows.Remove(row);
                    selectionIdx = idx;
                    dataGridView1.Rows.Insert(idx, row);
                }
            }
     
            private int GetRowFromPoint(int x, int y)
            {
                for (int i = 0; i < dataGridView1.RowCount; i++)
                {
                    Rectangle rec = dataGridView1.GetRowDisplayRectangle(i, false);
     
                    if (dataGridView1.RectangleToScreen(rec).Contains(x, y))
                        return i;
                }
     
                return -1;
            }
     
    (4)控制被移动的行始终是选中行
            private void kryptonDataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
            {
                if (selectionIdx > -1)
                {
                    dataGridView1.Rows[selectionIdx].Selected = true;
                    dataGridView1.CurrentCell = dataGridView1.Rows[selectionIdx].Cells[0];
                }
            }
  • 相关阅读:
    ArrayList的几种初始化方法
    Java中date和calendar的用法
    Android中XML的命名空间、自定义属性
    Android中shape属性详解
    五分钟学GIS | 快速生成地图瓦片秘籍
    adb 提示adb server version(31) doesn't match this client(40) 解决办法
    mysql @value := 用法
    Mysql中(@i:=@i+1)的作用
    $.ajax()方法详解
    最少代码实现购物车所有功能
  • 原文地址:https://www.cnblogs.com/simadi/p/3739350.html
Copyright © 2011-2022 走看看