其中XMAL文件中的表格样式:

<DataGrid x:Name="DataListView" AutoGenerateColumns="False" HorizontalAlignment="Center" Margin="14,10,162,0" VerticalAlignment="Top" ItemsSource="{Binding }" CanUserAddRows="False" CanUserSortColumns="False"  CanUserDeleteRows="False"  Width="350" Height="239" SelectionMode="Extended" SelectionUnit="Cell">
            <!-- This is required to handle CTRL + C when something is selected in the DataGrid -->
            <DataGrid.CommandBindings>
                <CommandBinding Command="Paste" Executed="PasteCommand" />
            </DataGrid.CommandBindings>

<DataGrid.InputBindings>
                <KeyBinding Key="V" Modifiers="Control" Command="Paste" />
            </DataGrid.InputBindings>

<DataGrid.ColumnHeaderStyle>
                <Style TargetType="DataGridColumnHeader">
                    <Setter Property="Background">
                        <Setter.Value>
                            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                <GradientStop Color="White" Offset="0"/>
                                <GradientStop Color="Green" Offset="0.5"/>
                                <GradientStop Color="White" Offset="1"/>
                            </LinearGradientBrush>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Foreground" Value="Black"/>
                    <Setter Property="FontSize" Value="16" />
                </Style>
            </DataGrid.ColumnHeaderStyle>
            <DataGrid.CellStyle>
                <Style TargetType="DataGridCell">
                    <Style.Triggers >
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="Snow"/>
                            <Setter Property="Foreground" Value="LimeGreen"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.CellStyle>
            <DataGrid.Columns>
                <!--UpdateSourceTrigger=PropertyChanged-->
                <DataGridTextColumn Header="模块名称" Binding="{Binding Path=strModuleName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" MinWidth="80"/>
                <DataGridTextColumn Header="最小值" Binding="{Binding Path=MinValue,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" MinWidth="80" />
                <DataGridTextColumn Header="最大值" Binding="{Binding Path=MaxValue,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" MinWidth="80" />
                <DataGridTextColumn Header="单位" Binding="{Binding Path=strUnit,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" MinWidth="80" />
            </DataGrid.Columns>
        </DataGrid>

使用MVVM模式下的双向绑定,红色部分需要注意

后台代码如下:

/// <summary>
        /// 粘贴处理剪贴板
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

private void PasteCommand(object sender, ExecutedRoutedEventArgs e)
        {
            // 获取剪切板的内容,并按行分割     
            string pasteText = Clipboard.GetText();
            if (string.IsNullOrEmpty(pasteText))
                return;
            int cIndex = -1;
            int rIndex = -1;
            if (DataListView.SelectedCells.Count > 0)
            {
                DataGridCellInfo dgcInfo = DataListView.SelectedCells[0];
                cIndex = dgcInfo.Column.DisplayIndex;

Dinfo dii = dgcInfo.Item as Dinfo;
                rIndex = GetDinfoIndex(dii);
                Console.WriteLine("("+ cIndex.ToString() + "," + rIndex.ToString() + ")");
            }
            string[] Rinfo = pasteText.Split(new string[]{"\r\n"}, StringSplitOptions.RemoveEmptyEntries);
            if (cIndex > -1 && rIndex>-1)
            {
                int rSum = Math.Min(Rinfo.Length, DataListView.Items.Count - rIndex);
                for(int i=0;i<rSum;i++ )
                {
                    string[] Cinfo = Rinfo[i].Split(new string[] { "\t" }, StringSplitOptions.RemoveEmptyEntries);
                    int cSum = Math.Min(Cinfo.Length, DataListView.Columns.Count - cIndex);
                    for(int j=0;j<cSum;j++)
                    {
                        //Console.WriteLine("行:" + (rIndex + i).ToString());
                        //Console.WriteLine("列:" + (cIndex + j).ToString());
                        DataGridColumn dgcC = DataListView.Columns[cIndex + j];
                        //Dinfo dinfo = DataListView.Items[rIndex + i] as Dinfo;
                        
                        try
                        {
                            (DataListView.Columns[cIndex + j].GetCellContent(DataListView.Items[rIndex + i]) as TextBlock).Text = Cinfo[j];
                        }
                        catch
                        {

}
                    }
                }
                //DataListView.Items.Refresh();
            }
            Console.WriteLine(pasteText);
           
        }

private int GetDinfoIndex(Dinfo di)
        {
            if( displaydatas.Contains(di))
            {
                return displaydatas.IndexOf(di);
            }
            else
            {
                return -1;
            }
        }

模拟MVVM加载数据

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Random rd = new Random();
            for(int i=0;i<5;i++)
            {
                Dinfo di = new Dinfo();
                di.MaxValue = 100 + rd.Next(0, 50);
                di.MinValue = 10 + rd.Next(1, 80);
                di.strModuleName = "模型" + i.ToString();
                di.strUnit =(new[] {"C","%","-","dB","Km","Kg","mm","cm","#"})[rd.Next(0,8)];
                displaydatas.Add(di);
            }
            DataListView.ItemsSource = displaydatas;
            listView.Items.Clear();
            listView.ItemsSource = displaydatas;
        }

模型类:

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

namespace WpfAppShow
{
    public class Dinfo: INotifyPropertyChanged
    {
        private string strmodulename;
        private string strunit;
        private int maxValue;
        private int minValue;

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
        public string strModuleName
        {
            get { return strmodulename; }
            set
            {
                strmodulename = value;
                OnPropertyChanged("strModuleName");
            }
        }
        public string strUnit
        {
            get { return strunit; }
            set
            {
                strunit = value;
                OnPropertyChanged("strUnit");
            }
        }

public int MaxValue
        {
            get { return maxValue; }
            set
            {
                maxValue = value;
                OnPropertyChanged("MaxValue");
            }
        }

public int MinValue
        {
            get { return minValue; }
            set
            {
                minValue = value;
                OnPropertyChanged("MinValue");
            }
        }
    }
}

WPF中的DataGrid支持Excell粘贴数据的更多相关文章

  1. WPF 中获取DataGrid 模板列中控件的对像

    WPF 中获取DataGrid 模板列中控件的对像 #region 当前选定行的TextBox获得焦点 /// <summary> /// 当前选定行的TextBox获得焦点 /// &l ...

  2. wpf中的datagrid绑定操作按钮是否显示或者隐藏

    如图,需要在wpf中的datagrid的操作那列有个确认按钮,然后在某些条件下确认按钮可见,某些情况下不可见的,放在mvc里直接在cshtml页面中if..else就行了. 但是在wpf里不行..网上 ...

  3. wpf中为DataGrid添加checkbox支持多选全选

    项目中用到DataGrid, 需要在第一列添加checkbox, 可以多选.全选. 其中涉及的概念DataTemplate, DataGridCellStyle, DataGridCellContro ...

  4. 不注册COM在Richedit中使OLE支持复制粘贴

    正常情况下在Richedit中使用OLE,如果需要OLE支持复制粘贴,那么这个OLE对象必须是已经注册的COM对象. 注册COM很简单,关键问题在于注册时需要管理员权限,这样一来,如果希望APP做成绿 ...

  5. 扩展ArcGIS API for Silverlight/WPF 中的TextSymbol支持角度标注

    原文 http://blog.csdn.net/esricd/article/details/7587136 在ArcGIS API for Silverlight/WPF中原版的TextSymbol ...

  6. WPF中退出时显示是否保存数据提示

    一.通过窗体中的按钮实现退出时数据保存提示 Xaml: <Grid> <TextBlock HorizontalAlignment="Left" Margin=& ...

  7. Wpf 中的DataGrid的Header属性,动态bind时不起作用

    在使用wpf开发软件时,有使用到DataGrid,DataGridTextColumn的Header 属性使用DynamicResource binding,在修改绑定数据源时,header并没有更新 ...

  8. WPF中使用DataGrid时操作列按钮问题

    在使用DataGrid的过程中,我们有时候需要对选取的某一行数据进行多个操作,这个时候操作列只有一个按钮显然无法满足我们的要求,我们需要多个按钮才能达到我们的目的. UI页面代码: <Grid& ...

  9. (转帖)关于easyui中的datagrid在加载数据时候报错:无法获取属性"Length"的值,对象为null或未定义

    结贴说明: 很感谢sp1234等人的热心帮忙和提醒,现在我主要说明下问题所在: 首先我在独立的js文件中,直接把测试数据loaddata进去datagrid是没有问题的.var kk = {" ...

  10. WPF中修改DataGrid单元格值并保存

    编辑DataGrid中的单元格的内容然后保存是非常常用的功能.主要涉及到的方法就是DataGrid的CellEditEnding  和BeginningEdit .其中BeginningEdit 是当 ...

随机推荐

  1. Linux进程调度算法

    进程的状态 进程的基本状态 就绪:进程已获得除处理机以外的所需资源,等待分配处理机资源 执行:进程正在占用处理机资源执行 阻塞:进程等待某种条件,在条件满足之前无法执行.例如发起I/O系统调用,等待I ...

  2. C#当窗体大小改变时,窗体中的控件大小也随之改变

    第一种:推荐 在窗体中加上如下代码即可实现,但窗体点击放大按钮时却不能改变控件大小. private Size beforeResizeSize = Size.Empty;protectedoverr ...

  3. 2020ICPC上海I - Sky Garden

    思维 [I-Sky Garden_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海)(重现赛)@hzy0227 (nowcoder.com)](https://codeforces.co ...

  4. 封装ajax、获取上一页面传参的方法

    1.封装ajax var defaultUrl = 'http://192.168.1.1:3000/' function post_data(url,data,successfn,errorfn){ ...

  5. string字符串类型的属性及各种方法

    C# 字符串(String) 在 C# 中,您可以使用字符数组来表示字符串,但是,更常见的做法是使用 string 关键字来声明一个字符串变量.string 关键字是 System.String 类的 ...

  6. Python3之并发(四)---线程锁

    一.线程锁 保证多线程数据的一致性,对锁内的资源进行锁定,同一时间只能有一个线程来修改共享的数据多个线程同时加了同一个锁对象时,先获取到锁的线程会继续运行,未获取到锁的线程会处于堵塞状态,直到前面的线 ...

  7. Python3注释

    Python中的注释有单行注释和多行注释: python中单行注释以#开头,例如: #这是一个注释 print("hello,word!") 多行注释用三个单引号'''或者三个双引 ...

  8. 052_Lightning

    不支持内容: JavaScript buttons, customizable forecasting, and customizable tabs. 设置部分User选择使用Lightning: 单 ...

  9. python_列表(list)

    列表用中括号表示,列表中的数据可以存储不同类型的数据,在实际开发中,列表中都是定义相同类型数据,可以对列表中的数据用相同的方法进行处理. 1, 通过index获取到对应的值. num_list = [ ...

  10. Java-JSP页面实现简单登录退出(菜鸟一枚、仅供参考)

    1.JSP页面代码 <%@ page language="java" contentType="text/html; charset=UTF-8" pag ...