学习任重道远啊 2024-05-16 10:30 采纳率: 65.2%
浏览 49

dataGrid 单元格内容的快捷键复制粘贴

C#wpf dataGrid 单元格内容的快捷键复制粘贴 使用的是Prism框架

xaml 代码

<Window x:Class="DataGridOption.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="350" Width="525" KeyDown="Window_KeyDown">
    <Grid>
        <DataGrid ItemsSource="{Binding DataGridList}"  
                  SelectionUnit="Cell" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="School" Width="Auto" IsReadOnly="True" Binding="{Binding School,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
                <DataGridTextColumn Header="Name" Width="Auto"  Binding="{Binding Name,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
                <DataGridTextColumn Header="Avg" Width="Auto" Binding="{Binding Avg,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
                <DataGridTextColumn Header="Class" Width="Auto" Binding="{Binding Class,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>



dataGrid数据绑定使用的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataGridOption
{
    public class DataGridData
    {
        public string School {  get; set; }
        public string Name {  get; set; }
        public string Avg { get; set; }
        public string Class { get; set; }

    }
}


ViewModel代码为

using Prism.Mvvm;
using System.Collections.ObjectModel;

namespace DataGridOption.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private string _title = "Prism Application";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        private ObservableCollection<DataGridData> _DataGridList;
        public ObservableCollection<DataGridData> DataGridList
        {
            get => _DataGridList;
            set => SetProperty(ref _DataGridList, value);
        }

        public MainWindowViewModel()
        {
            ObservableCollection<DataGridData> dataGrids = new ObservableCollection<DataGridData>();
            dataGrids.Add(new DataGridData()
            { School = "湖南大学", Name = "john", Avg = "20", Class = "大二" });
            dataGrids.Add(new DataGridData()
            { School = "中南大学", Name = "jim", Avg = "22", Class = "大三" });
            dataGrids.Add(new DataGridData()
            { School = "湖南师范大学", Name = "godv", Avg = "23", Class = "大四" });
            dataGrids.Add(new DataGridData()
            { School = "国防科技大学", Name = "yhan", Avg = "19", Class = "大一" });
            _DataGridList = dataGrids;
        }
    }
}


窗体的代码

using System.Windows;
using System.Windows.Input;

namespace DataGridOption.Views
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            ModifierKeys keyboard = Keyboard.Modifiers;
            Key key = e.Key;
            if (keyboard == ModifierKeys.Control && key == Key.C)
            {
                // 在这里编写您想要执行的复制操作
                MessageBox.Show("复制");
                e.Handled = true; // 防止触发默认的复制操作
            }

            if (keyboard == ModifierKeys.Control && key == Key.V)
            {
                // 在这里编写您想要执行的粘贴操作
                MessageBox.Show("粘贴");
                e.Handled = true; // 防止触发默认的粘贴操作
            }
        }
    }
}


因为项目需要使用Ctrl+C 以及Ctrl+V 实现复制粘贴 但是按照网上方法,keydown一直监听不到C的按下操作,我如果改成Ctrl+s则就能显示复制,想请教下,这个是咋回事呢

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-16 10:38
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您想要解决的问题

    您想要解决的问题是如何在C# WPF应用程序中,使用Prism框架,通过快捷键Ctrl+C和Ctrl+V实现DataGrid单元格内容的复制和粘贴功能。

    问题出现原因

    问题出现的原因是在Window_KeyDown方法中,当用户按下Ctrl+C时,并没有正确触发复制操作。这可能是因为DataGrid的单元格并没有获得焦点,或者是因为复制操作被DataGrid本身的处理逻辑所拦截。

    问题解决方案

    为了解决这个问题,您需要确保在执行复制和粘贴操作时,DataGrid的相应单元格是选中并且获得焦点的。此外,您可能需要使用Clipboard类来进行复制和粘贴操作。

    提供代码

    以下是修改后的Window_KeyDown方法,实现了基本的复制粘贴逻辑:

    private void Window_KeyDown(object sender, KeyEventArgs e)
    {
        if (keyboard == ModifierKeys.Control && key == Key.C)
        {
            DoCopy();
            e.Handled = true;
        }
        else if (keyboard == ModifierKeys.Control && key == Key.V)
        {
            DoPaste();
            e.Handled = true;
        }
    }
    
    private void DoCopy()
    {
        if (dataGrid.SelectedCells.Count > 0)
        {
            // 获取选中的单元格
            var cell = dataGrid.SelectedCells.First();
            // 获取单元格的值
            var value = cell.Column.GetCellContent(cell.Item).BindingValue.ToString();
            // 将值复制到剪贴板
            Clipboard.SetText(value);
        }
    }
    
    private void DoPaste()
    {
        if (dataGrid.SelectedCells.Count > 0)
        {
            // 获取剪贴板中的内容
            var text = Clipboard.GetText();
            // 获取选中的单元格
            var cell = dataGrid.SelectedCells.First();
            // 获取单元格的绑定表达式
            var binding = cell.Column.Binding as Binding;
            // 设置单元格的值
            binding?.UpdateSource(cell.Item, text);
        }
    }
    

    请注意,这段代码只是一个基本示例,您可能需要根据您的具体需求进行调整。

    代码运行方式

    您需要将上述代码集成到您的WPF应用程序中,并确保您的DataGrid已经正确绑定到您的ViewModel。

    代码预期运行结果

    当用户按下Ctrl+C时,选中单元格的内容将被复制到剪贴板。当用户按下Ctrl+V时,剪贴板中的内容将被粘贴到当前选中的单元格中。

    推荐相关链接

    请根据您的具体需求和项目设置调整上述代码。如果您遇到任何问题,可以查看上述链接中的文档以获得更多帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月16日