C# WinForm DataGridView复制粘贴

实现功能:像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();
        }
    }
}

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值