从WPF DataGrid将TextBox中的整个Selected Row数据复制到剪贴板

时间:2014-09-05 17:06:03

标签: c# wpf xaml datagrid clipboard

我正在使用WPF Datagrid并在所有单元格模板中放置一个文本框。意思是我的整个行包含所有文本框,数据绑定到那。当我从数据网格中选择任何行并点击ctrl + c时,我想要将整个行数据复制到剪贴板。

<DataGridTemplateColumn Header="Text" >
<DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
             <TextBox Text="{Binding Path=SAMPLETEXT}" />
       </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

尝试使用下面的代码,但它丢弃了空数据,即没有复制任何内容。我认为这是因为我的完整行包含文本框。

private void DataGrid_KeyDown(object sender, KeyEventArgs e)
{
    if(e.Key == Key.C && (e.SystemKey == Key.LeftCtrl || e.SystemKey == Key.RightCtrl))
    {

        ApplicationCommands.Copy.Execute(null, dataGridTest);

    }
}

请建议我任何更好的方法。 谢谢你的阅读。


更新 将以下代码行添加到DataGridTemplateColumn为我工作。

ClipboardContentBinding="{Binding SampleText}"

2 个答案:

答案 0 :(得分:0)

您必须使用Clipboard类以语法方式将值设置为Clipboard

Clipboard.SetText("your data");

从所选行中提取数据,将其合并到string变量中,并将该变量分配给Clipboard

答案 1 :(得分:0)

我知道这是一篇较旧的帖子,但是这个解决方案是为了完整而发布的,并且缺少使用与DataGridRowClipboardEventArgs关联的适合的DataGrid事件方法签名。

Clipboard.SetText可以是片状的,而不是一直抓取/设置剪贴板。

在SelectionUnit模式下为名为myDataGrid的dataGrid设置“FullRow”

<DataGrid x:Name="myDataGrid" SelectionUnit="FullRow"></DataGrid>

我们有一个方法myDataGrid_CopyingRowClipboardContent,它被调用dataGrid中的每个行,将其内容复制到剪贴板。例如,对于具有10行的数据网格,这称为10次。

public int clipboardcalledcnt { get; set; } //CopyingRowClipboardContent invoked count
private void myDataGrid_CopyingRowClipboardContent(object sender, DataGridRowClipboardEventArgs e)
{
    PathInfo cellpath = new PathInfo(); //a custom class to hold path info
    string path = string.Empty;

DataGrid dgdataPaths = (DataGrid)sender;
int rowcnt = dgdataPaths.SelectedItems.Count;

cellpath = (PathInfo)e.Item;

path = "Row #"+ clipboardcalledcnt +" Len="+ cellpath.Length.ToString() + ", path=" + cellpath.Path;

e.ClipboardRowContent.Clear();

if (clipboardcalledcnt == 0) //add header to clipboard paste
    e.ClipboardRowContent.Add(new DataGridClipboardCellContent("", null, "--- Clipboard Paste ---\t\t\n")); // \t cell divider, repeat (number of cells - 1)

clipboardcalledcnt++;
e.ClipboardRowContent.Add(new DataGridClipboardCellContent(path, null, path));

if (clipboardcalledcnt == rowcnt)
    clipboardcalledcnt = 0;

}