在 C# WinForms 开发中,DataGridView 是一个强大的数据展示控件,而 DataSet 是用于内存中存储数据的对象。实现全选复选框功能通常涉及以下几个关键点:
// 1. 创建包含复选框列的DataGridView
DataGridView dataGridView1 = new DataGridView();
DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn();
checkBoxColumn.HeaderText = "选择";
checkBoxColumn.Name = "IsSelected";
dataGridView1.Columns.Add(checkBoxColumn);
// 2. 创建DataSet并绑定数据
DataSet dataSet = new DataSet();
DataTable dataTable = new DataTable("MyTable");
dataTable.Columns.Add("ID", typeof(int));
dataTable.Columns.Add("Name", typeof(string));
// 添加一些示例数据
for (int i = 1; i <= 10; i++)
{
dataTable.Rows.Add(i, $"项目 {i}");
}
dataSet.Tables.Add(dataTable);
dataGridView1.DataSource = dataSet.Tables[0];
// 3. 添加全选按钮事件
Button selectAllButton = new Button();
selectAllButton.Text = "全选";
selectAllButton.Click += (sender, e) =>
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
row.Cells["IsSelected"].Value = true;
}
};
下面是一个完整的 WinForms 示例,包含全选、取消全选和获取选中项功能:
using System;
using System.Data;
using System.Windows.Forms;
namespace DataGridViewCheckBoxExample
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
InitializeDataGridView();
InitializeButtons();
}
private void InitializeDataGridView()
{
// 创建DataGridView
dataGridView1 = new DataGridView();
dataGridView1.Dock = DockStyle.Top;
dataGridView1.AllowUserToAddRows = false;
// 添加复选框列
DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn();
checkBoxColumn.HeaderText = "选择";
checkBoxColumn.Name = "IsSelected";
dataGridView1.Columns.Add(checkBoxColumn);
// 添加其他列
dataGridView1.Columns.Add("ID", "ID");
dataGridView1.Columns.Add("Name", "名称");
// 创建并绑定DataSet
DataSet dataSet = CreateSampleDataSet();
dataGridView1.DataSource = dataSet.Tables[0];
this.Controls.Add(dataGridView1);
}
private DataSet CreateSampleDataSet()
{
DataSet dataSet = new DataSet();
DataTable dataTable = new DataTable("Items");
dataTable.Columns.Add("ID", typeof(int));
dataTable.Columns.Add("Name", typeof(string));
for (int i = 1; i <= 15; i++)
{
dataTable.Rows.Add(i, $"项目 {i}");
}
dataSet.Tables.Add(dataTable);
return dataSet;
}
private void InitializeButtons()
{
// 全选按钮
Button btnSelectAll = new Button();
btnSelectAll.Text = "全选";
btnSelectAll.Top = dataGridView1.Bottom + 10;
btnSelectAll.Click += BtnSelectAll_Click;
// 取消全选按钮
Button btnUnselectAll = new Button();
btnUnselectAll.Text = "取消全选";
btnUnselectAll.Top = btnSelectAll.Bottom + 10;
btnUnselectAll.Click += BtnUnselectAll_Click;
// 获取选中项按钮
Button btnGetSelected = new Button();
btnGetSelected.Text = "获取选中项";
btnGetSelected.Top = btnUnselectAll.Bottom + 10;
btnGetSelected.Click += BtnGetSelected_Click;
this.Controls.Add(btnSelectAll);
this.Controls.Add(btnUnselectAll);
this.Controls.Add(btnGetSelected);
}
private void BtnSelectAll_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
row.Cells["IsSelected"].Value = true;
}
}
private void BtnUnselectAll_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
row.Cells["IsSelected"].Value = false;
}
}
private void BtnGetSelected_Click(object sender, EventArgs e)
{
string selectedItems = "选中的项目ID: ";
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (Convert.ToBoolean(row.Cells["IsSelected"].Value))
{
selectedItems += row.Cells["ID"].Value.ToString() + ", ";
}
}
MessageBox.Show(selectedItems.TrimEnd(',', ' '));
}
}
}
原因:
解决方案:
// 确保在绑定数据源前添加复选框列
DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn();
checkBoxColumn.Name = "IsSelected";
dataGridView1.Columns.Add(checkBoxColumn);
// 然后再绑定数据源
dataGridView1.DataSource = dataSet.Tables[0];
原因:
解决方案:
private void BtnSelectAll_Click(object sender, EventArgs e)
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
// 跳过新建行
if (!dataGridView1.Rows[i].IsNewRow)
{
dataGridView1.Rows[i].Cells["IsSelected"].Value = true;
}
}
}
原因:
解决方案:
// 更新DataSet中的数据
private void UpdateDataSetFromGridView()
{
DataTable dt = (DataTable)dataGridView1.DataSource;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (!dataGridView1.Rows[i].IsNewRow)
{
dt.Rows[i]["IsSelected"] = dataGridView1.Rows[i].Cells["IsSelected"].Value;
}
}
}
// 在InitializeDataGridView方法中添加
dataGridView1.CellContentClick += DataGridView1_CellContentClick;
// 添加列头复选框
private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0 && e.RowIndex == -1) // 点击列头
{
bool isChecked = false;
if (dataGridView1.Columns[e.ColumnIndex].HeaderCell is DataGridViewHeaderCheckBoxCell headerCell)
{
isChecked = !headerCell.Checked;
headerCell.Checked = isChecked;
}
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (!row.IsNewRow)
{
row.Cells[e.ColumnIndex].Value = isChecked;
}
}
dataGridView1.Refresh();
}
}
// 自定义列头复选框单元格
public class DataGridViewHeaderCheckBoxCell : DataGridViewColumnHeaderCell
{
public bool Checked { get; set; }
protected override void Paint(Graphics graphics, Rectangle clipBounds,
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 boxLocation = new Point(
cellBounds.X + (cellBounds.Width / 2) - 6,
cellBounds.Y + (cellBounds.Height / 2) - 6);
graphics.FillRectangle(Brushes.White, boxLocation.X, boxLocation.Y, 12, 12);
graphics.DrawRectangle(Pens.Black, boxLocation.X, boxLocation.Y, 12, 12);
if (this.Checked)
{
graphics.DrawLine(Pens.Black, boxLocation.X, boxLocation.Y,
boxLocation.X + 12, boxLocation.Y + 12);
graphics.DrawLine(Pens.Black, boxLocation.X + 12, boxLocation.Y,
boxLocation.X, boxLocation.Y + 12);
}
}
}
// 使用BindingSource作为中介
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = dataSet.Tables[0];
dataGridView1.DataSource = bindingSource;
// 全选操作可以通过操作BindingSource来实现
private void BtnSelectAll_Click(object sender, EventArgs e)
{
foreach (DataRowView rowView in bindingSource)
{
rowView["IsSelected"] = true;
}
bindingSource.ResetBindings(false);
}
dataGridView1.SuspendLayout();
// 执行全选操作
dataGridView1.ResumeLayout();
dataGridView1.VirtualMode = true;
// 需要实现CellValueNeeded和CellValuePushed事件
dataGridView1.BeginEdit(false);
// 执行操作
dataGridView1.EndEdit();
通过以上方法,您可以高效地在 C# 中使用 DataSet 实现 DataGridView 的全选复选框功能,并根据实际需求进行扩展和优化。
没有搜到相关的文章