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

z概述

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

效果演示

ab85c99d56f525c86fe3272f2878c22e.png

实现方法

-. 前台XAML:

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

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

f156c08f3f5401664c807c95d7950a6b.png

-.后台代码:

数据模型:

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以及数据集合:

public Grid resultDisplayGrid;public BindableCollection<WidthMetrologyDTO> WidthMetrologyData { get; set; }= new BindableCollection<WidthMetrologyDTO>();

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

public void Grid_Loaded(object sender, RoutedEventArgs e){resultDisplayGrid = (Grid)sender;}

③添加数据集合:

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}");}}

④数据表格生成

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相对尺寸

var rowDefinition = new RowDefinition();resultDisplayGrid.RowDefinitions.Add(rowDefinition);rowDefinition.Height = new GridLength(30, GridUnitType.Pixel);//绝对尺寸

自动尺寸:

columnDefinition.Width = GridLength.Auto;

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

WidthMetrologyData.OrderByDescending(index => index.EdgePositions.Count).FirstOrDefault().EdgePositions.Count;

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

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

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件架构实践文章链接

2019独角兽企业重金招聘Python工程师标准>>> 架构 InfoQ: 又拍网架构中的分库设计 SNS网站数据库技术分析 - 51CTO.COM 数据库水平切分的实现原理解析 - iBATIS - Java - JavaEye论坛 基于amoeba的mysql分布式数据库学习&#xff08;一&#xff09; - Java - JavaEy…

【看动漫学编程】程序员在异世界生个娃 第2篇:外挂已准备就绪

前言 作者文笔比较水&#xff0c;还请见谅。 以下内容还将使用视频动态漫画表现&#xff0c;剪辑完将会贴出链接。 小说剧情为剧情需要&#xff0c;过渡到知识点&#xff0c;部分篇幅可能没有技术知识点还望谅解。 由于没有经费支持&#xff0c;所以画出来的东西是我自己用代码…

java剪切txt文件_用Java把剪切板的内容实时保存到txt

test类&#xff1a;提示用户程序已启动&#xff0c;提示保存位置&#xff0c;清空剪切板。package com.ariya.service;import com.ariya.service.impl.ClipboardServiceImpl;/*** author Ariya* 程序入口*/public class Test {public static void main(String[] args) {Clipboa…

【三维激光扫描】第一章:三维激光扫描入门基础知识

随着地理空间信息服务产业的快速发展,地理空间数据的要求越来越高。对地理空间数据的要求正朝着大信息量、高精度、可视化和可挖掘方向发展。地面激光雷达技术是一门新兴的测绘技术,已逐渐成为广大科研和工程技术人员全新的解决问题的手段。地面三维激光扫描技术与全站仪测量…

Android之kotlin里面本地图片BitmapFactory.decodeFile转bitmap失败问题

1 问题 我们手机本地有个图片文件比如如下 /storage/emulated/0/Android/data/package_name/cache/1586444511539.png 我们需要png转bitmap&#xff0c;然后设置到ImageView里面显示 var bitmap BitmapFactory.decodeFile(imagePath);if (bitmap null) returnelse mImagevi…

3、面向对象-继承-多态

1、继承子类可以继承父类的一切&#xff0c;一个子类只能有一个父类&#xff0c;一个父类可以有多个子类//父类class Ren{public $name;public $sex;public $yuyan;function Say() {echo $this->name."正在讲话&#xff01;";}}//美国人的子类class America ex…

整理iOS9适配中出现的坑

一、NSAppTransportSecurity iOS9让所有的HTTP默认使用了HTTPS&#xff0c;原来的HTTP协议传输都改成TLS1.2协议进行传输。直接造成的情况就是App发请求的时候弹出网络无法连接。解决办法就是在项目的info.plist 文件里加上如下节点&#xff1a; NSAppTransportSecurity - NSAl…

由c# dynamic是否装箱引发的思考

前言前几天在技术群里看到有同学在讨论关于dynamic是否会存在装箱拆箱的问题,我当时第一想法是"会"。至于为啥会有很多人有这种疑问&#xff0c;主要是因为觉得dynamic可能是因为有点特殊&#xff0c;因为它被称为动态类型,可能是因为这里的动态对大家造成的误解,认为…

【看动漫学编程】程序员在异世界生个娃 第3篇:搞不好我就是个王者

前言 作者文笔比较水&#xff0c;还请见谅。 以下内容还将使用视频动态漫画表现&#xff0c;剪辑完将会贴出链接。 小说剧情为剧情需要&#xff0c;过渡到知识点&#xff0c;部分篇幅可能没有技术知识点还望谅解。 由于没有经费支持&#xff0c;所以画出来的东西是我自己用代码…

PHP会话控制考察点

为什么要使用会话控制技术 HTTP协议是无状态的&#xff0c;也就是说HTTP没有一个内建的机制来维护两个事务之间的状态。当一个用户完成一个请求发起第二个请求的时候&#xff0c;服务器无法知道这次请求是来自于上一次的客户。而用户登录、购物车等&#xff0c;这些是需要服务器…

数据库SQL语句学习笔记(6)-使用函数处理数据

1.SQL也可以用函数来处理数据&#xff0c;函数一般是在数据上执行的&#xff0c;为数据的转换和处理提供了方便。但是每一个数据库管理系统&#xff08;DBMS&#xff09;都有特定的函数&#xff0c;事实上&#xff0c;只有少数几个函数被所有的DBMS等同地支持。例如&#xff0c…

java3n 1_1005 继续(3n+1)猜想(JAVA)

卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里&#xff0c;情况稍微有些复杂。当我们验证卡拉兹猜想的时候&#xff0c;为了避免重复计算&#xff0c;可以记录下递推过程中遇到的每一个数。例如对 n3 进行验证的时候&#xff0c;我们需要计算 3、5、8、4、2、1&…

【遥感物候】Matlab求解一元六次多项式,计算植被生长季始期

一元六次多项式能很好的逼近滤波后的曲线,与二次多项式相比,在拟合植被整个生长季曲线方面有更好的优势,该方法常用来描述北方温带和高纬度地区时序NDVI生长季模式。因此,本文使用一元六次多项式来拟合植被整个生长季曲线,效果很好。那么拟合后,这样解方程呢求生长季参数…

Android之给控件添加水纹波效果

1 问题 给控件添加水纹波效果&#xff0c;点击起来像点中了&#xff0c;不然效果太粗糙了&#xff0c;没反应。 2 实现 给控件添加如下属性 android:background"?android:attr/selectableItemBackground"波纹有边界 android:background"?android:attr/sele…

《看聊天记录都学不会C语言?太菜了吧》(1)我在大佬群里问基础问题没人理?

若是大一学子或者是真心想学习的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手…

个人博客作业_week2

1. 是否需要有代码规范 1.这些规范都是官僚制度下产生的浪费大家的编程时间、影响人们开发效率&#xff0c;浪费时间的东西。 我不同意这个论点。 有句俗语’无规矩不成方圆‘&#xff0c;这亘古传承的至理同样适用于写代码。制定代码撰写规范并不是 迫于压力完成上级的任务&am…

最全面透彻的RabbitMQ指南

概念RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯…

TensorFlow中RNN实现的正确打开方式

上周写的文章《完全图解RNN、RNN变体、Seq2Seq、Attention机制》介绍了一下RNN的几种结构&#xff0c;今天就来聊一聊如何在TensorFlow中实现这些结构&#xff0c;这篇文章的主要内容为&#xff1a; 一个完整的、循序渐进的学习TensorFlow中RNN实现的方法。这个学习路径的曲线较…

【遥感物候】Hants NDVI时间序列谐波分析法数据重构,植被生长季曲线效果可佳(附Hants软件下载)

NDVI时间序列谐波分析法(Harmonic Analysis of NDVI Time-Series)(简称Hants )对时间序列数据进行平滑。该方法是一种新的物候分析方法,可用于定量化的监测植被动态变化。其核心算法是傅里叶变换和最小二乘法拟合, 即把时间波谱数据分解成许多不同频率的正弦曲线和余弦曲线,…

Android之在Java socket作为服务器里面返回数据头部怎么写入浏览器需要下载文件的文件名

1 问题 Android app里面写了一个Java socket的简单服务器,在浏览器里面输入相应的IP和端口访问服务器下载文件,Java socket怎么写返回数据的头部信息,浏览器才知道需要下载文件的名字呢? 2 关于Content-Disposition 在常规的HTTP应答中,Content-Disposition 响应头指示回…