DataGridView中實現復制、剪切、粘貼功能


  用戶在使用WinForms應用程序時,為了快速的輸入數據,通常會在DataGridView與Excle之間進行復制、剪切、粘貼操作。將Excel中的數據復制到DataGridView時,直接使用Excel中的復制、剪切功能,需要在DataGridView中實現粘貼功能;將DataGridView中數據復制到DataGridView或Excel中時,需要在DataGridView中實現復制、剪切、粘貼功能。

   DataGridView.ClipboardCopyMode 屬性被設定為 DataGridViewClipboardCopyMode.Disable 以外的情況時,「Ctrl + C」 按下的時候,被選擇的單元格的內容會拷貝到系統剪切板內(DataGridView已提供了復制方法),可以直接粘貼到Excel 中,但在DataGridView中沒有提供粘貼方法,需要自己定義。

  以下分別演示在DataGridView中實現復制、剪切、粘貼功能:

        /// <summary>
        /// 實現復制功能,將DataGridView中選定單元格的值復制到剪貼板中
        /// </summary>
        /// <param name="dgv_Test"></param>
        private void CopyData(DataGridView dgv_Test)
        {
            Clipboard.SetDataObject(dgv_Test.GetClipboardContent());
        }

        /// <summary>
        /// 實現剪切功能,將DataGridView中選定單元格的值復制到剪貼板中,並將選中的單元格的值清空
        /// </summary>
        /// <param name="dgv_Test"></param>
        private void CutData(DataGridView dgv_Test)
        {
            //將選定單元格的值復制到剪貼板中
            Clipboard.SetDataObject(dgv_Test.GetClipboardContent());

            string clipboardText = Clipboard.GetText(); //獲取剪貼板的內容
            if (string.IsNullOrEmpty(clipboardText))
            {
                return;
            }
            int colnum = 0;
            int rownum = 0;
            for (int i = 0; i < clipboardText.Length; i++)
            {
                if (clipboardText.Substring(i,1) == "\t")
                {
                    colnum++;
                }
                if (clipboardText.Substring(i,1) == "\n")
                {
                    rownum++;
                }
            }
            //粘貼板上的數據來源於EXCEL時,每行末尾都有\n,來源於DataGridView是,最后一行末尾沒有\n
            if (clipboardText.Substring(clipboardText.Length-1,1) == "\n")
            {
                rownum--;
            }
            colnum = colnum / (rownum + 1);
            //獲取當前選中的最后一個單元格的列、行序號
            int colIndex = dgv_Test.SelectedCells[0].ColumnIndex;
            int rowIndex = dgv_Test.SelectedCells[0].RowIndex;
            for (int i = 0; i <= rownum; i++)
            {
                for (int j = 0; j <= colnum; j++)
                {
                    dgv_Test.Rows[rowIndex - i].Cells[colIndex - j].Value = "";
                }
            }
        }

        /// <summary>
        /// 實現粘貼功能,將剪貼板中的內容粘貼到DataGridView中
        /// </summary>
        /// <param name="dgv_Test"></param> 
        private void PasteData(DataGridView dgv_Test)
        {
            try
            {
                string clipboardText = Clipboard.GetText(); //獲取剪貼板中的內容
                if (string.IsNullOrEmpty(clipboardText))
                {
                    return;
                }
                int colnum = 0;
                int rownum = 0;
                for (int i = 0; i < clipboardText.Length; i++)
                {
                    if (clipboardText.Substring(i,1) == "\t")
                    {
                        colnum++;
                    }
                    if (clipboardText.Substring(i,1) == "\n")
                    {
                        rownum++;
                    }
                }
                //粘貼板上的數據來源於EXCEL時,每行末尾都有\n,來源於DataGridView是,最后一行末尾沒有\n
                if (clipboardText.Substring(clipboardText.Length-1,1) == "\n")
                {
                    rownum--;
                }
                colnum = colnum / (rownum + 1);
                object[,] data; //定義object類型的二維數組
                data = new object[rownum + 1, colnum + 1];  //根據剪貼板的行列數實例化數組
                string rowStr = "";
                //對數組各元素賦值
                for (int i = 0; i <= rownum; i++)
                {
                    for (int j = 0; j <= colnum; j++)
                    {                     
                        //一行中的其它列
                        if (j != colnum)
                        {
                            rowStr = clipboardText.Substring(0, clipboardText.IndexOf("\t"));
                            clipboardText = clipboardText.Substring(clipboardText.IndexOf("\t") + 1);
                        }
                        //一行中的最后一列
                        if (j == colnum && clipboardText.IndexOf("\r") != -1)
                        {
                            rowStr = clipboardText.Substring(0, clipboardText.IndexOf("\r"));
                        }
                        //最后一行的最后一列
                        if (j == colnum && clipboardText.IndexOf("\r") == -1)
                        {
                            rowStr = clipboardText.Substring(0);
                        }
                        data[i, j] = rowStr;
                    }
                    //截取下一行及以后的數據
                    clipboardText = clipboardText.Substring(clipboardText.IndexOf("\n") + 1);
                }
                //獲取當前選中單元格的列序號
                int colIndex = dgv_Test.CurrentRow.Cells.IndexOf(dgv_Test.CurrentCell);
                //獲取當前選中單元格的行序號
                int rowIndex = dgv_Test.CurrentRow.Index;
                for (int i = 0; i <=rownum; i++)
                {
                    for (int j = 0; j <= colnum; j++)
                    {
                        dgv_Test.Rows[i + rowIndex].Cells[j + colIndex].Value = data[i, j];
                    }
                }
            }
            catch
            {
                MessageBox.Show("粘貼區域大小不一致");
                return;
            }
        }

 

    //測試代碼

        private void tsmi_Copy_Click(object sender, EventArgs e)
        {
            CopyData(dgv_PersonInfo);
        }

        private void tsmi_Cut_Click(object sender, EventArgs e)
        {
            CutData(dgv_PersonInfo);
        }

        private void tsmi_Paste_Click(object sender, EventArgs e)
        {
            PasteData(dgv_PersonInfo);
        }

一本深入了解CLR和.NET Framework的C#經典書籍,值得有一定基礎的人員所擁有,在此推薦給大家。

http://s.click.taobao.com/t?e=zGU34CA7K%2BPkqB07S4%2FK0CFcRfH0GoT805sipKjy4P%2BQfuysWenw8LZY0QbMN7a1qMRwojQNUZuLcyGxfO4L4GExK79geXK7z3bd7n%2BCeOIMog%3D%3D


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM