C# WPF 记录DataGrid的表头顺序,下次打开界面时应用到表格中

news2025/1/6 19:51:18

效果:

代码实现

前端

 <DataGrid x:Name="DataGrid1"

<!--定义当列位置变化后的触发事件-->
  CanUserReorderColumns="True"
  ColumnReordered="DataGrid_ColumnReordered"

  rubyer:ControlHelper.FocusedForegroundBrush="{StaticResource Accent}"
  AutoGenerateColumns="False"
  BorderThickness="1"
  CanUserAddRows="False"
  GridLinesVisibility="All"

<!-- 定义当列位置变化时触发的事件-->
  ColumnDisplayIndexChanged="DataGrid_ColumnDisplayIndexChanged"

  HeadersVisibility="ALL"
  IsReadOnly="{Binding DataGridIsReadOnly, UpdateSourceTrigger=PropertyChanged}"
               Height="620"
  ItemsSource="{Binding Ibo}"
  SelectionMode="Single"
  FrozenColumnCount="1"
  PreviewMouseDown="DataGrid_PreviewMouseDown"
  PreviewMouseUp="DataGrid_PreviewMouseUp">
     <DataGrid.Columns>
     ......列的定义
     </DataGrid.Columns>
</DataGrid>

后端

 public partial class TraceTable : UserControl
 {

     private Dictionary<string, int> Column2Index;
     private t_user_column_indexDAL t_User_Column_IndexDAL = new t_user_column_indexDAL();
     private bool IsApplying;
     public TraceTable()
     {
         InitializeComponent();
         this.DataContext = App.Current.Services.GetService<TraceTableViewModel>();
         ApplySavedColumnOrder();

     }

     private void ApplySavedColumnOrder()
 {
     //在把数据库的表头顺序应用到DataGrid中时也会触发DataGrid_ColumnDisplayIndexChanged事件
     //所以要用IsApplying 记录是否正在初始化
     IsApplying = true;
     //从t_user_column_index中拿到dictionary并序列化

     string sql = $"select dictionary as toolStr1 from t_user_column_index where userid = '{UserSession.UserId}'";
     string dictionaryJson = t_User_Column_IndexDAL.db.SqlQueryable<ToolStr30>(sql).ToList().Count > 0 ?
         t_User_Column_IndexDAL.db.SqlQueryable<ToolStr30>(sql).ToList()[0].toolStr1:
         null;

     if (string.IsNullOrEmpty(dictionaryJson))
     {
         Column2Index = new Dictionary<string, int>
     {
         {"采购回复交期",1},
         {"供应商名称",2},
         {"品名",3},
         {"规格描述",4},
         {"采购订单号",5},
         {"采购数量(计量)",6},
         {"未交数量(计量)",7},
         {"单位",8},
         {"生产订单号",9},
         {"异常反馈",10},
         {"采购说明",11},
         {"请购日期",12},
         {"标准周期",13},
         {"采购标准周期",14},
         {"料号",15},
         {"采购建立日期",16},
         {"采购周期",17},
         {"来源单号",18},
         {"行号",19},
         {"现存量",20},
         {"收货数量(计量)",21},
         {"已退货数(计量)",22},
         {"实际入库数(计量)",23},
         {"含税单价",24},
         {"含税金额",25},
         {"入库单号",26},
         {"采购员",27},
         {"请购人",28},
         {"采购制单人",29},
         {"请购制单人",30},
         {"请购单备注",31},
         {"采购订单结案状态",32},
         {"已暂收数量(计量)",33},
         {"最后交货日期",34},
         {"逾期天数(负数未到期)",35},
         {"品质异常报告日期",36},
         {"品质问题描述",37},
         {"处理结论",38},
         {"交货结案日期",39},
         {"PMC交单日期",40},
         {"采购理论交期",41},
         {"要求交期",42},
         {"订单回传日期",43},
         {"色板_模板_图纸提供情况",44},
         {"预付款比例",45},
         {"预付款支付日期",46},
         {"尾款比例",47},
         {"尾款支付日期",48},
         {"备注",49},
         {"可用量",50},
         {"采购到货日期",51},
         {"财务交单日期",52},
         {"修改日期_请购",53},
         {"修改日期_采购",54},
         {"PMC要求交货日期",55}
     };
     }
     else
     {
         // 将 JSON 字符串解析为 JObject
         JObject jObject = JObject.Parse(dictionaryJson);

         // 将 JObject 转换为 Dictionary<string, int>
         Column2Index = jObject.ToObject<Dictionary<string, int>>();
     }

     for (int i = 0; i < DataGrid1.Columns.Count; i++)
     {
         var column = DataGrid1.Columns[i];

         if (column.Header.Equals("操作"))
         {
             // 如果列头为"操作",跳过该列
             continue;
         }
         Column2Index.TryGetValue(column.Header.ToString(), out int value);
         column.DisplayIndex = value; // 设置列的显示顺序
     }
     IsApplying = false;

 }

    private void DataGrid_ColumnDisplayIndexChanged(object sender, DataGridColumnEventArgs e)
    {
        if (IsApplying)
        {
            return;
        }
        var column = e.Column;
        // 获取变更后的列和新的列显示顺序
        int newIndex = column.DisplayIndex;
        Column2Index[column.Header.ToString()] = newIndex;
    }


    private void DataGrid_ColumnReordered(object sender, DataGridColumnEventArgs e)
    {
        string json = JsonConvert.SerializeObject(Column2Index);

        //先查询有无已经保存的数据
        string sql = $"select * from t_user_column_index where userid = '{UserSession.UserId}'";
        List<ToolStr30> sqlResult = t_User_Column_IndexDAL.db.SqlQueryable<ToolStr30>(sql).ToList();
        if (sqlResult.Count>0)
        {
            sql = $"update t_user_column_index  set dictionary = '{json}' where userid = '{UserSession.UserId}'";
            t_User_Column_IndexDAL.db.SqlQueryable<ToolStr30>(sql).ToList();

        }
        else
        {
            //将改变后的dictionary保存到数据库中
            sql = $"insert into t_user_column_index (userid,dictionary) values('{UserSession.UserId}','{json}')";
            var lists = t_User_Column_IndexDAL.db.SqlQueryable<ToolStr30>(sql).ToList();
        }
        

    }

}

数据库

思路:

1,登录进来时查询数据库有无自定义的列表头属性;

-- 有则拿出来序列化成Dictionary<string,int> Column2Index;

-- 没有则手动将表头和索引的对应关系保存到Dictionary<string,int> Column2Index中;

2,当表头位置发生变化触发DataGrid_ColumnDisplayIndexChanged事件,在该事件中修改Column2Index中对应的表头的索引位置;

3,当DataGrid_ColumnDisplayIndexChanged结束后还会触发DataGrid_ColumnReordered事件,该事件实在表头位置变化结束后触发,在这里面将修改后的Column2Index保存到数据库中

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

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

相关文章

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测 目录 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 吐血售&#xff01;聚划算&#xff01;Transforme…

面试官:如何设计一个能够支持高并发的系统?

强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站:人工智能 设计一个支持高并发的系统是一个系统工程&#xff0c;涉及多个层面的优化。以下逐一展开说明&#xff1a; 1. 分布式架…

企业数字化转型指南:如何通过价值流推动业务创新与变革

在全球企业加速数字化转型的浪潮中&#xff0c;企业领导者和技术人员必须理解数字化转型的核心不只是技术的应用&#xff0c;而是业务流程的彻底重塑。根据《价值流&#xff08;Value Streams&#xff09;》中的理论框架&#xff0c;数字化转型的关键在于价值流&#xff08;Val…

知识库管理系统:企业数字化转型的加速器

在数字化转型的大潮中&#xff0c;知识库管理系统&#xff08;KBMS&#xff09;已成为企业提升效率和创新能力的关键工具。本文将探讨知识库管理系统的定义、企业建立知识库的必要性&#xff0c;以及如何快速搭建企业知识库。 知识库管理系统是什么&#xff1f; 知识库管理系统…

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

JAVA学习日记(十五) 数据结构

一、数据结构概述 数据结构是计算机底层存储、组织数据的方式。 数据结构是指数据相互之间以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据&#xff0c;需要结合具体的业务场景来进行选择。 二、常见的数据结构 &#xff08;一&#xff09;栈 特点&…

【C++】—掌握STL vector 类:“Vector简介:动态数组的高效应用”

文章目录 1.vector的介绍和使用1.1vector的介绍1.2 vector的特点1.3vector的使用1.3.1vector的定义1.3.2vector iterator的使用1.3.3vector 的空间增长问题1.3.4 vector 的增删查改1.3.5vector 迭代器失效问题 1.vector的介绍和使用 1.1vector的介绍 vector是一个顺序容器&am…

PTE-中间件安全

DOCKER环境&#xff0c;一般是80 8080 8081端口 1 apache位置扩展名解析漏洞 cd vulhub-master/httpd/apache_parsing_vulnerability/ docker-compose up -d 修改一句话的后缀 直接上传 蚁剑 2 CVE-2017-15715 docker-compose stop cd .. cd CVE-2017-15715/ dock…

Python用CEEMDAN-LSTM-VMD金融股价数据预测及SVR、AR、HAR对比可视化

全文链接&#xff1a;https://tecdat.cn/?p38224 分析师&#xff1a;Duqiao Han 股票市场是一个复杂的非线性系统&#xff0c;股价受到许多经济和社会因素的影响。因此&#xff0c;传统的线性或近线性预测模型很难有效、准确地预测股票指数的价格趋势。众所周知&#xff0c;深…

【Revit二次开发】创建Ribbon选项卡与带图标的按钮

效果图 创建一个叫做“开发的插件”的选项卡&#xff0c; 选项卡内有一个叫做“Hello”的图标按钮&#xff0c; 点击按钮后运行一个命令&#xff0c; 该命令弹出提示框“Hello Revit!”。 在此示例基础上&#xff0c;可以根据需要替换图标、文字、命令功能。 步骤 安装Revit…

Java面试要点18 - Java运行时多态与编译时多态

本文目录 一、引言二、运行时多态的实现三、编译时多态的实现四、多态与接口五、多态的实际应用六、总结 一、引言 多态是面向对象编程的三大特性之一&#xff0c;它允许我们以统一的方式处理不同类型的对象。Java中的多态分为两种&#xff1a;编译时多态&#xff08;重载&…

使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件

前言 假设您正在现有项目中集成这些包&#xff0c;而该项目的构建工具为 Webpack 或 Vite。同时&#xff0c;您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法&#xff0c;请随时留言。 安装 npm install three types/three react-three/fiber rea…

HBase理论_背景特点及数据单元及与Hive对比

本文结合了个人的笔记以及工作中实践经验以及参考HBase官网&#xff0c;我尽可能把自己的知识点呈现出来&#xff0c;如果有误&#xff0c;还请指正。 1. HBase背景 HBase作为面向列的数据库运行在HDFS之上&#xff0c;HDFS缺乏随机读写操作&#xff0c;HBase正是为此而出现。…

(Go基础)Go的运行流程步骤与包的概念

1. 快速入门 所有的go开发&#xff0c;都必须存在并包含在某一个包内 .go 是go语言程序的后缀名 1.1 编译 通过使用 go build 命令对该go文件进行编译&#xff0c;生成.exe文件 1.2 运行 运行刚刚生成出来的test.exe文件既可&#xff0c;不过并不不是双击&#xff0c;而是在…

蓝桥杯每日真题 - 第11天

题目&#xff1a;&#xff08;合并数列&#xff09; 题目描述&#xff08;14届 C&C B组D题&#xff09; 解题思路&#xff1a; 题意理解&#xff1a;给定两个数组&#xff0c;目标是通过若干次合并操作使两个数组相同。每次合并操作可以将数组中相邻的两个数相加&#xff…

手撸 chatgpt 大模型:简述 LLM 的架构,算法和训练流程

本节我们自顶向下看看大模型的相关概念&#xff0c;了解其基本架构以及从零手撸大模型的基本流程。自从 openai 释放了 chatgpt 后&#xff0c;人工智能就立马进入了大模型时代&#xff0c;我还记得在此之前 NLP 的处理主要依赖于深度学习的 LSTM&#xff0c;GRU 等模型架构。这…

FPGA实现PCIE3.0视频采集转千兆UDP网络输出,基于XDMA+RTL8211E架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案我这里已有的以太网方案本博客方案的PCIE2.0版本 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存UDP视频组包发送UDP协议栈MAC数据缓冲FIFO组…

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto- WriteUp

2024年第四届“网鼎杯”网络安全比赛---朱雀组Crypto-WriteUp Crypto&#xff1a;Crypto-2&#xff1a;Crypto-3&#xff1a; 前言&#xff1a;本次比赛已经结束&#xff0c;用于赛后复现&#xff0c;欢迎大家交流学习&#xff01; Crypto&#xff1a; Crypto-2&#xff1a; …

PostgreSQL数据库笔记

PostgreSQL 是什么 PostgreSQL&#xff08;简称Postgres或PG&#xff09;是一个功能强大、可靠性高、可扩展性好的开源对象-关系数据库服务器&#xff08;ORDBMS&#xff09;&#xff0c;它以加州大学伯克利分校计算机系开发的POSTGRES版本4.2为基础。 发展历程 起源与发展&a…

el-table合并单元格之后,再进行隔行换色的且覆盖表格行鼠标移入的背景色的实现

el-table 中有现成的隔行换色功能&#xff0c;只要增加 stripe 属性即可。但是如果有单元格合并的话&#xff0c;这个属性就不可用了。这时候我们就需要动点小心思了。 基于相同字段进行合并 单元格合并&#xff1a;基于表头中的某一列&#xff0c;具有相同值的个数相加进行合…