• C# WinForm:DataTable中数据复制粘贴操作的实现


    1. 需要实现类似于Excel的功能,就是在任意位置选中鼠标起点和终点所连对角线所在的矩形,进行复制粘贴。

    2. 要实现这个功能,首先需要获取鼠标起点和终点点击的位置。

    3. 所以通过GridView(我用的是dev这款插件)的MouseDown和MouseUp事件来获取这连个位置。MouseDown获得鼠标左键按下时的所在的行列信息,MouseUp获得鼠标左键抬起时的行列信息。然后简单加减法计算一共选中的行数和列数。

    有了这个思路代码其实挺简单的。今天没时间了,明天贴代码。

    ----------------------------------------------------------------------------------------------

    粘贴部分的代码

    try
                {
                    string pasteText = Clipboard.GetText().Replace("
    ", "@").TrimEnd('@');//得到剪切板里的信息
                    string[] Row = pasteText.Split('@');//分割的行数数组
                    string[] col = Row[0].Replace("	", "#").TrimEnd('#').Split('#');//列数数组
                    //判断是否存在非数字类型 
                    Regex rgx = new Regex(@"^[-]?d+[.]?d*$");
                    for (int t = 0; t < Row.Length; t++)
                    {
                        col = Row[t].Replace("	", "#").TrimEnd('#').Split('#');
                        for (int t1 = 0; t1 < col.Length; t1++)
                        {
                            //判断字符串
                            if (!rgx.IsMatch(col[t1].ToString().Trim()))
                            {
                                XtraMessageBox.Show("粘贴的内容存在非数字类型!");
                                return;
                            }
                        }
                    }
    
                    int _iRowCount = gridRowHandleEnd - gridRowHandleStar + 1;//一共选择的行数
                    int _iColCount = gridColHandleEnd - gridColHandleStar + 1;//一共选择的列数
                    for (int r = 0; r < Row.Length; r++)
                    {
                        //获取每行中的内容
                        string rowMessage = Row[r].Replace("	", "#").TrimEnd('#');
                        col = rowMessage.Split('#');
                        DataRow dr = dtInputSurveyData.Rows[gridRowHandleStar + r];//r是从0开始的,gridRowHandleStar+r的作用等同于gridRowHandleStar++
                        //判断外部复制内容的列数GridView中选中内容的列数的大小,最终粘贴内容的列数应与小的相同;
                        if (_iColCount < col.Length)
                        {
                            for (int i = 0; i < _iColCount; i++)
                            {
                                dr[gridColHandleStar + i] = col[i];
                            }
                        }
                        else
                        {
                            for (int i = 0; i < col.Length; i++)
                            {
                                dr[gridColHandleStar + i] = col[i];
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    XtraMessageBox.Show(ex.Message, Properties.Resources.ErrorTitle);
                }

    还需要在gridview的MouseDown和MouseUp事件中添加代码来获取鼠标按下和抬起时的位置(我这里用的是dev这款插件,所以我这里的gridview是gridcontrol 下的gridview)。

    MouseDown:

    try
                {
                    //当鼠标按下时获取当前点击cell的位置信息
                    GridHitInfo _gridHI = gvInputSurveyData.CalcHitInfo(e.Location);
                    if (e.Button == MouseButtons.Left && _gridHI.RowHandle >= 0)
                    {
                        gridColHandleStar = _gridHI.Column.ColumnHandle;
                        gridRowHandleStar = _gridHI.RowHandle;
                    }
                }
                catch (Exception ex)
                {
                    XtraMessageBox.Show(ex.Message, Properties.Resources.ErrorTitle);
                }

    MouseUp:

                GridHitInfo _gridHI = gvInputSurveyData.CalcHitInfo(e.Location);
                if (e.Button == MouseButtons.Left && _gridHI.RowHandle >= 0)
                {
                    gridColHandleEnd = _gridHI.Column.ColumnHandle;
                    gridRowHandleEnd = _gridHI.RowHandle;
                }

    这里两个Start 变量和两个end变量都是全局的,用来保存鼠标起始和终止的行列信息。

    感谢您的阅读,不足之处请见谅。期待与您在评论区交流。

  • 相关阅读:
    随感
    LIKE运算符
    数据库运行时的关键字先后顺序
    联表查询
    进程、线程、协程
    算法复杂度
    redis支持的数据类型
    面向对象编程和面向过程编程的区别总结
    判断对象的变量是否存在,isset和property_exists区别
    构造函数和析构函数
  • 原文地址:https://www.cnblogs.com/Alex1994/p/10120709.html
Copyright © 2020-2023  润新知