効果を達成する
checkBox1 をクリックするか、最初の列のヘッダーを直接クリックして、
コード
私のデータグリッドビューはdgvと呼ばれます
デフォルトで DataGridView に DataGridViewCheckBoxColumn を追加しました。チェックすると値は 1 になり、チェックしないと値は 0 になります。
1 つ目は、チェックボックスを視覚的にドラッグすることで実現されます。
コンポーネントをドラッグし、イベントをバインドします。
Click イベント
イベント コード:
/// <summary>
/// checkbox1的点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void checkSelectAll_CheckedChanged(object sender, EventArgs e)
{
if (checkSelectAll.Checked)
{
foreach (DataGridViewRow dgvRow in this.dgv.Rows)
{
dgvRow.Cells["dataGridViewCheckBoxColumn1"].Value = true;
}
}
else
{
foreach (DataGridViewRow dgvRow in this.dgv.Rows)
{
dgvRow.Cells["dataGridViewCheckBoxColumn1"].Value = false;
}
}
}
列ヘッダーに追加された 2 番目のカスタム チェックボックス
この種の場合は、DataGridViewCheckBoxColumn を自分で取得する必要があります
ファイルの場所
詳細コード:
==DatagridviewCheckboxHeaderCell==
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp20230728.Properties;
namespace WindowsFormsApp20230728
{
//定义触发单击事件的委托
public delegate void DatagridviewcheckboxHeaderEventHander(object sender, DatagridviewCheckboxHeaderEventArgs e);
//定义继承于DataGridViewColumnHeaderCell的类,用于绘制checkbox,定义checkbox鼠标单击事件
public class DatagridviewCheckboxHeaderCell : DataGridViewColumnHeaderCell
{
Point checkBoxLocation;
Size checkBoxSize;
bool _checked = false;
Point _cellLocation = new Point();
System.Windows.Forms.VisualStyles.CheckBoxState _cbState = System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal;
public event DatagridviewcheckboxHeaderEventHander OnCheckBoxClicked;
//绘制列头checkbox
protected override void Paint(System.Drawing.Graphics graphics,
System.Drawing.Rectangle clipBounds,
System.Drawing.Rectangle cellBounds,
int rowIndex,
DataGridViewElementStates dataGridViewElementState,
object value,
object formattedValue,
string errorText,
DataGridViewCellStyle cellStyle,
DataGridViewAdvancedBorderStyle advancedBorderStyle,
DataGridViewPaintParts paintParts)
{
base.Paint(graphics, clipBounds, cellBounds, rowIndex,
dataGridViewElementState, value,
formattedValue, errorText, cellStyle,
advancedBorderStyle, paintParts);
Point p = new Point();
Size s = CheckBoxRenderer.GetGlyphSize(graphics,
System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal);
p.X = cellBounds.Location.X +
(cellBounds.Width / 2) - (s.Width / 2) - 1;//列头checkbox的X坐标
p.Y = cellBounds.Location.Y +
(cellBounds.Height / 2) - (s.Height / 2);//列头checkbox的Y坐标
_cellLocation = cellBounds.Location;
checkBoxLocation = p;
checkBoxSize = s;
if (_checked)
_cbState = System.Windows.Forms.VisualStyles.
CheckBoxState.CheckedNormal;
else
_cbState = System.Windows.Forms.VisualStyles.
CheckBoxState.UncheckedNormal;
CheckBoxRenderer.DrawCheckBox
(graphics, checkBoxLocation, _cbState);
}
/// <summary>
/// 点击列头checkbox单击事件
/// </summary>
protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
{
var p = new Point(e.X + _cellLocation.X, e.Y + _cellLocation.Y);
if (p.X >= checkBoxLocation.X && p.X <= checkBoxLocation.X + checkBoxSize.Width
&& p.Y >= checkBoxLocation.Y && p.Y <= checkBoxLocation.Y + checkBoxSize.Height)
{
_checked = !_checked;
//获取列头checkbox的选择状态
DatagridviewCheckboxHeaderEventArgs ex = new DatagridviewCheckboxHeaderEventArgs {
CheckedState = _checked };
var sender = new object();//此处不代表选择的列头checkbox,只是作为参数传递。应该列头checkbox是绘制出来的,无法获得它的实例
if (OnCheckBoxClicked != null)
{
OnCheckBoxClicked(sender, ex);//触发单击事件
this.DataGridView.InvalidateCell(this);
}
}
base.OnMouseClick(e);
}
}
}
==DatagridviewCheckboxHeaderEventArgs ==
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace WindowsFormsApp20230728
{
//定义包含列头checkbox选择状态的参数类
public class DatagridviewCheckboxHeaderEventArgs : EventArgs
{
public DatagridviewCheckboxHeaderEventArgs()
{
CheckedState = false;
}
public bool CheckedState
{
get {
return _CheckedState; }
set {
_CheckedState = value; }
}
private bool _CheckedState;
}
}
実装場所 (両方とも Form2 クラス内)
コード:
public Form2()
{
InitializeComponent();
//InitColumnInfo();
#region 自定义组件开始
//自定义组件实现
var ch = new DatagridviewCheckboxHeaderCell();
ch.OnCheckBoxClicked += new DatagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);
var checkboxCol = this.dgv.Columns[0] as DataGridViewCheckBoxColumn;
checkboxCol.HeaderCell = ch;
checkboxCol.HeaderCell.Value = string.Empty;
}
注意其中dgv.EndEdit(); 失去焦点操作,如果没有这个,你焦点所在checkBox不会勾选
//去除datagridview列表头排序
// foreach (DataGridViewColumn item in dgv.Columns)
// item.SortMode = DataGridViewColumnSortMode.NotSortable;
/// <summary>
/// 单击事件
/// </summary>
private void ch_OnCheckBoxClicked(object sender, DatagridviewCheckboxHeaderEventArgs e)
{
//失去焦点操作
dgv.EndEdit();
//Console.WriteLine(e.CheckedState.ToString());
//选中事件操作
if (e.CheckedState)
{
for(int i = 0; i < dgv.Rows.Count; i++)
{
dgv.Rows[i].Cells[0].Value = 1;
}
//foreach (DataGridViewRow dgvRow in this.dgv.Rows)
//{
// dgvRow.Cells["dataGridViewCheckBoxColumn1"].Value = true;
//}
}
else
{
for (int i = 0; i < dgv.Rows.Count; i++)
{
dgv.Rows[i].Cells[0].Value = 0;
}
//foreach (DataGridViewRow dgvRow in this.dgv.Rows)
//{
// dgvRow.Cells["dataGridViewCheckBoxColumn1"].Value = 0;
//}
}
}
3 番目は、DataGridViewCheckBoxColumn を追加せずに、カスタム フォームにチェックボックスの列を直接形成する方法です。
2つ目と比較すると、DataGridViewからDataGridViewCheckBoxColumnを削除し、パブリックForm2()カスタムコンポーネントの実装コードを変更したもので、他は同様です。
つまり、この文字列を次のように置き換えます。
// 独自の構成要素实现
var ch = new DatagridviewCheckboxHeaderCell();
ch.OnCheckBoxClicked += 新しい DatagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);
var checkboxCol = this.dgv.Columns[0] as DataGridViewCheckBoxColumn;
チェックボックスCol.HeaderCell = ch;
checkboxCol.HeaderCell.Value = string.Empty;
if (!this.DesignMode){
DatagridviewCheckboxHeaderCell cbHeader = new DatagridviewCheckboxHeaderCell();
cbHeader.OnCheckBoxClicked += new DatagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);
DataGridViewCheckBoxColumn checkboxCol = new DataGridViewCheckBoxColumn();
checkboxCol.HeaderCell = cbHeader;
checkboxCol.HeaderCell.Value = string.Empty;
this.dgv.Columns.Insert(0,checkboxCol);
}
第三种实现的是类属于java面向对象编程的效果,第二种则是自定义组件进行添加的效果
参考記事
C# Winform の DataGridView の DataGridViewCheckBoxColumn チェックボックスを選択して判定する
Winform の DatagridView ヘッダー チェックボックスについて、選択ボックスをまとめます
DataGridView EndEdit() メソッド
c# winform グリッドビュー データを取得する
まとめ
C# カスタム コントロールは、ChackBox の Checked 効果を実現します
-
System.Windows.Forms.Control を継承するクラスを作成してカスタム コントロールを実装します。
-
クラスの OnPaint メソッドをオーバーライドして、CheckBox の外観を描画します。
-
クラスの OnMouseDown メソッドをオーバーライドして、マウスがクリックされたときに CheckBox の Checked 状態を変更します。
-
クラスで Checked プロパティを定義して、CheckBox の Checked 状態を取得または設定します。
-
CheckBox の Checked 状態が変化したときにトリガーする CheckedChanged イベントをクラスに定義します。
-
クラスの OnClick メソッドをオーバーライドして、CheckBox の Checked 状態が変化したときに CheckedChanged イベントをトリガーします。
機能実現を支援
WinformのDatagridViewとContextMenuStripにより、右クリック表示メニューを実現し、データを取得することができます(データのないところには右クリックメニューが表示されず、右クリックフォーカスが移動します)。このコラムの記事を参照