DataGridview中的行复制/粘贴功能(Windows应用程序)

时间:2010-01-18 22:30:34

标签: datagridview

我正在使用C#windows应用程序,并希望在DataGridView中复制一行并将其粘贴到新行中。我怎么能做到这一点?我正在使用.net framework 3.5。

您能否向我提供一些想法或一些代码,以表明我如何实现这一目标?

5 个答案:

答案 0 :(得分:7)

我找到了一个post,其中包含将剪贴板中的值粘贴到DataGridView中的代码。

  

我正在谷歌上搜索如何粘贴   C#中的DataGridView来自剪贴板,一个   信息,从Excel复制,但没有   找到完整的答案。收集的几个   来自论坛的线索和想出来的   这个答案,希望它会成功   有人生活更轻松。你不必   理解代码只是复制和   糊

下面是一个修改后的版本。除了小的重构,我禁止粘贴到ReadOnly单元格中。

用法示例:

private void dataGridView1_KeyUp(object sender, KeyEventArgs e)
{
    ClipboardUtils.OnDataGridViewPaste(sender, e);
}

代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace Commons
{
    public class ClipboardUtils
    {
        public static void OnDataGridViewPaste(object grid, KeyEventArgs e)
        {
            if ((e.Shift && e.KeyCode == Keys.Insert) || (e.Control && e.KeyCode == Keys.V))
            {
                PasteTSV((DataGridView)grid);
            }
        }

        public static void PasteTSV(DataGridView grid)
        {
            char[] rowSplitter = { '\r', '\n' };
            char[] columnSplitter = { '\t' };

            // Get the text from clipboard
            IDataObject dataInClipboard = Clipboard.GetDataObject();
            string stringInClipboard = (string)dataInClipboard.GetData(DataFormats.Text);

            // Split it into lines
            string[] rowsInClipboard = stringInClipboard.Split(rowSplitter, StringSplitOptions.RemoveEmptyEntries);

            // Get the row and column of selected cell in grid
            int r = grid.SelectedCells[0].RowIndex;
            int c = grid.SelectedCells[0].ColumnIndex;

            // Add rows into grid to fit clipboard lines
            if (grid.Rows.Count < (r + rowsInClipboard.Length))
            {
                grid.Rows.Add(r + rowsInClipboard.Length - grid.Rows.Count);
            }

            // Loop through the lines, split them into cells and place the values in the corresponding cell.
            for (int iRow = 0; iRow < rowsInClipboard.Length; iRow++)
            {
                // Split row into cell values
                string[] valuesInRow = rowsInClipboard[iRow].Split(columnSplitter);

                // Cycle through cell values
                for (int iCol = 0; iCol < valuesInRow.Length; iCol++)
                {

                    // Assign cell value, only if it within columns of the grid
                    if (grid.ColumnCount - 1 >= c + iCol)
                    {
                        DataGridViewCell cell = grid.Rows[r + iRow].Cells[c + iCol];

                        if (!cell.ReadOnly)
                        {
                            cell.Value = valuesInRow[iCol];
                        }
                    }
                }
            }
        }
    }
}

答案 1 :(得分:2)

DataGridViewRow类有一个.Clone方法,它将克隆它所拥有的当前行。

查看here了解更多信息

答案 2 :(得分:0)

将一行复制到另一行?为什么不这样做呢

public DataGridViewRow CloneWithValues(DataGridViewRow row)
{
    DataGridViewRow clonedRow = (DataGridViewRow)row.Clone();
    for (Int32 index = 0; index < row.Cells.Count; index++)
    {
        clonedRow.Cells[index].Value = row.Cells[index].Value;
    }
    return clonedRow;
}

您也可以参考:http://canlu.blogspot.com/2009/06/copying-datagridviewrow-to-another.html

希望这有帮助! :}

答案 3 :(得分:0)

  

以下是 alex2k8 的修改版本,这将适用于绑定的datagridview。

这是未经修改的版本

' Add rows into grid to fit clipboard lines
        if (grid.Rows.Count < (r + rowsInClipboard.Length))
        {
            grid.Rows.Add(r + rowsInClipboard.Length - grid.Rows.Count);
        }

这里是我的修改发生希望有人得到帮助这里dt是一个数据表

    ' Add rows into grid to fit clipboard lines
    If grid.Rows.Count < (r + rowsInClipboard.Length) Then
        Dim workRow As DataRow
        Dim i As Integer

        For i = 0 To (r + rowsInClipboard.Length - grid.Rows.Count)
            workRow = dt.NewRow()
            workRow(0) = ""

            dt.Rows.Add(workRow)
        Next
    End If
  

注意:代码在vb.net中使用http://converter.telerik.com/将其转换回c#

答案 4 :(得分:0)

我在这里尝试了答案,但由于DataGridView被数据绑定,并且由于我隐藏了某些行而使行索引的迭代变得混乱,因此最终不得不有所不同。这将复制当前选定的行并将其添加到数据表中。希望能帮助到你。

time_point