首页 > 编程语言 >C#WPFDataGrid表单查询,利用泛型、反射、委托、可兼容多对象查询

C#WPFDataGrid表单查询,利用泛型、反射、委托、可兼容多对象查询

时间:2024-11-22 21:46:32浏览次数:3  
标签:Name WPFDataGrid C# System 查询 Windows new using public

 

结合上篇帖子进行深入编写,通过使用泛型、反射、委托可实现多表单查询,同时通过datagrid绑定List<T>通过查询集合降低对数据库的访问。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows;
using WpfApp2.ViewModels;

namespace WpfApp2
{
    class DataGridQuery<T>
    {

        public static DataGrid Query(List<T> values)
        {
            DataGrid dataGrid = new DataGrid() { AutoGenerateColumns = false };
            Thread.Sleep(100);
            PropertyInfo[] propertyInfos = typeof(Person).GetProperties();
            foreach (var propertyInfo in propertyInfos)
            {
                string text = "";
                if (propertyInfo.GetCustomAttribute<DisplayNameAttribute>() != null)
                {

                    text = propertyInfo.GetCustomAttribute<DisplayNameAttribute>().DisplayName;
                }
                else
                {
                    continue;
                }
                DataGridTemplateColumn Column = new DataGridTemplateColumn();
                StackPanel stack = new StackPanel() { Orientation = Orientation.Vertical };

                TextBlock textBlock = new TextBlock
                {
                    Text = text,
                    VerticalAlignment = VerticalAlignment.Center
                };
                stack.Children.Add(textBlock); // 添加 TextBlock
                TextBox textBox = new TextBox();
                textBox.Name = propertyInfo.Name;
                textBox.KeyDown += new KeyEventHandler((object sender, KeyEventArgs e) =>
                {
                    if (e.Key == Key.Enter)
                    {

                        List<T> values1 = values.Where(
                            p =>
                            {
                                bool matches = false;
                                PropertyInfo[] infos = typeof(Person).GetProperties();
                                foreach (var pro in infos)
                                {
                                    PropertyInfo[] properties = p.GetType().GetProperties();
                                    foreach (var prop in properties)
                                    {
                                        if (textBox.Name == prop.Name)
                                        {
                                            if (textBox.Text.Trim() == "")
                                            {
                                                matches = true;
                                            }
                                            else if (prop.GetValue(p).ToString() == textBox.Text.Trim())
                                            {
                                                matches = true;
                                            }
                                        }
                                    }
                                }
                                return matches;
                            }
                        ).ToList();
                        dataGrid.ItemsSource = values1;
                    }
                });
                stack.Children.Add(textBox); // 添加 TextBlock

                // 设置列头模板
                Column.Header = stack;
                // 创建单元格模板
                DataTemplate cellTemplate = new DataTemplate();
                FrameworkElementFactory cellTextBlock = new FrameworkElementFactory(typeof(TextBlock));
                cellTextBlock.SetBinding(TextBlock.TextProperty, new System.Windows.Data.Binding(text));
                cellTemplate.VisualTree = cellTextBlock;

                Column.CellTemplate = cellTemplate;
                dataGrid.Columns.Add(new DataGridTextColumn { Header = stack, Binding = new System.Windows.Data.Binding(propertyInfo.Name) });

            }
            dataGrid.ItemsSource = values;
            return dataGrid;
        }
    }
}

该段代码主要是定义了MVVM框架下的UI与数据分离,同时实现数据订阅的功能。 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Ink;
using System.Windows.Input;
using System.Xml.Linq;
using WpfApp2.MVVM;

namespace WpfApp2.ViewModels
{
    public class MainWindow : ViewModelBase
    {
        private List<Person> people;
        public List<Person> People { get { return people; } set { people = value; OnPropertyChanged(); } }
        private DataGrid dataGrid = new DataGrid() { AutoGenerateColumns = false };
        public DataGrid DataGrid { get { return dataGrid; } set { dataGrid = value; OnPropertyChanged(); } }
        public MainWindow()
        {
            People = new List<Person>
            {
                new Person{Id=1,Name="张三asdfasfasdfadfafdasd",Age =25 },
                new Person{Id=2,Name="李四",Age =21 },
                new Person{Id=3,Name="王五",Age =23 },
                new Person{Id=3,Name="王五",Age =23 }
            };
            DataGrid = DataGridQuery<Person>.Query(People);
        }
    }

    public class Person : ViewModelBase
    {
        private int id;
        private string name;
        private int age;
        [DisplayName("序号")]
        public int Id { get { return id; } set { id = value; OnPropertyChanged(); } }
        [DisplayName("姓名")]
        public string Name { get { return name; } set { name = value; OnPropertyChanged(); } }
        [DisplayName("年龄")]
        public int Age { get { return age; } set { age = value; OnPropertyChanged(); } }

    }
}

标签:Name,WPFDataGrid,C#,System,查询,Windows,new,using,public
From: https://blog.csdn.net/qq_44774906/article/details/143983620

相关文章

  • C++中移动语义和拷贝语义的区别及智能指针
    一、C++中移动语义和拷贝语义的区别区别拷贝语义:在赋值或函数参数传递等操作时,会创建对象的一个完整副本。这意味着会分配新的内存空间,把原对象的数据复制到新内存中。如果对象数据量很大,复制操作会消耗较多资源(如时间、内存)。移动语义:是C++11引入的概念,用于优化对象资源所......
  • 【论文阅读】【计算机视觉-分割任务】Unstructured Road Segmentation Using Hypercol
    UnstructuredRoadSegmentationUsingHypercolumnBasedRandomForestsofLocalExpertsAuthors:GemmaM.Sanchez,PrassannaGaneshRavishankar,AntonioM.Lopez个人总结本篇文章提出了基于预训练卷积网络提取特征,并用局部专家优化的随机森林模型实现结构化道......
  • [PaperReading] EgoPoseFormer: A Simple Baseline for Stereo Egocentric 3D Human P
    目录EgoPoseFormer:ASimpleBaselineforStereoEgocentric3DHumanPoseEstimationTL;DRMethodDeformableStereoAttentionExperiment效果可视化总结与思考相关链接资料查询EgoPoseFormer:ASimpleBaselineforStereoEgocentric3DHumanPoseEstimationlink时间:EC......
  • Claude写的
    importorg.junit.Before;importorg.junit.Test;importorg.mockito.InjectMocks;importorg.mockito.Mock;importorg.mockito.MockitoAnnotations;importorg.elasticsearch.client.RestHighLevelClient;importorg.elasticsearch.snapshots.SnapshotInfo;importja......
  • 人工智能之深度学习基础——反向传播(Backpropagation)
    反向传播(Backpropagation)反向传播是神经网络的核心算法之一,用于通过误差反传调整网络参数,从而最小化损失函数。它是一种基于链式法则的高效梯度计算方法,是训练神经网络的关键步骤。1.反向传播的基本步骤1.1前向传播在前向传播过程中,输入数据从输入层经过隐藏层传递到输出层,......
  • Logisim-017-CRC解码
    电路文件所在电路/2-data.circ中的CRC解码1、其中[转换电路]在2-data.circ里面【转换电路】的原理是:余数和出错位数的关系是个映射关系,可以通过转换电路,转换成【循环左移电路】所需要左移的位数可以用真值表生成,生成时,r5r4r3r2r1系统自带的有,先将s4s3s2s1s0都置......
  • # 超详细解决 VS2022 不支持 scanf 的问题解决
    超详细解决VS2022关于scanf问题解决第一步先打开VS2022创建一个文件,例如下:然后按ctrl+F5运行,会出现以下情况:看到下面最长的一排报错,复制这一行字:在#include<stdio.h>的前面先打#define,然后将刚刚复制的文字粘贴,最后在后面加1。如下:现在按ctrl+F5便可以运行了......
  • 通过django渲染pyecharts图表到前端(超级详细,看一遍就懂)
    首先第一步,打开pycharm软件然后打开终端窗口在终端窗口中输入django-adminstartprojectpyecharts_django_demo,创建一个django文件然后再创建一个django应用程序,方便后面运行,在终端窗口输入:pythonmanage.pystartappdemo直接执行上面的命令会出现上面的问题,因为没有......
  • 【云岚到家】-day08-3-系统优化-查询优化
    【云岚到家】-day08-3-系统优化-查询优化0本期代码仓库3订单查询优化3.1订单查询优化方案1)为什么要优化订单查询?2)确定优化方向3)订单详情优化方案4)用户端订单列表优化方案5)运营端订单列表优化方案3.2订单详情优化1)阅读状态机快照查询代码2)订单详情查询优化3)测试3.2......
  • C++ 模板元编程的深度探索与实践
    C++模板元编程是一种强大而又复杂的编程技术,它允许在编译期进行计算和代码生成。模板元编程的核心是模板的特化和递归。通过模板特化,可以针对不同的类型或条件生成特定的代码。例如,定义一个模板函数来计算一个数的阶乘:template<intN>structFactorial{staticconst......