WPF Datagrid:将其他行复制到剪贴板

时间:2012-11-01 13:43:45

标签: wpf datagrid clipboard

我正在使用WPF Datagrid,我正在尝试增强/更改副本&粘贴机制。

当用户选择一些单元格然后按CTRL + C时,底层控件可以捕获 CopyingRowClipboardContent 事件。

 this.mainDataGrid.CopyingRowClipboardContent 
              += this.DatagridOnCopyingRowClipboardContent;

在这种方法中,一些单元格被添加到标题和行中,因此导致“更宽”的网格。

    private void DatagridOnCopyingRowClipboardContent(
        object sender, 
        DataGridRowClipboardEventArgs dataGridRowClipboardEventArgs)
    {
        // this is fired every time a row is copied
        var allContent = dataGridRowClipboardEventArgs.ClipboardRowContent;

        allContent.Insert(0, new DataGridClipboardCellContent(
                                            null, 
                                            this.mainDataGrid.Columns[0], 
                                            "new cell"));
    }

此时我被卡住了,因为我试图在标题之前添加一行,在最后一行之后添加两行(见下图)。

有什么想法吗?建议?

请注意我对MVVM的方式不感兴趣。

enter image description here

3 个答案:

答案 0 :(得分:3)

以下是可能对您有所帮助的代码段。 此代码段主要用于检索所有选定的数据,包括标题(我删除了RowHeaders部分,因为您显然不需要它)。 如果您有任何疑问,请告诉我。我留下了一些用大写字母写的评论:这是你应该添加自己的数据的地方 这种方法的好处在于它直接适用于DataGrid的{​​{1}}而不是ItemsSource。主要原因是:例如,如果您对格式化的数字使用DataGridCell,则不会获得实际值,而只是格式化的值(假设您的来源为14.49且您的DataGridCell为N0,您就是如果你使用“常规”方式,我只会复制14)

StringFormat

答案 1 :(得分:0)

您是否尝试将内容复制到例如Excel以后? 如果是这样,这就是我的所作所为:

/// <summary>
/// Copy the data from the data grid to the clipboard
/// </summary>
private void copyDataOfMyDataGridToClipboard(object sender, EventArgs e)
{
    // Save selection
    int selectedRow = this.myDataGrid.SelectedRows[0].Index;

    // Select data which you would like to copy
    this.myDataGrid.MultiSelect = true;
    this.myDataGrid.SelectAll();

    // Prepare data to be copied (that's the interesting part!)
    DataObject myGridDataObject = this.myDataGrid.GetClipboardContent();
    string firstRow = "FirstRowCommentCell1\t"+ this.someDataInCell2 +"..\r\n";
    string lastTwoRows = "\r\nBottomLine1\t" + yourvariables + "\r\nBottomLine2";
    string concatenatedData = firstRow + myGridDataObject.GetText() + lastTwoRows;

    // Copy into clipboard
    Clipboard.SetDataObject(concatenatedData);

    // Restore settings
    this.myDataGrid.ClearSelection();
    this.myDataGrid.MultiSelect = false;

    // Restore selection
    this.myDataGrid.Rows[selectedRow].Selected = true;
}

在我的情况下,我有一些静态标题,可以很容易地与一些变量连接。要写的重要是\t用于声明另一个单元格,\r\n声明下一行

答案 2 :(得分:0)

我意识到这是一篇较旧的帖子,但我发布此解决方案是为了完整性。我找不到关于将datagrid行复制到剪贴板的最新问题。使用Clipboard.SetData会掩盖ClipboardRowContent的意图。

根据我的需要,我将重新粘贴回e.ClipboardRowContent我想要的行。 cell.Item是每个选定行所需的所有信息。

提示:我在没有做e.ClipboardRowContent.Clear()的情况下得到了重复项。使用e.ClipboardRowContent后。我之前正在清理并使用DataGrid.SelectedItems来构建行。

private void yourDataGrid_CopyingRowClipboardContent(object sender,    DataGridRowClipboardEventArgs e)
{
var dataGridClipboardCellContent = new List<DataGridClipboardCellContent>(); 

string prevCell = "";
string curCell = ""; 

foreach (DataGridClipboardCellContent cell in e.ClipboardRowContent)
{
    //Gives you access item.Item or item.Content here
    //if you are using your struct (data type) you can recast it here curItem = (yourdatatype)item.Item;        
    curItem = cell.Item.ToString(); 

    if (curCell != prevCell)
        dataGridClipboardCellContent.Add(new DataGridClipboardCellContent(item, item.Column, curCell)); 

    prevCell = curCell;  

}
e.ClipboardRowContent.Clear();

//Re-paste back into e.ClipboardRowContent, additionally if you have modified/formatted rows to your liking
e.ClipboardRowContent.AddRange(dataGridClipboardCellContent);

}