0
3

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.

C# DataGridViewの列の表示/非表示を画面サイズに合わせて自動制御する

Last updated at Posted at 2022-09-30

この記事でできること

DataGridViewのサイズ変更に合わせて、補助情報的な列を自動的に表示したり非表示にします。
列の表示非表示.gif

ポイント
ご覧の通りDataGridViewのデータが10000行程度であれば、スムーズに表示/非表示が切り替わります。

DataGridViewの列表示を制御する

FormのSizeChangedで発火しています。(DataGridViewをAnchorしているので)

private void Form_SizeChanged(object sender, EventArgs e)
{ 
    DataGridView dg = this.ucGridPager.pagerDataGridView;

    // データ0行ならなにもしない
    if (dg.RowCount == 0) return;

    // AutoSizeMode = Fill の列があれば、一旦FILLからDisplayedCells等へ切り替える
    dg.Columns[(int)売上一覧_Col.得意先名].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;

    // FILL列のない状態で、各列の幅を合計する
    int ColWidthSum = 0;
    foreach (DataGridViewColumn column in dg.Columns)
    {
        ColWidthSum += column.Width;
    }

    // DataGridViewの幅は、各列の幅の合計より大きいか?
    if (dg.Width > ColWidthSum)
    {
        // 十分な幅が確保できていれば、補助情報的な列も表示する。
        dg.Columns[(int)売上一覧_Col.得意先コード].Visible = true;
        dg.Columns[(int)売上一覧_Col.担当社員番号].Visible = true;

        // FILLで表示したい列を元に戻す
        dg.Columns[(int)売上一覧_Col.得意先名].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    }
    else
    {
        // 十分な幅が確保できないので、補助情報的な列は非表示にする。
        dg.Columns[(int)売上一覧_Col.得意先コード].Visible = false;
        dg.Columns[(int)売上一覧_Col.担当社員番号].Visible = false;

        // FILLで表示したい列を元に戻す
        dg.Columns[(int)売上一覧_Col.得意先名].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
    }
}

DataGridViewのパフォーマンス向上

DataGridViewを適切に設定しないと、同じ10000行程度のデータでもスムーズに表示/非表示が切り替わりません。

// DataGirdViewのパフォーマンス・チューニング
private void InitDataGridView()
{
    // DoubleBuffered
    Type dgvtype = typeof(DataGridView);
    System.Reflection.PropertyInfo dgvPropertyInfo =
        dgvtype.GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance
        | System.Reflection.BindingFlags.NonPublic);
    dgvPropertyInfo.SetValue(dataGridView, true, null);

    // AutoSize None
    dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
    dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

    // RowHeader false
    dataGridView.RowHeadersVisible = false;
}

特にAutoSizeに気をつける

dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

がとても重要です。
仮に、

dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;

とした場合、データ量が多くなるとスムーズに切り替わりません。

サンプルソースの公開

0
3
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
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?