DataGridView:将完成复制到剪贴板

Nig*_*gel 13 .net c# datagridview visual-studio-2010 winforms

我在.Net应用程序(V4 C#VS2010)中有一个DataGridView,并希望通过单击按钮将所有数据复制到剪贴板.没问题 -

private void copyToClipboard()
{
    dataGridView1.SelectAll();
    DataObject dataObj = dataGridView1.GetClipboardContent();
    if (dataObj != null)
        Clipboard.SetDataObject(dataObj);
}
Run Code Online (Sandbox Code Playgroud)

问题是用户可能已经在DataGrid上选择了一些单元格,行等,我真的不想更改该选择.以上显然选择了一切.我可以dataGridView1.ClearSelection(); 在结束时稍微好一些,但仍然没有达到要求.

我可以保存选定的单元格:

var mySelectedCells = dataGridView1.SelectedCells;
Run Code Online (Sandbox Code Playgroud)

但是如何在复制后在DataGrid上重新选择那些选定的单元?有没有一种简单的方法可以将选定的单元格集合重新放回DataGrid?也许有一种更好的方法可以将整个网格首先复制到剪贴板而不影响当前选定的单元格?

B L*_*B L 11

我想如果您只想将单元格的内容表示为文本并将它们复制到剪贴板(制表符分隔),您可以执行以下操作:

    var newline = System.Environment.NewLine;
    var tab = "\t";
    var clipboard_string = "";

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
         for (int i=0; i < row.Cells.Count; i++)
         {
              if(i == (row.Cells.Count - 1))
                   clipboard_string += row.Cells[i].Value + newline;
              else
                   clipboard_string += row.Cells[i].Value + tab;
         }
    }

    Clipboard.SetText(clipboard_string);
Run Code Online (Sandbox Code Playgroud)

输出看起来非常类似GetClipboardContent(),但要注意任何DataGridViewImageColumns或任何不隐式字符串的类型.

编辑: Anthony是正确的,使用StringBuilder避免为每个连接分配一个新字符串.新代码:

    var newline = System.Environment.NewLine;
    var tab = "\t";
    var clipboard_string = new StringBuilder();

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        for (int i = 0; i < row.Cells.Count; i++)
        {
            if (i == (row.Cells.Count - 1))
                clipboard_string.Append(row.Cells[i].Value + newline);
            else
                clipboard_string.Append(row.Cells[i].Value + tab);
        }
    }

    Clipboard.SetText(clipboard_string.ToString());
Run Code Online (Sandbox Code Playgroud)