【C#】GridControl动态更换DataSource,查询数据异常处理

news2024/9/20 0:57:50

系列文章

【C#】单号生成器(编号规则、固定字符、流水号、产生业务单号)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787

【C#】日期范围生成器(开始日期、结束日期)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129040663

【C#】组件化开发,调用dll组件方法
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129492112

【C#】数据实体类使用
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128816638

【C#】单据审批流方案
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128972545

【C#】二维码标签制作及打印
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126884228

【C#】最全单据打印源码(设计打印模板、条形码&二维码、标签、字体)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129415723

【C#】条码管理操作手册
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126589496

【C#】IIS平台下,WebAPI发布及异常处理
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126539836

【C#】【提高编程效率】代码模板生成工具
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126890673

【C#】【提高编程效率】Excel数据批量导入数据库
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126427323

【C#】Windows服务(Service)安装及启停方案
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124053794

【C#】穿透Session隔离,服务调用外部程序(无窗体界面解决)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124053033

【C#】任务计划实现,使用Quartz类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/123667723

【C#】《周计划管理关于产前准备模块》解决方案20200203
本文链接:https://blog.csdn.net/youcheng_ge/article/details/122919543

【C#】源码解析正则表达式
本文链接:https://blog.csdn.net/youcheng_ge/article/details/118337074

【C#】软件版本和文件MD5记录(XML操作)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/112513871

【C#】测试网络是否连通
本文链接:https://blog.csdn.net/youcheng_ge/article/details/110137288

【C#】根据名称获取编码(Dictionary获取key方法)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129816701

【C#】数据建模,你是使用DataTable还是List?
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129792726

【C#】GridControl控件和List数据集双向绑定
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129423755

【C#】GridControl动态更换DataSource,数据查询异常处理
本文链接:https://blog.csdn.net/youcheng_ge/article/details/130305424

文章目录

  • 系列文章
    • 【C#】GridControl动态更换DataSource,数据查询异常处理 本文链接:[https://blog.csdn.net/youcheng_ge/article/details/130305424](https://blog.csdn.net/youcheng_ge/article/details/130305424)
  • 前言
  • 一、问题描述
  • 二、解决方案
    • 2.1 清空GridView列
    • 2.2 所有的字段创建列
  • 三、软件开发(源码)
    • 3.1 查询按钮
    • 3.2 SQLite数据库脚本
    • 3.3 SQLite数据库辅助库
  • 四、项目展示
    • 4.1 显示焊接数据
    • 4.2 显示非焊接数据
  • 五、资源链接


前言

我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,这样外部函数就无法访问你。 又想让你成为全局常量,这样在我的整个生命周期都可以调用你。 可惜世上没有这样的常量,我也无法定义你,因为你在我心中是那么的具体。

哈喽大家好,本专栏为【项目实战】专栏,有别于【底层库】专栏,我们可以发现增加 了『问题描述』、『项目展示』章节,十分符合项目开发流程,让读者更加清楚项目解决的问题、以及产品能够达到的效果。本专栏收纳项目开发过程的解决方案,是我项目开发相对成熟、可靠方法的提炼,我将这些问题的解决思路梳理,撰写本文分享给大家,大家遇到类似问题,可按本文方案处理。

本专栏会持续更新,不断完善,专栏文章关联性较弱(文章之间依赖性较弱,没有阅读顺序)。大家有任何问题,可以私信我。如果您对本专栏感兴趣,欢迎关注吧,我将带你用最简洁的代码,实现复杂的功能。

·提示:本专栏为项目实战篇,未接触项目开发的同学可能理解困难,不推荐阅读。
3A0N000001


一、问题描述

GridControl动态更换DataSource,数据刷新异常处理。
当我们使用GridControl控件时,如果表格列没有预先添加,而是采用动态形势,更换绑定的DataSource时会发生异常,数据字段列对不上的情况,依然缓存了上一次的结果。
可能有人说,你使用 RefreshDataSource();刷新一下DataSource,也许就行了。我很抱歉的告诉你,不行,而且你重新绑定DataSource也不行。

GridControl控件,没有添加任何列:
在这里插入图片描述

在这里插入图片描述
我们看一下取数效果:
① 显示焊接数据。

select first_code as '钨条编号1',second_code as '钨条编号2',code_no as '内部编号',date as '日期','空' as '厂家编号' from T_merge where (1=1)

在这里插入图片描述
② 显示非焊接数据。

select supply_no as '厂家编号',code_no as '内部编号',date as '日期' from T_Main where (1=1)

发现问题没?此刻GridControl控件中的列,依旧是第一次绑定数据源的列,完全没有变化,之所以“日期”、“内部编号”有数据显示,完全是因为我起的名字一样。
在这里插入图片描述
我在给你们看一下,数据源取数的代码:

        private void BTN_Search_Click(object sender, EventArgs e)
        {
            string str_SQL = string.Empty;
            if (checkEdit1.Checked)
            {
                str_SQL = "select first_code as '钨条编号1',second_code as '钨条编号2',code_no as '内部编号',date as '日期','空' as '厂家编号' from T_merge where (1=1) " + SQLCondition();

                DataTable Dt_Search1 = new DataTable();
                SQLiteHelper sQLite = new SQLiteHelper();
                Dt_Search1 = sQLite.ExecuteQuery(str_SQL);

                GC_Main.DataSource = Dt_Search1;
                GC_Main.RefreshDataSource();
            }
            else
            {
                str_SQL = "select supply_no as '厂家编号',code_no as '内部编号',date as '日期' from T_Main where (1=1) " + SQLCondition();

                DataTable Dt_Search2 = new DataTable();

                SQLiteHelper sQLite = new SQLiteHelper();
                Dt_Search2 = sQLite.ExecuteQuery(str_SQL);

                GC_Main.DataSource = Dt_Search2;
                GC_Main.RefreshDataSource();
            }
        }

有人又可能怀疑说,你这个数据源,实例化的时候,没有指定好表格列啊?你把列定义好,应该就OK了。我只能说一样的,我从数据库取数,自然就DataTable列了。为了消除顾虑,这里我把表格列定义好再演示一遍。

        private void BTN_Search_Click(object sender, EventArgs e)
        {
            string str_SQL = string.Empty;
            if (checkEdit1.Checked)
            {
                str_SQL = "select first_code as '钨条编号1',second_code as '钨条编号2',code_no as '内部编号',date as '日期','空' as '厂家编号' from T_merge where (1=1) " + SQLCondition();

                DataTable Dt_Search1 = new DataTable();
                Dt_Search1.Columns.Add("钨条编号1", typeof(System.String));
                Dt_Search1.Columns.Add("钨条编号2", typeof(System.String));
                Dt_Search1.Columns.Add("内部编号", typeof(System.String));
                Dt_Search1.Columns.Add("日期", typeof(System.String));
                Dt_Search1.Columns.Add("厂家编号", typeof(System.String));

                SQLiteHelper sQLite = new SQLiteHelper();
                Dt_Search1 = sQLite.ExecuteQuery(str_SQL);

                GC_Main.DataSource = Dt_Search1;
                GC_Main.RefreshDataSource();
            }
            else
            {
                str_SQL = "select supply_no as '厂家编号',code_no as '内部编号',date as '日期' from T_Main where (1=1) " + SQLCondition();

                DataTable Dt_Search2 = new DataTable();
                Dt_Search2.Columns.Add("厂家编号", typeof(System.String));
                Dt_Search2.Columns.Add("内部编号", typeof(System.String));
                Dt_Search2.Columns.Add("日期", typeof(System.String));

                SQLiteHelper sQLite = new SQLiteHelper();
                Dt_Search2 = sQLite.ExecuteQuery(str_SQL);

                GC_Main.DataSource = Dt_Search2;
                GC_Main.RefreshDataSource();
            }
        }

DataTable表格列,我定义好了,数据源依旧无法刷新。
在这里插入图片描述
综上,这就是我遇到的问题,当然如果你把GridControl控件,预先添加好列是不会发生的。

二、解决方案

2.1 清空GridView列

GridView.Columns.Clear();

2.2 所有的字段创建列

PopulateColumns()方法的定义,摘要为:Create columns for all fields in the bound data source
意思是在绑定的数据源中为所有的字段创建列

GridView.PopulateColumns();

三、软件开发(源码)

3.1 查询按钮

        private void BTN_Search_Click(object sender, EventArgs e)
        {
            string str_SQL = string.Empty;
            if (checkEdit1.Checked)
            {
                str_SQL = "select first_code as '钨条编号1',second_code as '钨条编号2',code_no as '内部编号',date as '日期','空' as '厂家编号' from T_merge where (1=1) " + SQLCondition();

                DataTable Dt_Search1 = new DataTable();
                Dt_Search1.Columns.Add("钨条编号1", typeof(System.String));
                Dt_Search1.Columns.Add("钨条编号2", typeof(System.String));
                Dt_Search1.Columns.Add("内部编号", typeof(System.String));
                Dt_Search1.Columns.Add("日期", typeof(System.String));
                Dt_Search1.Columns.Add("厂家编号", typeof(System.String));

                SQLiteHelper sQLite = new SQLiteHelper();
                Dt_Search1 = sQLite.ExecuteQuery(str_SQL);

                GC_Main.DataSource = null;
                GV_Main.Columns.Clear();
                GC_Main.DataSource = Dt_Search1;
                GC_Main.RefreshDataSource();
                GV_Main.PopulateColumns();
            }
            else
            {
                str_SQL = "select supply_no as '厂家编号',code_no as '内部编号',date as '日期' from T_Main where (1=1) " + SQLCondition();

                DataTable Dt_Search2 = new DataTable();
                Dt_Search2.Columns.Add("厂家编号", typeof(System.String));
                Dt_Search2.Columns.Add("内部编号", typeof(System.String));
                Dt_Search2.Columns.Add("日期", typeof(System.String));

                SQLiteHelper sQLite = new SQLiteHelper();
                Dt_Search2 = sQLite.ExecuteQuery(str_SQL);

                GC_Main.DataSource = null;
                GV_Main.Columns.Clear();
                GC_Main.DataSource = Dt_Search2;
                GC_Main.RefreshDataSource();
                GV_Main.PopulateColumns();
            }
        }

3.2 SQLite数据库脚本

在这里插入图片描述

T_Main钨条主表:

--
-- 由SQLiteStudio v3.3.3 产生的文件 周六 4月 22 16:13:33 2023
--
-- 文本编码:System
--
PRAGMA foreign_keys = off;
BEGIN TRANSACTION;

-- 表:T_main
CREATE TABLE T_main (id INTEGER PRIMARY KEY ASC AUTOINCREMENT, supply_no VARCHAR (20), code_no VARCHAR (20), date VARCHAR (40));
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (16, '2023-1L-2', '0001', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (17, '2023-1L-2', '0002', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (18, '2023-1L-2', '0003', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (19, '2023-1L-2', '0004', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (20, '2023-1L-2', '0005', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (21, '2023-1L-2', '0006', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (22, '2023-1L-2', '0007', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (23, '2023-1L-2', '0008', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (24, '2023-1L-2', '0009', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (25, '2023-1L-2', '000A', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (26, '2023-1L-2', '000B', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (27, '2023-1L-2', '000C', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (28, '2023-1L-2', '000D', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (29, '2023-1L-2', '000E', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (30, '2023-1L-2', '000F', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (31, '2023-1L-2', '000G', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (32, '2023-1L-2', '000H', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (33, '2023-1L-2', '000J', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (34, '2023-1L-2', '000K', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (35, '2023-1L-2', '000L', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (36, '2023-1L-2', '000M', '2023-04-10 17:04:25');
INSERT INTO T_main (id, supply_no, code_no, date) VALUES (37, '2023-1L-2', '000N', '2023-04-10 17:04:25');

COMMIT TRANSACTION;
PRAGMA foreign_keys = on;

T_merge 钨条焊接表:

--
-- 由SQLiteStudio v3.3.3 产生的文件 周六 4月 22 16:14:36 2023
--
-- 文本编码:System
--
PRAGMA foreign_keys = off;
BEGIN TRANSACTION;

-- 表:T_merge
CREATE TABLE T_merge (id INTEGER PRIMARY KEY ASC AUTOINCREMENT, first_code VARCHAR (20), second_code VARCHAR (20), code_no VARCHAR (20), date VARCHAR (40));
INSERT INTO T_merge (id, first_code, second_code, code_no, date) VALUES (6, '0001', '0002', 'M000S', '2023-04-21 16:50:30');
INSERT INTO T_merge (id, first_code, second_code, code_no, date) VALUES (7, '0002', '0001', 'M000T', '2023-04-21 17:00:49');
INSERT INTO T_merge (id, first_code, second_code, code_no, date) VALUES (8, '0001', '0002', 'M000V', '2023-04-21 18:44:16');
INSERT INTO T_merge (id, first_code, second_code, code_no, date) VALUES (9, '0001', '0002', 'M000W', '2023-04-21 18:45:28');
INSERT INTO T_merge (id, first_code, second_code, code_no, date) VALUES (10, '0001', '0002', 'M000X', '2023-04-21 18:56:27');
INSERT INTO T_merge (id, first_code, second_code, code_no, date) VALUES (11, '0003', '0004', 'M000Y', '2023-04-21 18:56:44');
INSERT INTO T_merge (id, first_code, second_code, code_no, date) VALUES (12, '0005', '0006', 'M0010', '2023-04-21 18:56:55');
INSERT INTO T_merge (id, first_code, second_code, code_no, date) VALUES (13, '0001', '0002', 'M0011', '2023-04-21 19:14:00');

COMMIT TRANSACTION;
PRAGMA foreign_keys = on;

3.3 SQLite数据库辅助库

C#版本,SQLite数据库访问、操作辅助库,请阅读我的《C#底层库》专栏,本文不做过多介绍。

C#底层库–SQLite的使用(小型、单机数据库)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/123666958

四、项目展示

4.1 显示焊接数据

在这里插入图片描述

4.2 显示非焊接数据

在这里插入图片描述

五、资源链接

钨条仓库打标程序链接,本程序临时、测试使用,独立开发,非正式项目,可公开。
链接:https://pan.baidu.com/s/1TzM5aX8FZmA2YZm6IngQcA?pwd=odp8
提取码:odp8
在这里插入图片描述

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

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

相关文章

适应大、中、小型医院的手术麻醉临床信息管理系统源码

手术麻醉管理系统是一款专门用于医院手术麻醉管理的软件系统,它可以帮助医院和医生更好地管理手术麻醉过程,提高手术麻醉的质量和安全性。本文将介绍手术麻醉管理系统的实现、功能概述、主要功能、系统设置、麻醉管理、术中记录、苏醒室记录、PCA实施及管…

【微服务笔记20】微服务组件之Nacos配置中心基础环境搭建、配置持久化、动态刷新配置

这篇文章,主要介绍微服务组件之Nacos配置中心基础环境搭建、配置持久化、动态刷新配置。 目录 一、搭建Nacos配置中心环境 1.1、Nacos配置中心介绍 1.2、搭建Nacos配置中心客户端 (1)引入依赖 (2)添加配置信息 &…

图书管理系统的开发与设计(论文+源码)_kaic

摘 要 随着科学技术的快速发展,尤其是计算机技术的突飞猛进,计算机技术普及到日常生活、学习生活的方方面面。由此想到学校的相对于传统的图书管理系统,帮助到学校的读者和学校的图书管理员的系统。提升图书管工作人员的效率,满足…

【C++类和对象】类和对象(中):构造函数 {六个默认成员函数;构造函数的概念及特性;编译器自动生成的构造函数;默认构造函数}

一、类的六个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器…

Pytorch深度学习笔记(六)用pytorch实现线性回归

目录 1.数据准备 2.设计模型 3.构造损失函数和优化器 4.训练周期(前馈—>反馈—>更新) 课程推荐:05.用PyTorch实现线性回归_哔哩哔哩_bilibili 线性通常是指变量之间保持等比例的关系,从图形上来看,变量之间…

为什么要学习微服务?

文章目录 1.认识微服务1.1微服务由来1.2为什么需要微服务? 2.两种架构2.1.单体架构2.2.分布式架构 3.微服务的特点4.SpringCloud5.总结最后说一句 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为…

类和对象(上篇)

类和对象----上篇 🔆面向过程和面向对象的初步认识🔆类的引入🔆类的定义🔆类的访问限定符及封装访问限定符封装 🔆类的作用域🔆类的实例化🔆类的对象大小的计算如何计算一个类的大小结构体内存对…

15天学习MySQL计划(多表联查)第四天

15天学习MySQL计划(多表联查)第四天 1.多表查询 1.1概述 ​ 指从多张表中查询数据 ​ 在项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互…

【HCIP】Huawei设备下IPV4IPV6共存实验

目录 方法一、普通的GRE将V6基于V4通讯 方法二、6to4的tunnel 方法三、双栈 方法一、普通的GRE将V6基于V4通讯 //方法一和方法二的前提,搭个简单的V4网络就行 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip address 12.1.1.1 24 [r1]router id 1.1.1.1 [r1-Gigabi…

Spring Security 05 密码加密

目录 DelegatingPasswordEncoder 使用 PasswordEncoder 密码加密实战 密码自动升级 实际密码比较是由PasswordEncoder完成的,因此只需要使用PasswordEncoder 不同实现就可以实现不同方式加密。 public interface PasswordEncoder {// 进行明文加密String encod…

如何搭建自己的博客网站(手把手教你搭建免费个人博客网站)

没有前言直接开始正文,搭建一个博客需要服务器,域名,博客程序。 博客程序常用的有wordpress,z-blog,typecho等等,其中wordpress和z-blog最为简单,typecho需要一定的技术含量,这里暂…

使用NPOI做Excel简单报表

文章目录 前言初版表格,单元格的合并进阶表格,单元格美化小结 前言 前面介绍了NPOI单元格样式的使用、单元格合并,以及NPOI提供的颜色。现在用上前面的一些知识点,做一个测试结果表格。 1、 介绍NPOI 的颜色卡、名称以及索引 ht…

图片去摩尔纹简述实现python代码示例

这篇文章主要为大家介绍了图片去摩尔纹简述实现的python代码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 1、前言 当感光元件像素的空间频率与影像中条纹的空间频率接近时,可能产生…

分布式系统需要关注的技术点和面试经常问的点

1、分布式系统概述 关于什么是分布式系统,有很多文章介绍,其实这个并不难理解,大白话讲就是:工厂活多了一个人撑不住,那就多找些工人一起干,要让这么多人为了一个目标干得快干得好,就需要一些规…

自主可控智能网联汽车操作系统

开发自主可控智能网联汽车操作系统的必要性 当下,传统汽车操作系统行业的核心技术几乎由国外的黑莓、谷歌、风河、Vector、ETAS等垄断。操作系统已成为我国智能网联汽车发展过程中的关键卡脖子技术,开发自主可控的智能网联汽车操作系统势在必行。 操作…

CVPR 2023 | 达摩院REALY头部重建榜单冠军模型HRN解读

团队模型、论文、博文、直播合集,点击此处浏览 前言 高保真 3D 头部重建在许多场景中都有广泛的应用,例如 AR/VR、医疗、电影制作等。尽管大量的工作已经使用 LightStage 等专业硬件实现了出色的重建效果,从单一或稀疏视角的单目图像估计高精…

微服务架构设计与实践

随着互联网的发展,软件开发已经成为各种企业发展的重要手段。然而,单体应用在长时间的维护中会变得复杂、难以扩展、难以修改。因此,为了满足业务需求,微服务架构应运而生。本篇文章将深入探讨微服务架构的设计与实践。 一、微服务…

C++中的类与对象

类与对象 我们在C语言中自定义的struct 叫做结构体,而在C中我们把struct升级为了类,并且还加入了一个class,也称为类,那么我们今天就来看一下结构体和类的不同和相同 1.结构体与类 我们在C语言中的结构体是struct,而…

QT学习笔记(持续更新)

QT 一、按钮 1.效果 2.代码 #include<QPushButton>//头文件myWidget::myWidget(QWidget *parent): QWidget(parent) {//方法1QPushButton *btnnew QPushButton;//btn->show();//以顶层方式显示btn->setParent(this);//在myWidget窗口中btn->setText("按钮…

JS编程中的API hook

JavaScript奇技淫巧&#xff1a;Hook与反Hook 作者&#xff1a;专注于JS混淆加密的 JShaman API HOOK技术&#xff0c;在PC时代曾盛行&#xff0c;是高端的技术。在JavaScript编程中&#xff0c;也可以应用API Hook技术实现不寻常的效果。 例&#xff0c;eval hook&#xff1a…