WPF DataGrid不同数据源如何动态生成不同字段名的表格

编程开发
623
WPF
DataGrid
表格动态生成

这两天逛CSDN 看到有个题主的需求 标题是 “c# wpf中datagrid中指定单元格背景色设置问题 ” 顺手解决了下 感觉挺有意思的就做下记录

想要实现的效果图 如下

WPF DataGrid不同数据源如何动态生成不同字段名的表格

大致需求我总结了下

1.属性值为"*"的单元格需要填充为指定背景色

2.数据源可能会有多种 即标题和字段数量都不固定


解决思路:

1.实现单元格按条件着色 这个倒是挺简单 一个CellTemplate 可以轻松解决

2.动态生成表格,不同数据源意味值 标题列名称都不固定无法前端固定,所以选择后台代码中动态生成模板。

3.在加载数据源之前先清理掉上一次的字段列,然后按数据源生成新的字段模板添加到datagrid中。

逻辑很简单 难点在于会不会写生成这个模板列这一步代码 (很多时候百度是有对应答案的)


实现代码如下

#用户登录可见

  public class ManPeople
        {
            public string Name { get; set; }
            public string Sex { get; set; }
            public string Age { get; set; }
            public string Address { get; set; }
            public string Height { get; set; }
        }
        DataGrid TestDataGrid = new DataGrid() { AutoGenerateColumns = false };
        public MainWindow()
        {
            InitializeComponent();

            List peoples = new List();
            peoples.Add(new ManPeople { Name = "*", Age = "18", Sex = "男" });
            peoples.Add(new ManPeople { Name = "小王", Age = "*", Sex = "男" });
            peoples.Add(new ManPeople { Name = "小龙", Age = "18", Sex = "*" });
            peoples.Add(new ManPeople { Name = "小李", Age = "18", Sex = "男", Address = "*" });
            peoples.Add(new ManPeople { Name = "小宋", Age = "18", Sex = "男", Address = "6666666", Height = "*" });
            
            TestDataGrid.Columns.Clear();
            AddTemplateColumn("姓名","Name");
            AddTemplateColumn("年龄","Age");
            AddTemplateColumn("性别","Sex");
            AddTemplateColumn("地址", "Address");
            AddTemplateColumn("身高", "Height");
            this.TestDataGrid.ItemsSource = peoples;
            this.Content = TestDataGrid;

        }

        
        void AddTemplateColumn(string Title,string BindName) {

            var grid = new FrameworkElementFactory(typeof(Grid));
            grid.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
            var textBlock = new FrameworkElementFactory(typeof(TextBlock));
            textBlock.SetValue(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Stretch);
            textBlock.SetValue(TextBlock.HorizontalAlignmentProperty, HorizontalAlignment.Stretch);
            textBlock.SetBinding(TextBlock.TextProperty, new Binding(BindName));
            textBlock.AddHandler(TextBlock.LoadedEvent, new RoutedEventHandler(TextBlock_Loaded));
            grid.AppendChild(textBlock);
            var dataTemplate = new DataTemplate
            {
                VisualTree = grid
            };
            var templateColumn = new DataGridTemplateColumn
            {
                CellTemplate = dataTemplate,
                Header = Title
            };
            TestDataGrid.Columns.Add(templateColumn);
        }


        private void TextBlock_Loaded(object sender, RoutedEventArgs e)
        {
            TextBlock tb = (TextBlock)sender;
            if (tb.Text == "*")
            {
                tb.Background = Brushes.Red;
            }
        }

实现效果:

WPF DataGrid不同数据源如何动态生成不同字段名的表格

WPF Frame实现功能类似web浏览器的历史记录倒退前进效果
WPF+MVVM简单实际应用实例:打造一个任务管理器
关于WPF中Frame使用新Page切换内存上涨问题
WPF ListBox光标定位最后一行数据
WPF前端XAML页面实现灰白相间马赛克背景效果
WPF Style样式xaml如何实现继承效果
WPF文本框全选复制时被自动截断只能复制第一行文本
在.NET CORE\.NET 5 下WPF如何实现托盘图标功能
wpf Inkcanvas怎么保存为透明的图片
WPF开发样式文件的四种引用方式
XP系统下运行.net framework 4.0程序出现如下异常
WPF 设置程序不允许同一类程序多开进程
暂无相关内容...
WPF实现读取USB摄像头实时视频展示以及导出实时截图的C#源码例子
C#+WPF实现模仿实现的网易云音乐客户端源码
WPF实现的自定义工作大日历排班Calendar控件模板的例子源码
wpf实现大屏幕弹幕播放效果特效源码新手可参考下.rar
[人脸检测]基于C#OpenCvSharp+haarcascade人脸、人眼模型实现人脸检测源码
暂无章节内容...
免责声明 部分转载分享内容若侵犯您的权益,还请 邮件联系 侵删