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…

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

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

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

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

最全面透彻的RabbitMQ指南

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

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

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

《看聊天记录都学不会C语言?太菜了吧》(2)我说编程很容易你们不服?

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

LCD1602,4位数据总线液晶屏时钟,STC12C5A60S2的10位ADC功能程序

/* 程序名&#xff1a;    LCD1602&#xff0c;4位数据总线液晶屏时钟&#xff0c;STC12C5A60S2的10位ADC功能程序 编写时间&#xff1a;  2015年10月4日 硬件支持&#xff1a;  LCD1602液晶屏 STC12C5A60S2 外部12MHZ晶振 接线定义&#xff1a; DB7 --> P1^7DB6…

WPF|黑暗模式的钱包支付仪表盘界面设计

收集下大家的意见&#xff0c;是否需要在文中贴上源码&#xff08;文末会给出源码链接&#xff09;&#xff0c;请大家踊跃留言。阅读目录效果展示准备简单说明 源码结尾&#xff08;视频及源码仓库&#xff09;1. 效果展示欣赏效果&#xff1a;2. 准备创建一个WPF工程&#x…

《看聊天记录都学不会C语言?太菜了吧》(3)人艰不拆,代码都在谈恋爱?!

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

DB2常用命令

查看DB2License信息 DB2基础命令 转载于:https://www.cnblogs.com/arcer/p/5573317.html

.NET7 Preview4之MapGroup

这篇是“闻(看)香(码)识(学)女(技)人(术)”。这也是一个有意思的功能&#xff0c;路由分组&#xff0c;啥也不说了&#xff0c;看代码看结果&#xff1a;using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.OpenApi;var builder WebApplication.Create…

【空间数据库】ArcGIS 10.6 Database_Server_Desktop安装、连接数据库服务、创建企业级数据库(附server10.6.ecp)

由于作者一直使用SQL Server 2008 R2开发版,之前在ArcGIS中创建企业级数据库都是基于单独安装的SQL Server 2008 R2开发版,今天我们演示安装ArcGIS10.6自带的数据库服务(SQL Server 2014 Express版本)、连接数据库服务和创建数据库。 首先,我们来看一下完整的ArcGIS10.6安…

(一)easyUI之树形网络

树形网格&#xff08;TreeGrid&#xff09;可以展示有限空间上带有多列和复杂数据电子表 一、案例一&#xff1a;按tree的数据结构来生成 前台<% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DO…

《看聊天记录都学不会C语言?太菜了吧》(4)零基础的我原来早就学会编程了?

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

二叉树结构 codevs 1029 遍历问题

codevs 1029 遍历问题 时间限制: 1 s空间限制: 128000 KB题目等级 : 钻石 Diamond题目描述 Description我们都很熟悉二叉树的前序、中序、后序遍历&#xff0c;在数据结构中常提出这样的问题&#xff1a;已知一棵二叉树的前序和中序遍历&#xff0c;求它的后序遍历&#xff0c;…

java的概率的程序_java实现一个抽奖概率类

在一些项目需求中&#xff0c;可能会遇到抽奖问题&#xff0c;如提供一系列奖品及获奖概率&#xff0c;要求根据概率返回每次抽到的奖品。以下是本人在实际项目中写的一个抽奖工具类&#xff0c;与大家共同分享&#xff1a;import java.util.ArrayList;import java.util.List;i…

【空间数据库】ArcGIS10.6连接PostgreSQL数据库并显示数据至ArcMap中

前面的文章《【开源数据库】Windows操作系统PostgreSQL+PostGIS环境搭建图文安装教程 》讲解了在Windows上安装开源GIS和开源数据库。本文接着来讲采用ArcGIS 10.6连接PostgreSQL数据库,并加载矢量数据到ArcMap中。 我们已经在pgAdmin中创建了一个空间数据库test,并导入了Sha…

算法-低位优先的字符串排序

低位优先的字符串排序相当于是对键索引计数方法的一个扩展&#xff0c;主要用于处理固定长度字符串&#xff0c;比如说手机号&#xff0c;固定电话&#xff0c;银行卡卡号&#xff0c;字符串的长度为N&#xff0c;从右向左开始进行每个键作为值开始遍历&#xff0c;实现比较简单…

使用 AgileConfig 动态配置 NLog

NLog 是我们在 .NET 领域使用非常广泛的日志组件。它默认使用 xml 来维护它的配置。最近有几个同学问我当使用 AgileConfig 的时候如何配置 NLog 。因为 AgileConfig 不支持集成 xml 格式的配置。其实 NLog 是支持从 appsettings.json / IConfiguration 读取配置的&#xff0c;…

《看聊天记录都学不会C语言?太菜了吧》(5)打了一把游戏我学会了一个编程知识?

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