系列文章
【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
文章目录
前言
我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,这样外部函数就无法访问你。 又想让你成为全局常量,这样在我的整个生命周期都可以调用你。 可惜世上没有这样的常量,我也无法定义你,因为你在我心中是那么的具体。
哈喽大家好,本专栏为【项目实战】专栏,有别于【底层库】专栏,我们可以发现增加 了『问题描述』、『项目展示』章节,十分符合项目开发流程,让读者更加清楚项目解决的问题、以及产品能够达到的效果。本专栏收纳项目开发过程的解决方案,是我项目开发相对成熟、可靠方法的提炼,我将这些问题的解决思路梳理,撰写本文分享给大家,大家遇到类似问题,可按本文方案处理。
本专栏会持续更新,不断完善,专栏文章关联性较弱(文章之间依赖性较弱,没有阅读顺序)。大家有任何问题,可以私信我。如果您对本专栏感兴趣,欢迎关注吧,我将带你用最简洁的代码,实现复杂的功能。
·提示:本专栏为项目实战篇,未接触项目开发的同学可能理解困难,不推荐阅读。
一、问题描述
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