首页
学习
活动
专区
圈层
工具
发布

c#使用dataset对datagridview选中全部复选框

C# 使用 DataSet 实现 DataGridView 全选复选框功能

基础概念

在 C# WinForms 开发中,DataGridView 是一个强大的数据展示控件,而 DataSet 是用于内存中存储数据的对象。实现全选复选框功能通常涉及以下几个关键点:

  1. DataGridViewCheckBoxColumn:用于在 DataGridView 中添加复选框列
  2. DataSet/DataTable:作为数据源绑定到 DataGridView
  3. 数据绑定:将 DataSet 中的数据绑定到 DataGridView

实现方法

1. 基本实现步骤

代码语言:txt
复制
// 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;
    }
};

2. 完整示例代码

下面是一个完整的 WinForms 示例,包含全选、取消全选和获取选中项功能:

代码语言:txt
复制
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(',', ' '));
        }
    }
}

常见问题及解决方案

1. 复选框列不显示或无法勾选

原因

  • 可能没有正确添加 DataGridViewCheckBoxColumn
  • 数据绑定方式不正确

解决方案

代码语言:txt
复制
// 确保在绑定数据源前添加复选框列
DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn();
checkBoxColumn.Name = "IsSelected";
dataGridView1.Columns.Add(checkBoxColumn);

// 然后再绑定数据源
dataGridView1.DataSource = dataSet.Tables[0];

2. 全选功能对新添加的行无效

原因

  • 新添加的行可能不在当前遍历范围内
  • AllowUserToAddRows 属性为 true 时,最后一行是新建行

解决方案

代码语言:txt
复制
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;
        }
    }
}

3. 复选框状态无法保存

原因

  • 直接操作 DataGridView 而没有更新底层 DataSet

解决方案

代码语言:txt
复制
// 更新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;
        }
    }
}

高级技巧

1. 添加列头复选框实现全选

代码语言:txt
复制
// 在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);
        }
    }
}

2. 使用 BindingSource 实现更灵活的数据绑定

代码语言:txt
复制
// 使用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);
}

性能优化建议

  1. 批量操作时暂停绘制
代码语言:txt
复制
dataGridView1.SuspendLayout();
// 执行全选操作
dataGridView1.ResumeLayout();
  1. 使用虚拟模式处理大量数据
代码语言:txt
复制
dataGridView1.VirtualMode = true;
// 需要实现CellValueNeeded和CellValuePushed事件
  1. 避免频繁刷新
代码语言:txt
复制
dataGridView1.BeginEdit(false);
// 执行操作
dataGridView1.EndEdit();

通过以上方法,您可以高效地在 C# 中使用 DataSet 实现 DataGridView 的全选复选框功能,并根据实际需求进行扩展和优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券