気になった事を自由に書いてます。
      
一定間隔でグリッドの内容を再表示するときの落とし穴
バインドしているのにデータグリッドの内容が変化しない!なぜ?という状況に遭遇したので
その時のことを書いてます。

一定間隔でDBからデータを取得し画面のデータグリッドに描画するモニタ機能の話です。
ソースは再現できるよう簡単にまとめてます。まずはソースを説明します。

Form1にはdataGridView1を配置して_dt1にDataTableオブジェクトを生成しデータを格納します。
dataGridView1は_dt1をバインドして、画面上にデータが表示されます。ここまではOK。

button1をクリックするとdt2にDataTableオブジェクトを生成しデータを格納します。
_dt1 = dt2でデータを書き込み(ここが間違い><)
書き込みしたと思っているのでdt2の内容が画面に反映されると期待してますが、
画面は変化なし!!よく考えたら画面が変化しないのは当然だ・・・

①DataTable _dt1 = new DataTable();
②dataGridView1.DataSource = _dt1;
DataGridViewに表示されない1
①でメモリ上にオブジェクト1を生成し、オブジェクト1へ参照できるように_dt1と紐づけます。
②は画面に表示するオブジェクトを紐づけています。

①DataTable dt2 = new DataTable();
②_dt1 = dt2;
DataGridViewに表示されない2 ①でメモリ上にオブジェクト2を生成し、オブジェクト2へ参照できるようにdt2と紐づけます。
②では_dt1をオブジェクト2へ参照するように向きを変えてます。
ですが!dataGridView1はオブジェクト1を参照しているので画面上の表示は変わりません。
挿絵を見ると当たり前だとすぐ分かるのですが、プログラム上だと気づくのに時間が…

そのときのソースコードです。
テストコード
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Sample01
{
    public partial class Form1 : Form
    {
        DataTable _dt1 = new DataTable();

        public Form1()
        {
            InitializeComponent();

            _dt1.Columns.Add("A", typeof(string));

            // 4行追加します。
            for (int i = 0; i < 4; i++)
            {
                DataRow row = _dt1.NewRow();
                row["A"] = "テーブル1です";
                _dt1.Rows.Add(row);
            }

            _dt1.TableName = "Table1";

            dataGridView1.DataSource = _dt1;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DataTable dt2 = new DataTable();

            dt2.Columns.Add("A", typeof(string));

            // 4行追加します。
            for (int i = 0; i < 4; i++)
            {
                DataRow row = dt2.NewRow();
                row["A"] = "テーブル2です";
                dt2.Rows.Add(row);
            }

            dt2.TableName = "Table2";

            _dt1 = dt2;
        }

    }
}

      




Effective C# 4.0
ビル・ワグナー
¥ 3,780

「ダラダラ癖」から抜け出すための10の法則
メリル・E・ダグラス
¥ 1,575



Copyright (C) 2011 - 2017 猫の気ままなC#日記