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

server/2024/11/17 14:52:00/

效果:

代码实现

前端

 <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 字符串解析为 JObjectJObject 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.ppmy.cn/server/142668.html

相关文章

Grass脚本2倍速多账号

前言&#xff0c;小编也是第一次撸空投&#xff0c;我是抱着试一试的态度&#xff0c;梦想总是要有的万一白嫖了呢 Grass 是什么&#xff1f; Grass 扩展程序是一款创新的工具&#xff0c;它可以帮助您释放未使用的网络资源的力量。 通过分享您的剩余带宽&#xff0c;您可以赚…

计算机网络 (4)计算机网络体系结构

前言 计算机网络体系结构是指计算机网络层次结构模型&#xff0c;它是各层的协议以及层次之间的端口的集合。这一体系结构为计算机网络及其部件应完成的功能提供了精确定义&#xff0c;并规定了这些功能应由何种硬件或软件来实现。 一、主流模型 计算机网络体系结构存在多种模型…

Modbus TCP转Modbus ASCII解决方案

Modbus TCP和Modbus ASCII是两种不同的通信协议。Modbus TCP是一种二进制协议&#xff0c;Modbus ASCII是一种基于文本的协议。二者不能直接转换&#xff0c;因为它们的数据表示方式、消息结构、字符编码等都不相同。 如果你需要将Modbus TCP转换为Modbus ASCII&#xff0c;你…

【前端知识】Javascript前端框架Vue入门

前端框架VUE入门 概述基础语法介绍组件特性组件注册Props 属性声明事件组件 v-model(双向绑定)插槽Slots内容与出口 组件生命周期样式文件使用1. 直接在<style>标签中写CSS2. 引入外部CSS文件3. 使用CSS预处理器4. 在main.js中全局引入CSS文件5. 使用CSS Modules6. 使用P…

数字IC后端低功耗设计实现案例分享(3个power domain,2个voltage domain)

下图所示为咱们社区T12nm A55低功耗实现项目。其实这个项目还可以根据产品的需求做一些改进。改进后项目实现的难度会大大增加。也希望通过今天的这个项目案例分享&#xff0c;帮助到今年IC秋招的同学。 芯片低功耗设计实现upf编写指南&#xff08;附低功耗项目案例&#xff0…

Scala的Set集合

//设置一个Book。有三个属性&#xff1a;书名&#xff0c;作者&#xff0c;价格 class Book(var bookNmame:String,var author:String,var price:Double){} object demo7 {def main(args: Array[String]): Unit { // val set1 Set(1,1,2,3,3) // println(set1)//创建可…

背景替换大模型图像处理gradio部署服务

愿我们终有重逢之时&#xff0c;而你还记得我们曾经讨论的话题。 group 868373192 second group 277356808 1. 导入库 import gradio as gr from PIL import Image from modelscope_studio import encode_image, decode_image, call_demo_service import json import os from…

HP G10服务器ESXI6.7告警提示ramdisk tmp已满

物理服务器是HP G10 VCENTER内两台服务器报错提示ramdisk"tmp"已满&#xff0c;无法写入文件 登录ESXI命令行后发现两台主机的/tmp目录都没有空间了 定位到是ams-bbUsg.txt文件占用了大量的空间 1、关闭集群的DRS功能 2、迁移当前主机上面运行的所有虚拟机至其他主…