首页 > 其他分享 >DataGridView完美解决复制粘贴功能

DataGridView完美解决复制粘贴功能

时间:2023-05-27 09:57:14浏览次数:47  
标签:colIndex columnindex 完美 pasteText DataGridView 复制粘贴 int dgv rowindex


//在DataGridView的PreviewKeyDown事件中

private void dataGridView1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.Control && e.KeyCode == Keys.V) // 判断是否按下ctrl+v
{
Paste(dataGridView1, "", 0, false);//粘贴代码
}
}

 

粘贴,行数和列数不足时,自动添加行数列数。

#region 粘贴
public int Paste(DataGridView dgv, string pasteText, int kind, bool b_cut)
{
try
{
if (kind == 0)
{
pasteText = Clipboard.GetText();
}
if (string.IsNullOrEmpty(pasteText))
return -1;
int rowNum = 0;
int columnNum = 0;
//获得当前剪贴板内容的行、列数
for (int i = 0; i < pasteText.Length; i++)
{
if (pasteText.Substring(i, 1) == "\t")
{
columnNum++;
}
if (pasteText.Substring(i, 1) == "\n")
{
rowNum++;
}
}
Object[,] data;
//粘贴板上的数据来自于EXCEL时,每行末都有\n,在DATAGRIDVIEW内复制时,最后一行末没有\n
if (pasteText.Substring(pasteText.Length - 1, 1) == "\n")
{
rowNum = rowNum - 1;
}
columnNum = columnNum / (rowNum + 1);
data = new object[rowNum + 1, columnNum + 1];

String rowStr;
//对数组赋值
for (int i = 0; i < (rowNum + 1); i++)
{
for (int colIndex = 0; colIndex < (columnNum + 1); colIndex++)
{
rowStr = null;
//一行中的最后一列
if (colIndex == columnNum && pasteText.IndexOf("\r") != -1)
{
rowStr = pasteText.Substring(0, pasteText.IndexOf("\r"));
}
//最后一行的最后一列
if (colIndex == columnNum && pasteText.IndexOf("\r") == -1)
{
rowStr = pasteText.Substring(0);
}
//其他行列
if (colIndex != columnNum)
{
rowStr = pasteText.Substring(0, pasteText.IndexOf("\t"));
pasteText = pasteText.Substring(pasteText.IndexOf("\t") + 1);
}
if (rowStr == string.Empty)
rowStr = null;
data[i, colIndex] = rowStr;
}
//截取下一行数据
pasteText = pasteText.Substring(pasteText.IndexOf("\n") + 1);
}
/*检测值是否是列头*/
/*
//获取当前选中单元格所在的列序号
int columnindex = dgv.CurrentRow.Cells.IndexOf(dgv.CurrentCell);
//获取获取当前选中单元格所在的行序号
int rowindex = dgv.CurrentRow.Index;*/
int columnindex = -1, rowindex = -1;
int columnindextmp = -1, rowindextmp = -1;
if (dgv.SelectedCells.Count != 0)
{
columnindextmp = dgv.SelectedCells[0].ColumnIndex;
rowindextmp = dgv.SelectedCells[0].RowIndex;
}
//取到最左上角的 单元格编号
foreach (DataGridViewCell cell in dgv.SelectedCells)
{
//dgv.Rows[cell.RowIndex].Selected = true;
columnindex = cell.ColumnIndex;
if (columnindex > columnindextmp)
{
//交换
columnindex = columnindextmp;
}
else
columnindextmp = columnindex;
rowindex = cell.RowIndex;
if (rowindex > rowindextmp)
{
rowindex = rowindextmp;
rowindextmp = rowindex;
}
else
rowindextmp = rowindex;
}
if (kind == -1)
{
columnindex = 0;
rowindex = 0;
}

//如果行数超过当前列表行数
if (rowindex + rowNum + 1 > dgv.RowCount)
{
int mm = rowNum + rowindex + 1 - dgv.RowCount;
for (int ii = 0; ii < mm + 1; ii++)
{
dgv.DataBindings.Clear();
DataRow row = row = ds.Tables[0].NewRow();
ds.Tables[0].Rows.InsertAt(row, ii + rowindex + 1);
}
}

//如果列数超过当前列表列数
if (columnindex + columnNum + 1 > dgv.ColumnCount)
{
int mmm = columnNum + columnindex + 1 - dgv.ColumnCount;
for (int iii = 0; iii < mmm; iii++)
{
dgv.DataBindings.Clear();
DataGridViewTextBoxColumn colum = new DataGridViewTextBoxColumn();
dgv.Columns.Insert(columnindex + 1, colum);
}
}

//增加超过的行列
for (int j = 0; j < (rowNum + 1); j++)
{
for (int colIndex = 0; colIndex < (columnNum + 1); colIndex++)
{
if (colIndex + columnindex < dgv.Columns.Count)
{
if (dgv.Columns[colIndex + columnindex].CellType.Name == "DataGridViewTextBoxCell")
{
if (dgv.Rows[j + rowindex].Cells[colIndex + columnindex].ReadOnly == false)
{
dgv.Rows[j + rowindex].Cells[colIndex + columnindex].Value = data[j, colIndex];
dgv.Rows[j + rowindex].Cells[colIndex + columnindex].Selected = true;
}
}
}
}
}
//清空剪切板内容
if (b_cut)
Clipboard.Clear();
return 1;
}
catch
{
return -1;
}
}
#endregion

 



标签:colIndex,columnindex,完美,pasteText,DataGridView,复制粘贴,int,dgv,rowindex
From: https://www.cnblogs.com/lmh6825/p/17436295.html

相关文章

  • 最完美WIN10_Pro_22H2.19045.3031软件选装纯净版VIP41.7
    【系统简介】=============================================================1.本次更新母盘来自网络某大神。进一步精简优化调整。2.只为呈现最好的作品,手工精简优化部分较多。3.OS版本号为19045.3031。个别要求高的就下MSDN吧,里面啥功能都有。4.集成《DrvCeo-2.13.0.8》网卡版、......
  • 支持复制粘贴word公式的文本编辑器
    ​ 图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.js,找到UM.plugins['autoupload'],然后找到autoUploadHandler方法,注释掉其中的代码。加入下面的代码://判断剪......
  • 支持复制粘贴word公式的Web编辑器
    ​ 这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下)<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@     page contentType="text/html;cha......
  • 支持复制粘贴word公式的百度Web编辑器
    ​ 自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了。一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器)中时,编辑器都无法自动上传图片。需要用户手动一张张上传Word图片。如果只有一张图片还能够接......
  • 第二次完美完成工作,心态爽爽的。
    <template><div><!--表单搜索档2023-5-23,gpt歌者文明--><divclass="search_stat"><app-search:searchByCompany="false"@search="search":searchFieldArray.sync="searchFieldArray"/>......
  • 支持复制粘贴word公式的百度HTML编辑器
    ​ 当前功能基于PHP,其它语言流程大致相同 1.新增上传wordjson配置在ueditor\php\config.json中新增如下配置:     /* 上传word配置 */    "wordActionName":"wordupload",/* 执行上传视频的action名称 */    "wordFieldName":"upfile",/* 提交的......
  • 支持复制粘贴word公式的KindEditor编辑器
    ​ 图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.js,找到UM.plugins['autoupload'],然后找到autoUploadHandler方法,注释掉其中的代码。加入下面的代码://判断剪......
  • 支持复制粘贴word公式的wangEditor编辑器
    ​ 这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下)<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@     page contentType="text/html;cha......
  • 支持复制粘贴word公式的eWebEditor编辑器
    ​如何做到ueditor批量上传word图片?1、前端引用代码<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>......
  • 皕杰报表+DataEase,中式复杂报表与数据可视化的完美组合
    在商业智能解决方案中,数据的展现及业务规律的呈现是商业智能中极其重要的组成部分。长久以来,由于数据源复杂多样性,以及中国传统文化的对于数据表格的工整、对称等等的影响下,报表工具一直担当着商业智能的数据展现中主角的位置;最近随着显示屏技术的发展、大屏价格的下调,数据大屏及数......