我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何在c#中使用WPF对DataGrid中的Cell进行编辑

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何在c#中使用WPF对DataGrid中的Cell进行编辑

如何在c#中使用WPF对DataGrid中的Cell进行编辑?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1 MainWindow

<Window x:Class="DataGridCellDoubleClickDemo.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"        xmlns:xceed="http://schemas.xceed.com/wpf/xaml/datagrid"        xmlns:models="clr-namespace:DataGridCellDoubleClickDemo.Models"        xmlns:views="clr-namespace:DataGridCellDoubleClickDemo.Views"        mc:Ignorable="d"        Title="DataGridDemo" Height="450" Width="800">    <Window.Resources>        <DataTemplate x:Key="CustomTemplate">            <Border BorderThickness="1" BorderBrush="Blue">                <TextBlock Text="{Binding Path=Display }"  FontWeight="Bold"                           HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />            </Border>        </DataTemplate>        <DataTemplate x:Key="RowHeadTemplate" DataType="{x:Type models:RecipeControlVariable}">            <TextBlock Text="{Binding DisplayName}"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Foreground="Black" FontSize="12"/>        </DataTemplate>        <xceed:DataGridCollectionViewSource x:Key="recipeData" Source="{Binding RecipeVariables}"></xceed:DataGridCollectionViewSource>    </Window.Resources>    <Grid>        <xceed:DataGridControl x:Name="DataGridControl"                               AutoCreateColumns="False"                               FontSize="13"                               VerticalContentAlignment="Center"                               BorderBrush="Gray"                               BorderThickness="1"                               ItemsPrimaryAxis="Horizontal"                               PagingBehavior="LeftToRight"                               UpdateSourceTrigger="CellContentChanged"                               SelectionUnit="Cell"                               SelectionMode="Single"                                                             ItemsSource="{Binding  Source={StaticResource recipeData}}">            <xceed:DataGridControl.View>                <xceed:TableflowView FixedColumnCount="1" ContainerHeight="30" x:Name="tblView"                                        VerticalGridLineThickness="0.5" HorizontalGridLineBrush="Gray"                                        HorizontalGridLineThickness="1" VerticalGridLineBrush="Black"                                        RowFadeInAnimationDuration="0"                                        ScrollingAnimationDuration="0" ColumnStretchMinWidth="10"                                        DetailIndicatorWidth="20" ShowRowSelectorPane="False"                                        ShowScrollTip="False" UseDefaultHeadersFooters="False">                    <xceed:TableflowView.FixedHeaders>                        <DataTemplate>                            <xceed:ColumnManagerRow AllowColumnReorder="False" AllowColumnResize="True" AllowDrop="False" AllowSort="False" />                        </DataTemplate>                    </xceed:TableflowView.FixedHeaders>                </xceed:TableflowView>            </xceed:DataGridControl.View>             <xceed:DataGridControl.DefaultCellEditors>                <xceed:CellEditor x:Key="{x:Type models:SmartCellViewModel}">                    <xceed:CellEditor.EditTemplate>                        <DataTemplate>                            <views:SmartCellEditor Content="{xceed:CellEditorBinding}"  VerticalAlignment="Center"                                                   Height="{Binding ActualHeight,RelativeSource={RelativeSource AncestorType={x:Type Border},AncestorLevel=1}}"></views:SmartCellEditor>                        </DataTemplate>                    </xceed:CellEditor.EditTemplate>                </xceed:CellEditor>            </xceed:DataGridControl.DefaultCellEditors>         </xceed:DataGridControl>    </Grid></Window>

  在View部分主要是通过引用Xceed中的DataGridControl控件进行扩展的,这个里面主要是需要设置DataGridControl的View和DefaultCellEditor这个里面DefaultCellEditor是本文的重点,这个就是单元格Cell双击后进行编辑的主体,在这个里面我们需要指定CellEditor的EditTemplate,这里面需要匹配一个DataTemplate,这个里面是一个SmartCellEditor的子View,下面我们来看看这个SmartCellEditor里面是什么内容?

  2 SmartCellEditor

<UserControl x:Class="DataGridCellDoubleClickDemo.Views.SmartCellEditor"             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"             xmlns:conv="clr-namespace:DataGridCellDoubleClickDemo.Converters"             xmlns:xceed="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit"             mc:Ignorable="d"             d:DesignHeight="450" d:DesignWidth="800">    <UserControl.Resources>        <conv:VisibilityConverter x:Key="visConverter" />        <conv:TimeSpanConverter x:Key="timeSpanConverter" />        <conv:NumConverter x:Key="numConverter" />        <conv:BoolConverter x:Key="boolConverter" />    </UserControl.Resources>     <StackPanel Margin="0">        <!--TextBlock-->        <TextBlock x:Name="textBlock"                   Background="{Binding Background}"                   Foreground="{Binding Foreground}"                   Text="{Binding Path=Display,Mode=OneWay}"                    ToolTip="{Binding ToolTip}"                   FontWeight="{Binding FontWeight}"                   VerticalAlignment="Stretch"                    Visibility="{Binding Path=., Converter={StaticResource visConverter},ConverterParameter=TextBlock}"/>          <!--Editable ComboBox-->        <ComboBox x:Name="editableComboBox" ItemsSource="{Binding SmartCellData.Selections}" IsEditable="True"  VerticalAlignment="Stretch" VerticalContentAlignment="Center"                  DisplayMemberPath="SelectionDisplayName" Text="{Binding CellValue,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"                  Visibility="{Binding Path=., Converter={StaticResource visConverter},ConverterParameter=EditableComboBox}" />         <!--Readonly ComboBox-->        <ComboBox x:Name="readonlyComboBox"  VerticalAlignment="Center" VerticalContentAlignment="Stretch"  ItemsSource="{Binding SmartCellData.Selections}" IsEditable="False"                  DisplayMemberPath="SelectionDisplayName" SelectedValuePath="ControlName" SelectedValue="{Binding Path=CellValue,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"                  Visibility="{Binding Path=., Converter={StaticResource visConverter},ConverterParameter=ReadonlyComboBox}" />          <!--Text Input TextBox-->        <TextBox HorizontalContentAlignment="Left"  VerticalAlignment="Stretch" VerticalContentAlignment="Center" Text="{Binding CellValue}"                 Visibility="{Binding Path=., Converter={StaticResource visConverter},ConverterParameter=TextBox}" TextAlignment="Left" />          <!--Number Input TextBox-->        <xceed:DecimalUpDown HorizontalContentAlignment="Left"  VerticalAlignment="Stretch" VerticalContentAlignment="Center"  FormatString="G" Value="{Binding Path=CellValue,Converter={StaticResource numConverter},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"                             Increment="1" Visibility="{Binding Path=., Converter={StaticResource visConverter},ConverterParameter=DecimalUpDown}" TextAlignment="Left" />          <!--CheckBox-->        <CheckBox x:Name="checkBox"  VerticalAlignment="Stretch" VerticalContentAlignment="Center"  Content="{Binding Tag}" IsChecked="{Binding Path=CellValue,Converter={StaticResource boolConverter},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"                  Visibility="{Binding Path=., Converter={StaticResource visConverter},ConverterParameter=CheckBox}" />          <!--TimePicker-->        <xceed:DateTimeUpDown Format="Custom" FormatString="HH:mm:ss"  VerticalAlignment="Stretch" VerticalContentAlignment="Center"  Value="{Binding Path=CellValue,Converter={StaticResource timeSpanConverter},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"                              Visibility="{Binding Path=., Converter={StaticResource visConverter},ConverterParameter=TimePicker}" CultureInfo="uk-UA" />     </StackPanel></UserControl>

  在这个里面我们在一个StackPanel中放置了匹配各种数据类型的Template,并且每一个的Visibility都是由visConverter这个自定义的Converter来实现的,后面我们会分析这个Converter里面的内容,这些代码的整体思想就是每次这个StackPanel里面的Template都只有一个可以显示,其它的都是隐藏的,哪一个会显示是根据当前的数据类型决定的,每一个注释表示每一个类型的数据,比如我们如果定义的是Bool类型,那么当我们双击单元格Cell的时候会出现一个CheckBox供我们编辑,所以这个里面我们需要根据我们定义的数据类型来扩展对应的模板,当我们双击单元格的时候就会显示这个模板从而进行编辑数据。

  3 MainWindowViewModel

这个里面是定义的MainWindow对应的DataContext,在这里面我们会初始化绑定到MainWindow中DataGridControl的ItemsSource,我们先来看看这个里面核心的代码并就其中的要点进行分析。

using DataGridCellDoubleClickDemo.Models;using System;using System.Collections.ObjectModel;using System.Windows; namespace DataGridCellDoubleClickDemo{    public class MainWindowViewModel : NotificationObject    {        public MainWindowViewModel(Xceed.Wpf.DataGrid.DataGridControl dataGridControl)        {            DataGridControl = dataGridControl;            InitRecipeVariables();        }          #region Properties        private ObservableCollection<RecipeControlVariable> _RecipeVariables = new ObservableCollection<RecipeControlVariable>();         public ObservableCollection<RecipeControlVariable> RecipeVariables        {            get { return _RecipeVariables; }            set            {                if (value != _RecipeVariables)                {                    _RecipeVariables = value;                    OnPropertyChanged(nameof(RecipeVariables));                }             }        }         public Xceed.Wpf.DataGrid.DataGridControl DataGridControl { get; set; }         #endregion         #region Private Methods        private void InitRecipeVariables()        {            _RecipeVariables.Add(new RecipeControlVariable            {                ControlName = "Name",                DisplayName = "Name",                StepValues = new ObservableCollection<SmartCellViewModel>                {                    new SmartCellViewModel                    {                        CellValue="Step",                        ErrorInfo=null,                        SmartCellData=new RecipeVariableItem                        {                             ControlName = "Name",                             DisplayName = "Name",                             VariableEditorType=RecipeVariableEditorType.TextInput                        }                    },                    new SmartCellViewModel                    {                        CellValue="Step",                        ErrorInfo=null,                        SmartCellData=new RecipeVariableItem                        {                             ControlName = "Name",                             DisplayName = "Name",                             VariableEditorType=RecipeVariableEditorType.TextInput                        }                    }                }             });            _RecipeVariables.Add(new RecipeControlVariable            {                ControlName = "Time",                DisplayName = "Process Time(Sec)",                StepValues = new ObservableCollection<SmartCellViewModel>                {                    new SmartCellViewModel                    {                        CellValue="0",                        ErrorInfo=null,                        SmartCellData=new RecipeVariableItem                        {                             ControlName = "Time",                             DisplayName = "Process Time(Sec)",                             VariableEditorType=RecipeVariableEditorType.NumInput                        }                    },                    new SmartCellViewModel                    {                        CellValue="0",                        ErrorInfo=null,                        SmartCellData=new RecipeVariableItem                        {                             ControlName = "Time",                             DisplayName = "Process Time(Sec)",                             VariableEditorType=RecipeVariableEditorType.NumInput                        }                    }                }             });            _RecipeVariables.Add(new RecipeControlVariable            {                ControlName = "FrontChemical",                DisplayName = "FrontChemical",                StepValues = new ObservableCollection<SmartCellViewModel>                {                    new SmartCellViewModel                    {                        CellValue="None",                        ErrorInfo=null,                        SmartCellData=new RecipeVariableItem                        {                             ControlName = "FrontChemical",                             DisplayName = "FrontChemical",                             VariableEditorType=RecipeVariableEditorType.ReadOnlySelection,                             Selections=new ObservableCollection<SelectionItem>                             {                                 new SelectionItem                                 {                                     SelectionControlName="CHEM1",                                     SelectionDisplayName="CHEM1",                                 },                                 new SelectionItem                                 {                                     SelectionControlName="N2",                                     SelectionDisplayName="N2",                                 },                                 new SelectionItem                                 {                                     SelectionControlName="CDIW",                                     SelectionDisplayName="CDIW",                                 },                                 new SelectionItem                                 {                                     SelectionControlName="",                                     SelectionDisplayName="None",                                 }                             }                        }                    },                    new SmartCellViewModel                    {                        CellValue="None",                        ErrorInfo=null,                        SmartCellData=new RecipeVariableItem                        {                             ControlName = "FrontChemical",                             DisplayName = "FrontChemical",                             VariableEditorType=RecipeVariableEditorType.ReadOnlySelection,                             Selections=new ObservableCollection<SelectionItem>                             {                                 new SelectionItem                                 {                                     SelectionControlName="CHEM1",                                     SelectionDisplayName="CHEM1",                                 },                                 new SelectionItem                                 {                                     SelectionControlName="N2",                                     SelectionDisplayName="N2",                                 },                                 new SelectionItem                                 {                                     SelectionControlName="CDIW",                                     SelectionDisplayName="CDIW",                                 },                                 new SelectionItem                                 {                                     SelectionControlName="",                                     SelectionDisplayName="None",                                 }                             }                        }                    }                }             });            _RecipeVariables.Add(new RecipeControlVariable            {                ControlName = "NozzleBindingSetting",                DisplayName = "Nozzle Scan",                StepValues = new ObservableCollection<SmartCellViewModel>                {                    new SmartCellViewModel                    {                        CellValue="Default",                        ErrorInfo=null,                        SmartCellData=new RecipeVariableItem                        {                             ControlName = "NozzleBindingSetting",                             DisplayName = "Nozzle Scan",                             VariableEditorType=RecipeVariableEditorType.TextInput                        }                    },                    new SmartCellViewModel                    {                        CellValue="Default",                        ErrorInfo=null,                        SmartCellData=new RecipeVariableItem                        {                             ControlName = "NozzleBindingSetting",                             DisplayName = "Nozzle Scan",                             VariableEditorType=RecipeVariableEditorType.TextInput                        }                    }                }             });        }        #endregion         /// <summary>        /// reload datagrid content        /// </summary>        public void RefreshDataGrid()        {            try            {                if (null == DataGridControl) return;                //generate columns in Grid                DataGridControl.CurrentColumn = null;                if (DataGridControl.Columns.Count > 0)                    DataGridControl.Columns.Clear();                 var template = (DataTemplate)this.DataGridControl.FindResource("CustomTemplate");                var rowTemplate = (DataTemplate)this.DataGridControl.FindResource("RowHeadTemplate");                 DataGridControl.Columns.Add(new Xceed.Wpf.DataGrid.Column()                {                    Width = 140,                    Title = "Name",                    FieldName = ".",                    CellContentTemplate = rowTemplate                });                 var cellEditor = DataGridControl.DefaultCellEditors[typeof(SmartCellViewModel)];                 for (int index = 0; index < RecipeVariables[0].StepValues.Count; index++)                {                    int width = 1;                    for (int n = 0; n < RecipeVariables.Count; n++)                    {                        string display = RecipeVariables[n].StepValues[index].Display;                        if (!string.IsNullOrWhiteSpace(display))                        {                            int temp = display.Length * 7;                            width = Math.Max(temp, width);                        }                    }                    width = (int)(width * 1.1);                    width = Math.Max(width, 80);                    DataGridControl.Columns.Add(new Xceed.Wpf.DataGrid.Column()                    {                         Title = string.Format("Step {0}", index + 1),                        FieldName = string.Format("StepValues[{0}]", index),                        CellContentTemplate = template,                        AllowSort = false,                        Width = width,                        MaxWidth = width * 2,                        CellEditor = cellEditor                    });                }             }            catch (Exception ex)            {             }

  在这个里面我们重点分析下RefreshDataGrid这个子函数,在我们的MainWindowViewModel中我们定义的RecipeVariables是最终绑定到MainWindow中定义的DataGridControl中的ItemsSource,是整个控件的数据源,由于我们这个DataGird的第一列和后面的Step列数据类型不同,所以我们的RefreshDataGrid函数中增加Column列的时候是分作两个部分,第一个部分是单独增加一列,后面的列是通过循环StepValues这个集合来动态进行增加的,代码中我们定义了多少个StepValue,那么后面就会有多少列,这个里面的重点是增加Column的时候FieldName的赋值,这个是十分关键的,这个关系到能够让每一列获取到正确的数据源,例如第一列赋值Filed= “.” 表示直接从当前绑定的数据源获取数据,另外后面的Step列的每一个FieldName是动态进行赋值的,赋值语句是:FieldName = string.Format("StepValues[{0}]", index),这个里面Index是一个动态值,这个是非常关键的一步,另外后面的Step列由于需要通过双击进行编辑所以每一个Column是需要赋值CellEditor对象的,另外这个ViewModel中的DataGridControl是通过构造函数进行赋值的,构造函数中的赋值就是MainWindow中定义的DataGridControl对象,这个在阅读代码时需要特别注意。

  4 Models

Models主要是定义的数据集合,我们的代码中主要包括RecipeControlVariable和SmartViewModel这两个部分,这两个部分分别对应DataGridControl的数据源以及双击进行编辑的SmartCellEditor两个部分一一对应。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何在c#中使用WPF对DataGrid中的Cell进行编辑

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在c#中使用WPF对DataGrid中的Cell进行编辑

如何在c#中使用WPF对DataGrid中的Cell进行编辑?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1 MainWindow
2023-06-06

如何在Android应用中使用C++对Bitmap对象进行处理

这篇文章将为大家详细讲解有关如何在Android应用中使用C++对Bitmap对象进行处理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。步骤如下:a.编写JNI接口函数//java接口函数p
2023-05-31

C#开发中如何使用WPF和WinForms进行界面设计

C#开发中如何使用WPF和WinForms进行界面设计引言:在C#开发中,界面设计是一个重要的环节。有多种界面设计工具和框架可供选择,比如Windows Presentation Foundation(WPF)和Windows Forms(
2023-10-22

在Java中如何使用Callable、Future进行并行编程

这篇文章将为大家详细讲解有关在Java中如何使用Callable、Future进行并行编程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用Callable、Future进行并行编程在Java中进行并行编
2023-05-30

如何使用C#中的List.Sort函数对列表进行排序

如何使用C#中的List.Sort函数对列表进行排序在C#编程语言中,我们经常需要对列表进行排序操作。而List类的Sort函数正是为此设计的一个强大工具。本文将介绍如何使用C#中的List.Sort函数对列表进行排序,并提供具体的代码示例
如何使用C#中的List.Sort函数对列表进行排序
2023-11-17

如何在Python中使用Selenium对异常进行处理

这篇文章主要介绍了如何在Python中使用Selenium对异常进行处理,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对
2023-06-06

如何使用Python在Linux中进行脚本编写和执行

如何使用Python在Linux中进行脚本编写和执行在Linux操作系统中,我们可以使用Python编写并执行各种脚本。Python是一种简洁而强大的编程语言,它提供了丰富的库和工具,使得脚本编写变得更加简单和高效。下面我们将介绍在Linu
2023-10-22

如何在Android项目中使用ViewPager对radiogroup进行关联

如何在Android项目中使用ViewPager对radiogroup进行关联?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Android ViewPager与radiog
2023-05-31

如何在spring中使用kafka对消费者进行监听

这期内容当中小编将会给大家带来有关如何在spring中使用kafka对消费者进行监听,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。整合过程1. 引入spring-kafka的依赖包
2023-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录