使用DataGrid展示单元格合并数据

1. 引言

        本文介绍如何使用DataGrid进行合并单元格数据。

2. DataGrid 概述

        DataGrid 是一种用于在应用程序中显示和操作数据表格的控件。它常用于显示来自数据库或集合的数据,以便用户可以查看、编辑、排序和筛选这些数据。DataGrid 提供了一种灵活的方式来呈现和管理数据,使得开发人员可以快速构建用户界面。

3. 合并单元格的基本概念

        合并单元格是指将相邻的单元合并为一个大的单元格,这样可以使得表格数据呈现出更清晰的结构和逻辑关系。

4. 实现合并单元格的方法

  • 4.1.  定义数据结构

  • /// <summary>
    /// 数据类
    /// </summary>
    public class EquipmentInfo
    {
        /// <summary>
        /// 部门名称
        /// </summary>
        public string DepartmentName { get; set; }
        /// <summary>
        /// 设备名称
        /// </summary>
        public string EquipmentName { get; set; }
        /// <summary>
        /// 设备类型
        /// </summary>
        public string EquipmentType { get; set; }
        /// <summary>
        /// 设备状态
        /// </summary>
        public string EquipmentStatus { get; set; }
        public bool Equals(EquipmentInfo? other)
        {
            if (other == null) return false;
            return this.DepartmentName == other.DepartmentName && this.EquipmentName == other.EquipmentName && this.EquipmentType == other.EquipmentType;
        }
    }
  • 4.2. 定义计算单元格高度转化类

  •     /// <summary>
        /// 单元格高度转换类
        /// </summary>
        public class DataGridCellHeightConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                int height = 40;
                int finalHeight = 40;
                if (value is null) return height;
                if (value is CollectionViewGroup viewGroup)
                {
                    var itemsCount = viewGroup.Items.Count;
                    finalHeight = height * itemsCount;
                }
                return finalHeight;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return DependencyProperty.UnsetValue;
            }
        }
  • 4.3. 定义单元格数据源转换类

  • /// <summary>
    /// 单元格数据源转换类
    /// </summary>
    public class DataGridCellDataSourceConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is null || parameter is null) return Enumerable.Empty<object>();
            var readOnlyCollection = value as ReadOnlyObservableCollection<object>;
            if (readOnlyCollection == null) return Enumerable.Empty<object>();
            if (int.TryParse(parameter.ToString(), out int displayIndex))
            {
                ObservableCollection<EquipmentInfo> collection = new();
                foreach (var item in readOnlyCollection)
                {
                    collection.Add((EquipmentInfo)item);
                }
                var view = CollectionViewSource.GetDefaultView(collection);
                if (displayIndex == 1)
                {
                    view.GroupDescriptions.Clear();
                    view.GroupDescriptions.Add(new PropertyGroupDescription("EquipmentType"));
                    return view.Groups;
                }
                if (displayIndex == 2)
                {
                    view.GroupDescriptions.Clear();
                    view.GroupDescriptions.Add(new PropertyGroupDescription("EquipmentName"));
                    return view.Groups;
                }
                if (displayIndex == 3)
                {
                    view.GroupDescriptions.Clear();
                    view.GroupDescriptions.Add(new PropertyGroupDescription("EquipmentStatus"));
                    return collection;
                }
                return collection;
            }
            return Enumerable.Empty<object>();
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return DependencyProperty.UnsetValue;
        }
    }

    4.4 定义相关资源样式

  •   <Window.Resources>
          <SolidColorBrush x:Key="DataGrid.Background" Color="LightGray" />
          <Style x:Key="DataGrid.Base" TargetType="{x:Type DataGrid}">
              <Setter Property="AutoGenerateColumns" Value="False" />
              <Setter Property="RowHeaderWidth" Value="0" />
              <Setter Property="CanUserAddRows" Value="False" />
              <Setter Property="CanUserDeleteRows" Value="False" />
              <Setter Property="CanUserResizeColumns" Value="False" />
              <Setter Property="VirtualizingPanel.IsVirtualizing" Value="True" />
              <Setter Property="VirtualizingPanel.VirtualizationMode" Value="Recycling" />
              <Setter Property="VirtualizingPanel.CacheLengthUnit" Value="Item" />
              <Setter Property="VirtualizingPanel.ScrollUnit" Value="Item" />
              <Setter Property="ScrollViewer.CanContentScroll" Value="True" />
              <Setter Property="DataGrid.GridLinesVisibility" Value="Horizontal" />
              <Setter Property="DataGrid.HeadersVisibility" Value="Column" />
    
              <Setter Property="DataGrid.RowDetailsVisibilityMode" Value="VisibleWhenSelected" />
              <Setter Property="ScrollViewer.CanContentScroll" Value="true" />
              <Setter Property="ScrollViewer.PanningMode" Value="Both" />
              <Setter Property="Stylus.IsFlicksEnabled" Value="False" />
              <Setter Property="Template">
                  <Setter.Value>
                      <ControlTemplate TargetType="{x:Type DataGrid}">
                          <Border
                              Padding="{TemplateBinding Padding}"
                              Background="{TemplateBinding Background}"
                              BorderBrush="{TemplateBinding BorderBrush}"
                              BorderThickness="{TemplateBinding BorderThickness}"
             
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值