实现功能:像Excel一样,按选定区域的大小进行粘贴
DataGridView复制粘贴
要点:
1.在剪切板中,用\t区分不同的列,用\n却分不同的行
2.WinForm自带的函数selectedcells不能区分行列,只是从复制的区域的左上角至右下角逐个顺序编号,需要用复制单元格的总数除以剪切板中记录的行列数,进行运算,以确定在粘贴区域的位置
3.粘贴区域随复制方向的不同,记录的单元格的号码也不同,须重新计算,以在不同方向选择单元格区域时保证按顺序粘贴
4.记得把PasteCells()方法中的dataGridView1全部改为您项目中的DataGridView组件的名称。其他参数无需修改
public void PasteCells() //粘贴的方法(复制用系统自带)
{
//获取剪贴板里内容的基本信息
string pasteText=Clipboard.GetText();
int copyAreaRowNum = 0;
int copyAreaColumnNum = 0;
for (int i = 0; i < pasteText.Length; i++)
{
if (pasteText.Substring(i, 1) == "\t")
{
copyAreaColumnNum++;
}
if (pasteText.Substring(i, 1) == "\n")
{
copyAreaRowNum++;
}
}
copyAreaColumnNum = ( copyAreaColumnNum + 1 ) / ( copyAreaRowNum + 1 ) + 1; //选择区域的列,从1开始的计数
copyAreaRowNum += 1; //选择区域的行,从1开始的计数
//SelectCell[0]是鼠标抬起处的单元格,因选的方向可能不一样,需要通过以下两个块计算左上角的单元格
int selectedNum = dataGridView1.SelectedCells.Count; //SelectedCells只有一个维度,只能逐个计算一遍确定属性
//1.起始单元格(左上角)的X坐标(列号)
int[] tempX= new int[selectedNum];
for(int i=0;i < selectedNum; i++)
{
tempX[i]= dataGridView1.SelectedCells[i].ColumnIndex;
}
int pasteAreaStartX = tempX.Min(); //从0开始的实际的X坐标(所有X坐标的最小值)
int pasteAreaColNum = tempX.Max() - tempX.Min() + 1; //选择区的列数(最后的列号减最前的列号)
//2.起始单元格(左上角)的Y坐标(行号)
int[] tempY= new int[selectedNum];
for(int i=0 ; i < selectedNum ; i++)
{
tempY[i] = dataGridView1.SelectedCells[i].RowIndex;
}
int pasteAreaStartY = tempY.Min(); //从0开始的实际的Y坐标(所有X坐标的最小值)
nt pasteAreaRowNum = tempY.Max() - tempY.Min() + 1; //选择区的行数(最后的行号减最前的行号)
//粘贴的代码,选择多大区域,则把选择的区域填满
string[] temp1 = pasteText.Split('\n'); //把剪贴板内容拆成行
for (int i = 0; i < pasteAreaRowNum ; i++) //i是行号row
{
string[] temp2 = temp1[i % copyAreaRowNum].Split('\t'); //把剪贴板内容拆成列
for (int j = 0; j < pasteAreaColNum; j++) //j是列号column
{
dataGridView1.Rows[pasteAreaStartY + i].Cells[pasteAreaStartX + j].Value = temp2[j % copyAreaRowNum];
dataGridView1.Rows[pasteAreaStartY + i].Cells[pasteAreaStartX + j].Selected = true;
}
}
}
private void dataGridView1_KeyDown(object sender, KeyEventArgs e) //按下 Ctrl+V 时,执行粘贴方法
{
if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.V)
{
if (sender != null && sender.GetType() == typeof(DataGridView))
{
PasteCells();
}
}
}