9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AutoGenerateColumns の設定値によってDataGridView.DataSource に null を設定したときの挙動が変わります

Last updated at Posted at 2023-08-31

バグ調査をしていたところ、DataGridView.DataSoueceをnullで初期化すると、Columnsも初期化される という記事を見つけました。

バグの原因は、記事に書かれている通りでした。(先人に感謝です)
AutoGenerateColumns の設定によって、DataGridView.DataSource に null を設定したときに、Columns が初期化されるかどうかが変わります。

AutoGenerateColumns の値 DataSource に null を代入したときの挙動
true Columns が初期化される(ヘッダーごと消える)
false Columns は初期化されない(ヘッダーは残る)

サンプルプログラムで確認してみる

こういうのは、動かしてみるのが一番分かりやすいのでサンプルプログラムを作りました。

作った画面はこんな感じです。
Form1 2023-08-31 15.40.49.png

上の表はカラムの自動生成ON => AutoGenerateColumns = true の表です。
下の表はカラムの自動生成OFF => AutoGenerateColumns = false の表です。
それぞれの表の横に DataSource を null にするボタンがあります。

動かしてみましょう。

Videotogif.gif

gif のように上の表(カラムの自動生成ON => AutoGenerateColumns = true)はヘッダーごと消えているのが分かります。
それに対して、下の表(カラムの自動生成OFF => AutoGenerateColumns = false)はヘッダーが残っているのが分かります。

デバッガで DataSource を null にした後を見てみます。
AutoGenerateColumns = true の表は columns の数が0になっています。
DataGridViewTest (デバッグ中) - Microsoft Visual Studio.png

対してAutoGenerateColumns = false の表は columns の数が1のままになっていました。
2_DataGridViewTest (デバッグ中) - Microsoft Visual Studio.png

この差により、DataSource = null セット後の挙動に差が出たと考えられます。

いやぁ、なかなかの罠ですね。ヘッダーごとリセットしたい場合は、AutoGenerateColumns の設定値によらず、 Columns.Clear() してあげたほうが良さそうです。

参考にこのサンプルプログラムの Form のコードも載せておきます。

C# Form1.cs
using System;
using System.Data;
using System.Windows.Forms;

namespace DataGridViewTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // 上の表はカラムの自動生成ON
            dataGridView1.AutoGenerateColumns = true;
            // 上の表にデータをセット
            var table1 = new DataTable();
            table1.Columns.Add("text");
            table1.Rows.Add("カラムを自動生成");
            dataGridView1.DataSource = table1;

            // 下の表はカラムの自動生成OFF
            dataGridView2.AutoGenerateColumns = false;
            // 下の表にデータをセット
            var table2 = new DataTable();
            table2.Columns.Add("text");
            table2.Rows.Add("カラムを手動で追加");
            dataGridView2.DataSource = table2;

            // 下の表のカラムを手動で追加
            var textColumn = new DataGridViewTextBoxColumn();
            {
                textColumn.DataPropertyName = "text";
                textColumn.Name = "text";
                textColumn.HeaderText = "text";
            }

            dataGridView2.Columns.Add(textColumn);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.DataSource = null;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            dataGridView2.DataSource = null;
        }
    }
}
9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?