datagridview实现复制粘贴

private void StepArtDgv_KeyUp(object sender, KeyEventArgs e)
        {
            //粘贴
            if (e.KeyCode == Keys.V && e.Control)
            {
                // 获取剪切板的内容,并按行分割
                string pasteText = Clipboard.GetText().Replace("\r\n", "@").TrimEnd(‘@‘);

//选中区域是区块后,
                int xzRowCount_Z = StepArtDgv.SelectedCells[StepArtDgv.SelectedCells.Count - 1].RowIndex;//选中左上角的单元格的行索引
                int xzColCount_Z = StepArtDgv.SelectedCells[StepArtDgv.SelectedCells.Count - 1].ColumnIndex;//选中左上角的单元格的列索引
                int xzRowCount_Y = StepArtDgv.CurrentCell.RowIndex;//选中右下角的单元格的列索引
                int xzColCount_Y = StepArtDgv.CurrentCell.ColumnIndex;//选中右下角的单元格的行索引

int Colcounts = xzColCount_Y + 1 - StepArtDgv.SelectedCells[StepArtDgv.SelectedCells.Count - 1].ColumnIndex;//粘贴区域的列数
                int Rowcounts = xzRowCount_Y + 1 - StepArtDgv.SelectedCells[StepArtDgv.SelectedCells.Count - 1].RowIndex;//粘贴区域的行数

int MaxRowIndex = StepArtDgv.Rows.Count - 1; //获取做大的行数,最下面的行索引
                int MaxColIndex = StepArtDgv.ColumnCount - 1; //获取做大的列数,最右面的行索引

//临时变量,索引随时都有可能在曾东增加,然而增加后无法还原,所以采用临时变量存储
                int tempRowIndexs = xzRowCount_Z;
                int tempColumnIndexs = xzColCount_Z;

if (xzColCount_Z == 0)
                {
                    MessageBox.Show("项目名称不能粘贴!");
                    return;
                }

string[] Row = null;
                Row = pasteText.Split(‘@‘);//分割的行数数组

string[] col = null;//分割行后的列,每行的内容
                col = Row[0].Replace("\t", "#").TrimEnd(‘#‘).Split(‘#‘);//专门存储列数

//判断是否存在非数字类型
                for (int t = 0; t < Row.Length; t++)
                {
                    col = Row[t].Replace("\t", "#").TrimEnd(‘#‘).Split(‘#‘);
                    //for (int t1 = 0; t1 < col.Length; t1++)
                    //{
                        ////判断字符串
                        //if (!reg.IsMatch(col[t1].ToString().Trim()))
                        //{
                        //    MessageBox.Show("粘贴的内容存在非数字类型!");
                        //    return;
                        //}
                    //}

}
                if (Row.Length > 0)
                {
                    //粘贴区块,列行都是选中的倍数
                    if (Rowcounts % Row.Length == 0 && Colcounts % col.Length == 0)
                    {
                        for (int cs = 0; cs < Colcounts / col.Length; cs++)
                        {
                            for (int rs = 0; rs < Rowcounts / Row.Length; rs++)
                            {
                                for (int r = 0; r < Row.Length; r++)
                                {
                                    if (xzRowCount_Z > MaxRowIndex) break;//跳出行
                                    //获取每行中的内容
                                    string rowMessage = Row[r].Replace("\t", "#").TrimEnd(‘#‘);
                                    col = rowMessage.Split(‘#‘);
                                    for (int c = 0; c < col.Length; c++)
                                    {
                                        if (xzColCount_Z > MaxColIndex) break;//粘贴内容出了DGV的区域,跳出该循环,进行下一行

StepArtDgv.Rows[xzRowCount_Z].Cells[xzColCount_Z].Value = col[c];
                                        xzColCount_Z++;
                                    }
                                    xzRowCount_Z++;
                                    xzColCount_Z = tempColumnIndexs;//因为列自增了,需要还原,进行下一行填充
                                }
                            }
                            xzRowCount_Z = tempRowIndexs;//行数从头开始
                            xzColCount_Z += col.Length;//列增加
                            tempColumnIndexs += col.Length;//列的临时变量也要跟着变
                        }
                    }//粘贴区块,行是选中的行的倍数
                    else if (Rowcounts % Row.Length == 0)
                    {
                        for (int rs = 0; rs < Rowcounts / Row.Length; rs++)
                        {
                            for (int r = 0; r < Row.Length; r++)
                            {
                                if (xzRowCount_Z > MaxRowIndex) break;//跳出行
                                //获取每行中的内容
                                string rowMessage = Row[r].Replace("\t", "#").TrimEnd(‘#‘);
                                col = rowMessage.Split(‘#‘);
                                for (int c = 0; c < col.Length; c++)
                                {
                                    if (xzColCount_Z > MaxColIndex) break;//粘贴内容出了DGV的区域,跳出该循环,进行下一行

StepArtDgv.Rows[xzRowCount_Z].Cells[xzColCount_Z].Value = col[c];
                                    xzColCount_Z++;
                                }
                                xzRowCount_Z++;
                                xzColCount_Z = tempColumnIndexs;//因为列自增了,需要还原,进行下一行填充
                            }
                            xzColCount_Z = tempColumnIndexs;//因为列自增了,需要还原,进行下一行填充
                        }
                    }//粘贴区块,列是选中的列的倍数
                    else if (Colcounts % col.Length == 0)
                    {
                        for (int cs = 0; cs < Colcounts / col.Length; cs++)
                        {
                            for (int r = 0; r < Row.Length; r++)
                            {
                                if (xzRowCount_Z > MaxRowIndex) break;//跳出行
                                //获取每行中的内容
                                string rowMessage = Row[r].Replace("\t", "#").TrimEnd(‘#‘);
                                col = rowMessage.Split(‘#‘);
                                for (int c = 0; c < col.Length; c++)
                                {
                                    if (xzColCount_Z > MaxColIndex) break;//粘贴内容出了DGV的区域,跳出该循环,进行下一行

StepArtDgv.Rows[xzRowCount_Z].Cells[xzColCount_Z].Value = col[c];
                                    xzColCount_Z++;
                                }
                                xzColCount_Z = tempColumnIndexs;
                                xzRowCount_Z++;//行数从头开始
                            }
                            xzRowCount_Z = tempRowIndexs;//行数从头开始
                            xzColCount_Z += col.Length;//列增加
                            tempColumnIndexs += col.Length;//列的临时变量也要跟着变
                        }
                    } //粘贴区块小于选中区块(粘贴区块只是一个单元格 || 行和列小于粘贴区块 || 不是行或者列的倍数)
                    else if (Rowcounts <= Row.Length && Colcounts <= col.Length || Rowcounts % Row.Length != 0 || Colcounts % col.Length != 0)
                    {
                        for (int r = 0; r < Row.Length; r++)//循环行
                        {
                            if (xzRowCount_Z > MaxRowIndex) break;//跳出行
                            //获取每行中的内容
                            string rowMessage = Row[r].Replace("\t", "#").TrimEnd(‘#‘);
                            col = rowMessage.Split(‘#‘);

//为每个单元格赋值
                            for (int c = 0; c < col.Length; c++)
                            {
                                if (xzColCount_Z > MaxColIndex) break;//粘贴内容出了DGV的区域,跳出该循环,进行下一行

StepArtDgv.Rows[xzRowCount_Z].Cells[xzColCount_Z].Value = col[c];
                                xzColCount_Z++;
                            }
                            xzRowCount_Z++;//下一行
                            xzColCount_Z = tempColumnIndexs;//因为列自增了,需要还原,进行下一行填充
                        }
                    }
                }
            }
        }

时间: 2024-10-06 21:39:09

datagridview实现复制粘贴的相关文章

xshell复制粘贴

用户看到这个标题肯定会觉得小编脑子坏掉了,复制粘贴不就是Ctrl+C,Ctrl+V嘛,但是在xshell却不尽然. 现象: 在xshell界面中需要用到之前的一段代码,自然是选中,熟练的键入Ctrl+C,打算复制,可是再次键入Ctrl+V时,一点反应都没有,无论怎样尝试都是一样. 原因分析: 在xshell中,Ctrl+C 代表着中断当前指令,与WIndows中的复制的快捷键重复,所以才出现了上述的现象 解决方法 1. 使用xshell中的复制粘贴快捷键 复制:Ctrl+Insert 粘贴:Sh

Vim 安装、配置及复制粘贴操作

1.安装:sudo apt-get install vim 2.配置:cd ~ #进入用户主目录 touch .vimrc #.后缀文件不可见 vi .vimrc #打开文件 输入: 1 set cindent 2 3 set shiftwidth=4 4 set tabstop=4 5 set softtabstop=4 6 7 set number 8 set hlsearch 9 syntax on 10 11 set showmode 12 set foldmethod=syntax 1

仿复制粘贴功能,长按弹出tips的实现

方案分析: 方案一:监听长按事件弹出PopupWindow[可行,缺点布局是固定的,小语种下会出现菜单截断现象] 方案二:弹出ContextMenu[不可行,因为ContextMenu的菜单是上下排列] 方案三:通过hierarchyviewer.bat查看可知,Editor的复制粘贴功能用的是toolbar,利用此功能也可实现[可行,代码量大] 方案四:通过查看Editor源码分析可知,只需要实现ActionMode.CallBack2接口,setMode即可实现[可行,简单实现接口,再添加少

《移动医疗:智能化医疗时代的来临》:2014年的旧书了,以网上可见的资料的复制粘贴为主。二星

本书中文版比较新,但是是从2014年的一本英文书翻译过来的.从时间上来说,过去的这两年移动医疗行业发生了比较大的变化,这本书已经过时了. 除此之外,本书以互联网上公开可见的资料的复制粘贴为主,作者缺乏对这个行业的深入了解,书中缺乏作者对资料的概括分析总结. 总体评价为二星.

ueditor编辑文章时候,复制粘贴内容,原来的图片不能显示

ueditor编辑文章时候.当现有文章有图片的时候, 再复制粘贴文本进去的时候.里面的图片就不能显示了, 编辑器查看文章Html代码,图片路径显示为:src="http://localhost/images/net/error!" 正确是:src="http://localhost/images/adc.jpg" 而我用的是自己定义的server的一个路径 查看源代码,发现这块功能是例如以下流程 当粘贴后.UE会将眼下编辑的全部内容中元素又一次赋值属性,即源代码中的

在LINUX终端和VIM下复制粘贴

http://www.tinylab.org/linux-terminal-and-paste-copy-under-vim/ 在GUI界面下,我们可以很自由的复制粘贴.但是在字符界面下,我们不得不用鼠标选定,然后单击右健,选择复制,再到别处去Ctrl-v.并且对于 那些用没有配置过的VIM来说,VIM的粘贴板和X Window的粘贴板还不共享.这在码字的过程中,感觉非常不流畅.下面,我们就尝试解决这个问题. 首先我们得让VIM和X Window共享一个粘贴板,这样我们就可以像在GUI界面下一样

【vim小小记】vim的复制粘贴(包括系统剪贴板)

1.vim常用复制粘贴命令 Vim的复制粘贴命令无疑是y (yank),p(paster),加上yy,P PS: vim有个很有意思的约定(我觉得是一种约定),就是某个命令的大小写都是实现某种功能,只是方向不同,比如: w 跳转到下个word,W:跳转到上个word f 某行正向查找并跳转 F: 反向.... 然后部分双写的字母有行操作: yy 复制一行 dd 删除一行 所以, p就是在当前光标后粘贴,P就是在当前光标前粘贴 另外,说完p,其实还有几个命令有时也是很有用的 gp,和p的功能基本一

Android中的复制粘贴

The Clipboard Framework 当使用clipboard framework时,把数据放在一个剪切对象(clip object)里,然后这个对象会放在系统的剪贴板里. clip object可以有三种形式: Text:文字字符串. 文字是直接放在clip对象中,然后放在剪贴板里:粘贴这个字符串的时候直接从剪贴板拿到这个对象,把字符串放入你的应用存储中. URI:一个Uri 对象. 表示任何形式的URI.这种形式主要用于从一个content provider中复制复杂的数据. 复制

[Android]通过ClipboardManager, ClipData进行复制粘贴[转]

Android应用开发之(通过ClipboardManager, ClipData进行复制粘贴) Android Developer: 在开发一些系统应用的时候,我们会用到Android的剪贴板功能,比如将文本文件.或者其他格式的内容复制到剪贴板或者从剪贴板获取数据等操作.Android平台中每个常规的应用运行在自己的进程空间中,相对于Win32而言Android上之间的进程间传递主要有IPC.剪切板.当然今天我们说下最简单的ClipboardManager.使用剪切板可以直接实现数据的传输.整