两个dataGridView 间行拖动例子

[c#.net]两个dataGridView 间行拖动例子

       研究了整整一天,在网上找到了些类似的代码,但是都没有完整的例子。所以以下代码都是自己写的,也许很多地方不够优化,完美,不过确实实现了两个表结构相同的datagridview间的整行拖动。

     也许这功能很多都人都用不上,但是要用的时候,网上是没有源码的,自己做了一个。感谢网上的朋友给了我思路。有疑问的请联系~~

    注意里面所有的事件都是两个datagridview都需要挂上~才能实现拖动,转载请注明

      欢迎更多热爱.net 的朋友一起探讨研究。

界面样式:

源码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        private int selectionIdx = 0;

        private void Form3_Load(object sender, EventArgs e)
        {
            DataSet ds = new DataSet();
            ds.Tables.Add("table1");
            ds.Tables[0].Columns.Add("code");
            ds.Tables[0].Columns.Add("desc");
            ds.Tables[0].Rows.Add(new object[] { "1", "aaa" });
            ds.Tables[0].Rows.Add(new object[] { "2", "bbb" });

            DataSet ds2 = new DataSet();
            ds2.Tables.Add("table1");
            ds2.Tables[0].Columns.Add("code");
            ds2.Tables[0].Columns.Add("desc");
            ds2.Tables[0].Rows.Add(new object[] { "3", "ccc" });
            ds2.Tables[0].Rows.Add(new object[] { "4", "ddd" });

            dataGridView1.DataSource = ds.Tables[0];
            dataGridView2.DataSource = ds2.Tables[0];
        }

        DataRow dr = null;
        DataGridViewRow dgvr = null;


        private void dataGridView1_DragDrop(object sender, DragEventArgs e)
        {
            try
            {
                if (dr != null)
                {
                    DataGridView dgv = sender as DataGridView;
                    string strTemp = dgv.Name;
                    int idx = GetRowFromPoint(e.X, e.Y, dgv);
                    if (idx < 0)
                        idx = dgv.Rows.Count;
                    if (e.Data.GetDataPresent(typeof(DataGridViewRow)))
                    {
                        ((DataTable)dgv.DataSource).Rows.InsertAt(dr, idx);
                        selectionIdx = idx;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void dataGridView1_DragOver(object sender, DragEventArgs e)
        {
            try
            {
                DataGridView dgv = sender as DataGridView;
                string strTemp = dgv.Name;

                dgvr = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow));

                dr = ((DataTable)dgv.DataSource).NewRow();
                for (int i = 0; i < dgvr.Cells.Count; i++)
                {
                    dr[i] = dgvr.Cells[i].Value;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            try
            {

                if (e.RowIndex > 0)
                    selectionIdx = e.RowIndex;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }


        private int GetRowFromPoint(int x, int y,DataGridView dgv)
        {

            for (int i = 0; i < dgv.RowCount; i++)
            {
                Rectangle rec = dgv.GetRowDisplayRectangle(i, false);

                if (dgv.RectangleToScreen(rec).Contains(x, y))
                    return i;
            }

            return -1;
        }


        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            try
            {
                DataGridView dgv = sender as DataGridView;
                if ((dgv.Rows.Count > 0) && (dgv.SelectedRows.Count > 0))
                {

                    if (dgv.Rows.Count <= selectionIdx)
                        selectionIdx = dgv.Rows.Count - 1;
                    dgv.Rows[selectionIdx].Selected = true;
                    dgv.CurrentCell = dgv.Rows[selectionIdx].Cells[0];
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void dataGridView1_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
        }

        private void dataGridView1_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
        {
            try
            {
                DataGridView dgv = sender as DataGridView;
                string strTemp = dgv.Name;
                if ((e.Clicks < 2) && (e.Button == MouseButtons.Left))
                {
                    if ((e.ColumnIndex == -1) && (e.RowIndex > -1))
                    {

                        DragDropEffects dd = dgv.DoDragDrop(dgv.Rows[e.RowIndex], DragDropEffects.Move);

                        if (dd == DragDropEffects.Move && dgvr != null)
                        {
                            dgv.Rows.Remove(dgvr);
                            dgvr = null;
                            dr = null;
                        }

                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

    }
}

搞定了~~,呵呵,如果对你有帮助,记得踩踩,我才有信心做更多的技术性研究~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值