Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C# WPF从后台代码生成行列可变的表格

C# WPF从后台代码生成行列可变的表格

作者头像
用户9127601
发布于 2022-06-09 13:44:09
发布于 2022-06-09 13:44:09
95900
代码可运行
举报
文章被收录于专栏:dotNET编程大全dotNET编程大全
运行总次数:0
代码可运行

z概述

WPF常用的表格控件是DataGrid,这个控件在前台XAML编写的话,一般列已经固定,然后给每个列去绑定数据,但是如果我的列不固定,随着运算结果变动呢?这时候DataGrid,就比较难实现这个需求,这节我就从后台代码去添加控件去实现这个功能.

效果演示

实现方法

-. 前台XAML:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                <dxlc:LayoutControl>

                    <Grid HorizontalAlignment="Left" VerticalAlignment="Top" 
                        cal:Message.Attach="[Event Loaded]=[Grid_Loaded($source,$eventArgs)]" />

                </dxlc:LayoutControl>

这里我把grid放到了dxlc:LayoutControl中,这样可以实现grid尺寸超出界面分配的长宽时,横纵出现滑动条:如下图

-.后台代码:

数据模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public class WidthMetrologyDTO
    {
        /// <summary>
        /// 
        /// </summary>
        public bool IsMeasureSuccess { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public double Degree { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public string ImageFilePath { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public double Width { get; set; }

        public double EdgeNum { get; set; }

        public List<EdgePosition> EdgePositions { get; set; }
    }

    public class EdgePosition
    {
        public double EdgesAmplitude { get; set; }
    }

①定义grid以及数据集合:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   public Grid resultDisplayGrid;
   public BindableCollection<WidthMetrologyDTO> WidthMetrologyData { get; set; }
            = new BindableCollection<WidthMetrologyDTO>();

②控件加载时获取grid对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        public void Grid_Loaded(object sender, RoutedEventArgs e)
        {
            resultDisplayGrid = (Grid)sender;
        }

③添加数据集合:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public void ResultDispaly()
        {
            try
            {
                WidthMetrologyData.Clear();
                WidthMetrologyData.Add(new WidthMetrologyDTO
                {
                    Width = 345.1,
                    EdgeNum = 3,
                    EdgePositions = new List<EdgePosition>
                    {
                        new EdgePosition(){EdgesAmplitude = 1.1},
                        new EdgePosition(){EdgesAmplitude = 2.2},
                        new EdgePosition(){EdgesAmplitude = 3.3},
                    },
                });
                WidthMetrologyData.Add(new WidthMetrologyDTO
                {
                    Width = 345.2,
                    EdgeNum = 2,
                    EdgePositions = new List<EdgePosition>
                    {
                        new EdgePosition(){EdgesAmplitude = 4.4},
                        new EdgePosition(){EdgesAmplitude = 5.5},
                    },
                });
                WidthMetrologyData.Add(new WidthMetrologyDTO
                {
                    Width = 345.3,
                    EdgeNum = 4,
                    EdgePositions = new List<EdgePosition>
                    {
                        new EdgePosition(){EdgesAmplitude = 6.6},
                        new EdgePosition(){EdgesAmplitude = 7.7},
                        new EdgePosition(){EdgesAmplitude = 8.8},
                         new EdgePosition(){EdgesAmplitude = 9.9},
                    },
                });
                WidthMetrologyData.Add(new WidthMetrologyDTO
                {
                    Width = 345.0,
                    EdgeNum = 1,
                    EdgePositions = new List<EdgePosition>
                    {
                        new EdgePosition(){EdgesAmplitude = 0.66},
                    },
                });
                AddResultGrid();
            }
            catch (Exception ex)
            {
                //logger.Debug($"ResultData add fail : {ex}");
            }
        }

④数据表格生成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        public void AddResultGrid()
        {
            try
            {
                resultDisplayGrid.Children.Clear();
                var gridColumns = 2 + WidthMetrologyData.OrderByDescending(index => index.EdgePositions.Count).FirstOrDefault().EdgePositions.Count;
                var gridRows = 16;

                //添加grid行
                for (int i = 0; i < gridColumns; i++)
                {
                    var columnDefinition = new ColumnDefinition();
                    resultDisplayGrid.ColumnDefinitions.Add(columnDefinition);
                    if (i == 1)
                    {
                        columnDefinition.Width = new GridLength(2, GridUnitType.Star);//相对尺寸
                    }
                    else
                    {
                        columnDefinition.Width = new GridLength(1, GridUnitType.Star);
                    }
                    //columnDefinition.Width = GridLength.Auto;
                }
                //添加grid列
                for (int i = 0; i < gridRows; i++)
                {
                    var rowDefinition = new RowDefinition();
                    resultDisplayGrid.RowDefinitions.Add(rowDefinition);
                    rowDefinition.Height = new GridLength(30, GridUnitType.Pixel);//绝对尺寸
                }

                //添加数据
                //var controlWidth = 100;
                //var controlHeight = 30;
                for (int degreeIndex = 0; degreeIndex < WidthMetrologyData.Count; degreeIndex++)
                {
                    var rowsCount = 3;
                    var columnsCount = WidthMetrologyData[degreeIndex].EdgePositions.Count;
  
                    for (int row = 0; row < rowsCount; row++)
                        for (int column = 0; column < columnsCount + 2; column++)
                        {
                            TextBlock tb = new TextBlock();
                            //tb.Width = controlWidth;
                            //tb.Height = controlHeight;
                            //tb.HorizontalAlignment = HorizontalAlignment.Left;
                            //tb.VerticalAlignment = VerticalAlignment.Center;


                            Border border = new Border();
                            border.BorderBrush = System.Windows.Media.Brushes.BlueViolet;
                            border.BorderThickness = new Thickness(1);

                            border.Child = tb;
                            border.SetValue(Grid.RowProperty, row + degreeIndex * 4);
                            border.SetValue(Grid.ColumnProperty, column);
                            resultDisplayGrid.Children.Add(border);

                            if (row == 0 && column >= 2)
                            {
                                tb.Text = (column - 1).ToString();
                            }
                            else if (row == 1 && column >= 2)
                            {
                                tb.Text = WidthMetrologyData[degreeIndex].EdgePositions[column - 2].EdgesAmplitude.ToString();
                            }
                            else if (row == 2 && column >= 2)
                            {
                                if (column == 2)
                                {
                                    tb.Text = WidthMetrologyData[degreeIndex].Width.ToString();
                                    //tb.Width = columnsCount * controlWidth;
                                    tb.SetValue(Grid.ColumnSpanProperty, columnsCount);
                                }
                                else
                                {
                                    continue;
                                }
                            }

                            if (column == 0)
                            {
                                if (row == 0)
                                {
                                    switch (degreeIndex)
                                    {
                                        case 0:
                                            tb.Text = "第一组"; break;
                                        case 1:
                                            tb.Text = "第二组"; break;
                                        case 2:
                                            tb.Text = "第三组"; break;
                                        case 3:
                                            tb.Text = "第四组"; break;
                                        default: break;
                                    }
                                    //tb.Height = 3 * controlHeight;
                                    tb.SetValue(Grid.RowSpanProperty, 3);
                                }
                                else
                                {
                                    continue;
                                }
                            }

                            if (column == 1)
                            {
                                switch (row)
                                {
                                    case 0:
                                        tb.Text = "ID"; break;
                                    case 1:
                                        tb.Text = "Value"; break;
                                    case 2:
                                        tb.Text = "Fraction"; break;
                                    default:
                                        tb.Text = string.Empty; break;
                                }
                                //tb.Width = controlWidth;
                            }

                        }
                }

                resultDisplayGrid.Width = (gridColumns + 1)* 40;
                //resultDisplayGrid.Height = gridRows * controlHeight;
            }
            catch (Exception ex)
            {
                //logger.Error($"Add result  grid fail,{ex}");
            }
        }

解释:

-. grid添加行以及尺寸设置:ridUnitType.Pixel代表绝对尺寸,GridUnitType.Star相对尺寸

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   var rowDefinition = new RowDefinition();
                    resultDisplayGrid.RowDefinitions.Add(rowDefinition);
                    rowDefinition.Height = new GridLength(30, GridUnitType.Pixel);//绝对尺寸

自动尺寸:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
columnDefinition.Width = GridLength.Auto;

-. link的使用:按照集合中EdgePositions数量降序排列后获取第一个列表值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WidthMetrologyData.OrderByDescending(index => index.EdgePositions.Count).FirstOrDefault().EdgePositions.Count;

-.生成控件并添加到grid中,并通过SetValue设置控件在grid中的行列位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                            TextBlock tb = new TextBlock();
                            //tb.Width = controlWidth;
                            //tb.Height = controlHeight;
                            //tb.HorizontalAlignment = HorizontalAlignment.Left;
                            //tb.VerticalAlignment = VerticalAlignment.Center;


                            Border border = new Border();
                            border.BorderBrush = System.Windows.Media.Brushes.BlueViolet;
                            border.BorderThickness = new Thickness(1);

                            border.Child = tb;
                            border.SetValue(Grid.RowProperty, row + degreeIndex * 4);
                            border.SetValue(Grid.ColumnProperty, column);
                            resultDisplayGrid.Children.Add(border);

源码

链接:https://pan.baidu.com/s/1mgzyTRVwvq1XpJ6y0iyVww

提取码:6666

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 dotNET编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2023年04月 WPF运动控制平台-005.运动平台之功能实现(完结)
---- 一、运动平台之功能实现 1.位置计算 物理可用距离 (40000), 取料位:19945P, 打包位:-19360P 像素位置:取料位:20px 打包位:1020px 把脉冲转换位距离 步进驱动器设置细分 8 步进电机步进角 1.8° 导程:8mm 计算步进电机走1cm需要的脉冲数 360 / 1.8 = 200个脉冲转一圈 200 * 8 = 1600个脉冲转一圈(细分情况) 1600 / 8 = 200 (步进电机走1mm需要) 故:走1cm需要脉冲
愚公搬代码
2023/04/28
4450
【愚公系列】2023年04月 WPF运动控制平台-005.运动平台之功能实现(完结)
WPF TreeGrid MVVM 模式下自定义表格带展开缩放效果,并且可以获取点击行的数据
MVVM其实就是:Model 、View、ViewModel三个的简称,就像MVC一样。 Model就是模型。View就是视图。ViewModel就是和view进行绑定的。
Shunnet
2022/05/31
6K0
WPF TreeGrid MVVM 模式下自定义表格带展开缩放效果,并且可以获取点击行的数据
WPF实现列表分页控件的示例代码分享
[TemplatePart(Name = CountPerPageTextBoxTemplateName, Type = typeof(TextBox))]
用户7718188
2022/11/06
1.3K0
Silverlight学习(二)
好久没来写博客了,这期间经历了春节,也因为忙于一个项目,所以博客被疏忽了。最近一段时间一直在用silverlight做项目,从来一开始的不熟悉渐渐的开始上手。今天记录一下自己学习prism的一些samplecode。 silvierlight目前的主流架构是Silverlight+MVVM+WCF RIA,说来惭愧本人做项目的时候对设计模式不是很了解。MVVM设计模式是指模型(Model)-视图(View)-视图模型(ViewModel),MVVM设计模式能够将程序的UI设计和逻辑设计分开,这样能够节省开发
水击三千
2018/02/27
7920
Silverlight Telerik控件学习:数据录入、数据验证
相信很多人都听说过这句名言:garbage in ,garbage out ! 数据录入不规范(或错误)就象一颗定时炸弹,迟早会给系统带来麻烦,所以在数据录入时做好验证是很有必要的。 相对传统asp.net开发而言,SL4中的数据验证要轻松很多(主要得益于Xaml的Binding特性),步骤如下: 1、定义业务Model类时,在需要验证的属性setter中,写好业务逻辑,对于不合规范的value,要抛出异常! 同时切记Model类要实现INotifyPropertyChanged接口,同时每个setter方
菩提树下的杨过
2018/01/23
3K0
Silverlight Telerik控件学习:数据录入、数据验证
【愚公系列】2023年04月 WPF运动控制平台-003.运动控制平台的UI设计
---- 一、运动控制平台的UI设计 1.代码 <Window x:Class="MotionPlatform.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/expr
愚公搬代码
2023/04/16
4900
【愚公系列】2023年04月 WPF运动控制平台-003.运动控制平台的UI设计
WPF开源项目:WPF-ControlBase
仓库README很素,但看作者README贴的几篇博文介绍,你会喜欢上它的,废话不多说,上介绍目录:
沙漠尽头的狼
2021/12/01
3.6K0
WPF开源项目:WPF-ControlBase
Drawer 抽屉控件的实现
定义了一个名为 Drawer 的自定义控件,继承自 HeaderedContentControl,允许用户在应用程序中创建可展开和收起的抽屉。抽屉的显示和隐藏动画通过 Storyboard 实现,支持从不同方向(左、上、右、下)展开和收起。
郑子铭
2024/12/09
1000
Drawer 抽屉控件的实现
WPF MVVM 模式下自写自用的窗口样式
废话我也就不多说,直接上菜(由于公司电脑做了加密,无法把代码压缩发布,只能以这种方式来分享)
Shunnet
2022/09/01
1.6K0
WPF MVVM 模式下自写自用的窗口样式
Silverlight企业应用框架设计【六】自定义系统菜单(使用自己的DataForm)
SilverLight企业应用框架设计【五】客户端调用服务端(使用JSON传递数据,自己实现RESTful Web服务)
liulun
2022/05/09
6830
Silverlight企业应用框架设计【六】自定义系统菜单(使用自己的DataForm)
电脑上AppData数据迁移(解决C盘空间不足的问题)
电脑使用时间一长,C盘就会空间不够用,其中大部分都是AppData文件夹占用的,我们就可以迁移
码客说
2023/03/24
11.5K0
win10 uwp 商业游戏 界面添加图标感谢
在显示启动的时候,是需要加载游戏需要使用的资源,如果觉得这时需要控制进度条,就需要使用注入的方法,给他知道现在的进度,不过我现在不去做这里,于是就很简单的代码做出来启动页面。
林德熙
2018/09/18
7920
win10 uwp 商业游戏 
            界面添加图标感谢
WPF 修改图片颜色
在 WPF 可以使用很多图片处理的方法,本文告诉大家的是一个图片处理,可以把处理的图片保存在文件。
林德熙
2018/09/19
3.4K0
WPF 修改图片颜色
如何实现日期范围选择器
原文链接: https://github.com/WPFDevelopersOrg/WPFDevelopers
郑子铭
2024/12/20
1010
如何实现日期范围选择器
【NEW】WPF MVVM 模式下自写自用的窗口样式
SVG是一种图形文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。严格来说应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。用户可以直接用代码来描绘图像,可以用任何文字处理工具打开SVG图像,通过改变部分代码来使图像具有交互功能,并可以随时插入到HTML中通过浏览器来观看。
Shunnet
2022/09/01
2.4K0
【NEW】WPF MVVM 模式下自写自用的窗口样式
wpf 自定义窗体 干货 干货
首先效果图如下: 步骤: 新建一个资源文件WindowsStyles.xaml 修改内容如下 : <ResourceDictionary xmlns="http://schemas.micr
zls365
2021/04/02
4760
采用WPF开发截图程序,so easy!
前言 QQ、微信截图功能已很强大了,似乎没必要在开发一个截图程序了。但是有时QQ热键就是被占用,不能快速的开启截屏;有时,天天挂着QQ,领导也不乐意。既然是程序员,就要自己开发截屏工具,功能随心所欲,岂不快哉。
梁规晓
2019/10/24
2.4K0
【NEW】WPF窗体中控件移动 + 拖拽大小 + 动画拖动
在之前写了WPF窗体中控件移动 + 拖拽大小 + 动画拖动,但是只能在Canvas容器布局中使用 现在,新增可以在GRID中可以动画拖动了 【GRID中实现动画效果】 下载 (1).gif 【Canvas实现动画效果】 下载 (2).gif 上菜【一定要给需要动态拖动的控件设置宽高】 /* 注意:只要不带焦点的控件包括用户控件 都可以拖动与拖拽大小 【基类中的【公共参数】可以自行修改哦】 使用方法[这是在一个窗体的后台代码]: //实例化对象
Shunnet
2022/06/09
2.3K1
【NEW】WPF窗体中控件移动 + 拖拽大小 + 动画拖动
SilverLight企业应用框架设计【二】框架画面
注意,这里每个顶部菜单的ICO图标不是动态的,朋友们,想让他变成动态的就自己动手吧
liulun
2022/05/09
6120
SilverLight企业应用框架设计【二】框架画面
【愚公系列】2023年10月 WPF控件专题 Grid控件详解
WPF控件是Windows Presentation Foundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。
愚公搬代码
2023/10/06
5750
推荐阅读
相关推荐
【愚公系列】2023年04月 WPF运动控制平台-005.运动平台之功能实现(完结)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验