拖放后的Datagridview行突出显示 [英] Datagridview row highlight after drag and drop

查看:63
本文介绍了拖放后的Datagridview行突出显示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我拖累&例如,在我的datagridview中从第1行到第8行删除一行,第1行将在操作结束后突出显示。这非常不自然。我希望第8行能够突出显示。我怎么能这样做?

If I drag & drop a row in my datagridview from row 1 to row 8 for example, row 1 will be highlighted after the action is over. This is very unnatural. I would expect row 8 to be highlighted. How can I do that?

即使我使用像DataGridView1.Clearselection()这样的语句,它也会清除整个数据网格,但在命令后第1行将突出显示。

Even when I use a statement like DataGridView1.Clearselection() it does clear the whole datagrid but right after the command the row 1 will highlight.

推荐答案

嗨大家,

我不知道你是如何实现拖拽目的的,我做了一个简单演示,在我的项目中,我清除选择,然后在datagridview_MouseMove事件中重置它:

I'm not sure how do you achieve the drag purpose, I made a simple demo, in my project, I clear the selection then reset it in the datagridview_MouseMove event with:

            //Clear
            dataGridView.ClearSelection();
            //Set
            dataGridView.Rows[indexOfItemUnderMouseToDrop].Selected = true;

请参考以下项目:

    public partial class MainForm : Form
    {
        DataTable dataTable = new DataTable();        
        private int indexOfItemUnderMouseToDrag = -1;
        private int indexOfItemUnderMouseToDrop = -1;
        private Rectangle dragBoxFromMouseDown = Rectangle.Empty;

        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            dataTable.Columns.Add("ID", typeof(int));
            dataTable.Columns.Add("Column1", typeof(string));
            dataTable.Columns.Add("Column2", typeof(string));
            for (int id = 1; id <= 20; id++)
                dataTable.Rows.Add(id, string.Format("A{0}", id), string.Format("B{0}", id));

            dataGridView.DataSource = dataTable;
        }

        private void dataGridView_MouseDown(object sender, MouseEventArgs e)
        {
            var hitTest = dataGridView.HitTest(e.X, e.Y);
            if (hitTest.Type != DataGridViewHitTestType.Cell)
                return;
            
            indexOfItemUnderMouseToDrag = hitTest.RowIndex;
            if (indexOfItemUnderMouseToDrag > -1)
            {
                Size dragSize = SystemInformation.DragSize;
                dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize);
            }
            else
                dragBoxFromMouseDown = Rectangle.Empty;           
            
        }

        private void dataGridView_MouseUp(object sender, MouseEventArgs e)
        {
            dragBoxFromMouseDown = Rectangle.Empty;
        }

        private void dataGridView_MouseMove(object sender, MouseEventArgs e)
        {
            if ((e.Button & MouseButtons.Left) != MouseButtons.Left)
                return;
            if (dragBoxFromMouseDown == Rectangle.Empty || dragBoxFromMouseDown.Contains(e.X, e.Y))
                return;
            if (indexOfItemUnderMouseToDrag < 0)
                return;
            
            var row = dataGridView.Rows[indexOfItemUnderMouseToDrag];
            DragDropEffects dropEffect = dataGridView.DoDragDrop(row, DragDropEffects.All);
            
            //Clear
            dataGridView.ClearSelection();
            //Set
            dataGridView.Rows[indexOfItemUnderMouseToDrop].Selected = true;
        }

        private void dataGridView_DragOver(object sender, DragEventArgs e)
        {
            Point p = dataGridView.PointToClient(new Point(e.X, e.Y));            
            var hitTest = dataGridView.HitTest(p.X, p.Y);
            if (hitTest.Type != DataGridViewHitTestType.Cell || hitTest.RowIndex == indexOfItemUnderMouseToDrag)
            {
                e.Effect = DragDropEffects.None;
                return;
            }
            e.Effect = DragDropEffects.Move;
        }

        private void dataGridView_DragDrop(object sender, DragEventArgs e)
        {
            Point p = dataGridView.PointToClient(new Point(e.X, e.Y));
            var hitTest = dataGridView.HitTest(p.X, p.Y);
            if (hitTest.Type != DataGridViewHitTestType.Cell || hitTest.RowIndex == indexOfItemUnderMouseToDrag + 1)
                return;

            indexOfItemUnderMouseToDrop = hitTest.RowIndex;

            var tempRow = dataTable.NewRow();
            tempRow.ItemArray = dataTable.Rows[indexOfItemUnderMouseToDrag].ItemArray;
            dataTable.Rows.RemoveAt(indexOfItemUnderMouseToDrag);

            if (indexOfItemUnderMouseToDrag < indexOfItemUnderMouseToDrop)
                indexOfItemUnderMouseToDrop--;

            dataTable.Rows.InsertAt(tempRow, indexOfItemUnderMouseToDrop);
        }
    }

希望这会有所帮助!

问候,

Frankie


这篇关于拖放后的Datagridview行突出显示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆