BETA

【C#】DataGridView の 行選択時にチェックボックスの状態を変更する(その2)

投稿日:2019-09-08
最終更新:2019-09-08
※この記事は外部サイト(https://www.doraxdora.com/blog/2018/12/08/...)からのクロス投稿です

前回のものを少し改良しました。

変更したのは主に下記の制御。

  • ドラッグでの複数選択
  • Shift または Ctrl を押しながらの選択
  • チェックボックスを直接チェックした場合の挙動

プログラム

Form1.cs

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

namespace SampleDataGridCheckbox  
{  
    /// <summary>  
    /// サンプルフォーム  
    /// </summary>  
    public partial class Form1 : Form  
    {  

        /// <summary>  
        /// 初期化処理  
        /// </summary>  
        public Form1()  
        {  
            InitializeComponent();  

            dataGridView1.Rows.Add(false, "テスト1", "テスト1");  
            dataGridView1.Rows.Add(false, "テスト2", "テスト2");  
            dataGridView1.Rows.Add(false, "テスト3", "テスト3");  
            dataGridView1.Rows.Add(false, "テスト4", "テスト4");  
            dataGridView1.Rows.Add(false, "テスト5", "テスト5");  
            dataGridView1.Rows.Add(false, "テスト6", "テスト6");  

            dataGridView1.ClearSelection();  
        }  

        /// <summary>  
        /// データグリッドビューセルクリックイベント.  
        /// </summary>  
        /// <param name="sender"></param>  
        /// <param name="e"></param>  
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)  
        {  
            // ヘッダー以外  
            if (e.RowIndex >= 0)  
            {  
                // クリックされた箇所を特定  
                DataGridViewCell cell = dataGridView1.CurrentCell;  
                if (cell.OwningColumn.Name == "Column1")  
                {  
                    if (cell.Value.ToString() == "False")  
                    {  
                        dataGridView1.Rows[e.RowIndex].SetValues(true);  
                    }  
                    else  
                    {  
                        dataGridView1.Rows[e.RowIndex].SetValues(false);  
                    }  
                }  
                else  
                {  
                    if ((Control.ModifierKeys &amp; Keys.Shift) == Keys.Shift)  
                    {  
                        return;  
                    }  

                    if ((Control.ModifierKeys &amp; Keys.Control) == Keys.Control)  
                    {  
                        return;  
                    }  

                    // Shift or Ctrl キーが押されていなければクリック行以外をクリア  
                    dataGridView1.ClearSelection();  
                    dataGridView1.Rows[cell.RowIndex].Selected = true;  

                }  
            }  
        }  

        /// <summary>  
        /// データグリッドビュー選択変更イベント.  
        /// </summary>  
        /// <param name="sender"></param>  
        /// <param name="e"></param>  
        private void dataGridView1_SelectionChanged(object sender, EventArgs e)  
        {  
            // 選択されたセルを判定  
            DataGridViewCell cell = dataGridView1.CurrentCell;  
            if (cell.OwningColumn.Name != "Column1")  
            {  
                // 選択行のチェックボックスの状態を制御  
                foreach (DataGridViewRow row in dataGridView1.Rows)  
                {  
                    if (row.Selected)  
                    {  
                        dataGridView1.Rows[row.Index].SetValues(true);  
                    }  
                    else  
                    {  
                        dataGridView1.Rows[row.Index].SetValues(false);  
                    }  
                }  
            }  
        }  

    }  
}  

起動してみる

GIFイメージ

GIFイメージ[/caption]

SCREENPRESSOでGIF動画を撮ってみました。

まとめ

前回のものがちょっと納得いかなかったので改めて。

DataGridViewに別のチェックボックスやコンボボックスを配置する要件なんて、
とりあえず需要があることだろうに標準で用意してほしいですよね。

昨日以上にサクッとしてますが以上です。

ではでは。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@doraxdoraの技術ブログ 主に Java, C#, Python, Javascript の記事を載せていく予定。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!