我正在使用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的方式不感兴趣。
答案 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);
}