gpt4 book ai didi

WPF 数据网格 : copy additional rows to clipboard

转载 作者:行者123 更新时间:2023-12-02 03:18:01 25 4
gpt4 key购买 nike

我正在使用 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

最佳答案

这是一个可能对您有帮助的代码片段。此代码段主要用于检索所有选定的数据,包括标题(我删除了 RowHeaders 部分,因为您显然不需要它)。如果您有任何疑问,请告诉我。我留下了一些用大写字母写的注释:这是您应该添加自己的数据的地方这种方法的优点在于它可以直接与 DataGridItemsSource 配合使用,而不是与 DataGridCell 配合使用。主要原因是:例如,如果您在格式化数字上使用 DataGridCell ,您将不会获得实际值,而只会获得格式化值(假设您的源是 14.49,而您的 StringFormat 是 N0,如果使用“常规”方式,则只需复制 14)

   /// <summary>
/// Handles DataGrid copying with headers
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnCopyingDataGrid(object sender, ExecutedRoutedEventArgs e)
{
// First step: getting the coordinates list of all cells selected
IList<Tuple<int, int>> cellsCoordinatesList = new List<Tuple<int, int>>();
HashSet<int> rowList = new HashSet<int>();
HashSet<int> columnList = new HashSet<int>();
foreach (System.Windows.Controls.DataGridCellInfo cell in this.SelectedCells)
{
int column = cell.Column.DisplayIndex;
int row = this.Items.IndexOf(cell.Item);
cellsCoordinatesList.Add(new Tuple<int, int>(row, column));
if (!rowList.Contains(row))
{
rowList.Add(row);
}
if (!columnList.Contains(column))
{
columnList.Add(column);
}
}

// Second step: Create the table to copy/paste
object[,] arrayToBeCopied = new object[rowList.Count, columnList.Count + 1];
IList<string> colHead = this.ColumnHeaders.Cast<object>().Select(h => h.ToString()).ToList();
for (int row = 0; row < arrayToBeCopied.GetLength(0); row++)
{
for (int column = 0; column < arrayToBeCopied.GetLength(1); column++)
{
if (row == 0)
{
arrayToBeCopied[row, column] = colHead[columnList.ElementAt(column - 1)];
}
else
{
arrayToBeCopied[row, column] = // WHATEVER YOU WANT TO PUT IN THE CLIPBOARD SHOULD BE HERE. THIS SHOULD GET SOME PROPERTY IN YOUR ITEMSSOURCE

}
}
}

// Third step: Converting it into a string
StringBuilder sb = new StringBuilder();

// HERE, ADD YOUR FIRST ROW BEFORE STARTING TO PARSE THE COPIED DATA

for (int row = 0; row < arrayToBeCopied.GetLength(0); row++)
{
for (int column = 0; column < arrayToBeCopied.GetLength(1); column++)
{
sb.Append(arrayToBeCopied[row, column]);
if (column < arrayToBeCopied.GetLength(1) - 1)
{
sb.Append("\t");
}
}
sb.Append("\r\n");
}

// AND HERE, ADD YOUR LAST ROWS BEFORE SETTING THE DATA TO CLIPBOARD

DataObject data = new DataObject();
data.SetData(DataFormats.Text, sb.ToString());

Clipboard.SetDataObject(data);
}

关于WPF 数据网格 : copy additional rows to clipboard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13178363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com