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

系列文章

【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


前言

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

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

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

·提示:本专栏为项目实战篇,未接触项目开发的同学可能理解困难,不推荐阅读。
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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花北城

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值