DataGridView完美解决复制粘贴功能

Posted 小湖123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataGridView完美解决复制粘贴功能相关的知识,希望对你有一定的参考价值。


//在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

 



Windwos服务器远程桌面不能复制粘贴的解决方法

今天使用远程桌面连接登陆服务器,发现不能在本地电脑和远程服务器之间复制粘贴文件了,复制粘贴文本也不行。

网上搜了一下,主要有两种情况:

1、复制粘贴功能原本可以用,突然失灵了
2、从头到尾都无法使用这个复制粘贴功能

针对第一种情况,只需重启一下rdpclip.exe就可以了。

步骤:

1、打开任务管理器,查看进程,如果有 rdpclip.exe 进程,先关闭该进程
2、开始->运行->rdpclip.exe,重新运行此程序,恢复正常

如果是第二种情况,打开本机的远程桌面连接,按照下图所示,勾选以下项目

技术分享

最后介绍一下rdpclip.exe

rdpclip.exe是 Windows Server 资源工具包中提供的 Rdpclip 实用程序,它的功能就是在“终端服务”客户端(本机)和“终端”服务器(远程服务器)之间复制和粘贴文件,也包括粘贴文本。这个程序的文件路径是 c:\windows\system32\rdpclip.exe

 

http://www.jb51.net/article/60554.htm



以上是关于DataGridView完美解决复制粘贴功能的主要内容,如果未能解决你的问题,请参考以下文章

远程桌面无法复制粘贴的解决方法

C#中复制的事件是啥?

DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样

C#关于复制粘贴的功能,请高手帮忙解决~~~歇息。

Eclipse/MyEclipse中使用复制粘贴功能卡的解决办法

在 DataGridView 中复制行