[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#】QRコードラベル作成・印刷
この記事へのリンク:https ://blog.csdn.net/youcheng_ge/article/details/126884228

[C#] 最も完全なドキュメント印刷ソース コード (デザイン印刷テンプレート、バーコード & QR コード、ラベル、フォント)
この記事へのリンク: 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データをデータベースに一括
インポート

[C#] Windows サービス (サービス) のインストールとスタートストップ ソリューション
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/124053794

[C#] ペネトレート セッション分離、サービス呼び出し外部プログラム (フォーム インターフェイス ソリューションなし)
この記事へのリンク: 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 get 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


1. 問題の説明

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();
            }
        }

一部の人々は、データ ソースがインスタンス化されたときに、テーブルの列を指定しなかったのではないかと疑うかもしれません。列を定義すると、問題ありません。同じことしか言えませんが、データベースからデータを取得するので、当然 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() メソッドの定義、要約は次のとおりです。バインドされたデータ ソース内のすべてのフィールドの列を作成するとは、
バインドされたデータ ソース内のすべてのフィールドの列を作成することを意味します。

GridView.PopulateColumns();

3. ソフトウェア開発(ソースコード)

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. プロジェクト表示

4.1 溶接データの表示

ここに画像の説明を挿入

4.2 非溶接データの表示

ここに画像の説明を挿入

5. リソースリンク

タングステンバー倉庫マーキングプログラムリンク、このプログラムは一時的で、テスト使用、独立開発、非公式プロジェクトであり、一般に公開されています。
リンク: https://pan.baidu.com/s/1TzM5aX8FZmA2YZm6IngQcA?pwd=odp8
抽出コード: odp8
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/youcheng_ge/article/details/130305424
おすすめ