前回のものを少し改良しました。
変更したのは主に下記の制御。
ドラッグでの複数選択
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 & Keys.Shift) == Keys.Shift)
{
return;
}
if ((Control.ModifierKeys & 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イメージ
SCREENPRESSOでGIF動画を撮ってみました。
前回のものがちょっと納得いかなかったので改めて。
DataGridViewに別のチェックボックスやコンボボックスを配置する要件なんて、
とりあえず需要があることだろうに標準で用意してほしいですよね。
昨日以上にサクッとしてますが以上です。
ではでは。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント