winform datagridview 表头放置复选框,滚动横向滚动条,复选框跟随表头移动

2023-12-13 06:22:53

在WinForms的DataGridView中,要实现横向滚动时使表头上的复选框跟随移动,可以使用以下方法:

1. 创建自定义的DataGridViewColumnHeaderCell:
? ?
? ?创建一个类,继承自`DataGridViewColumnHeaderCell`,在其中添加一个复选框控件。

using System.Windows.Forms;

public class CheckBoxHeaderCell : DataGridViewColumnHeaderCell
{
    private readonly CheckBox checkBox;

    public CheckBoxHeaderCell()
    {
        checkBox = new CheckBox
        {
            AutoSize = true,
            TextAlign = ContentAlignment.MiddleCenter,
        };
        checkBox.CheckedChanged += CheckBox_CheckedChanged;
    }

    private void CheckBox_CheckedChanged(object sender, EventArgs e)
    {
        if (OwningColumn is DataGridViewCheckBoxColumn checkBoxColumn)
        {
            foreach (DataGridViewRow row in OwningRow.DataGridView.Rows)
            {
                row.Cells[checkBoxColumn.Index].Value = checkBox.Checked;
            }
        }
    }

    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);

        var checkBoxBounds = new Rectangle(cellBounds.Location, checkBox.Size);
        checkBoxBounds.X += 1; // Adjust for padding
        checkBoxBounds.Y += 2;
        checkBoxBounds.Width -= 1; // Adjust for padding
        checkBoxBounds.Height -= 3;

        checkBox.Checked = GetCheckState(rowIndex);
        using (var bmp = new Bitmap(checkBox.Width, checkBox.Height))
        {
            checkBox.DrawToBitmap(bmp, checkBox.Bounds);
            graphics.DrawImage(bmp, checkBoxBounds.Location);
        }
    }

    private bool GetCheckState(int rowIndex)
    {
        return rowIndex >= 0 && OwningColumn is DataGridViewCheckBoxColumn checkBoxColumn &&
               (bool)OwningRow.DataGridView.Rows[rowIndex].Cells[checkBoxColumn.Index].Value;
    }
}

2. 创建自定义的DataGridViewCheckBoxColumn:
? ?
? ?创建一个类,继承自`DataGridViewCheckBoxColumn`,并使用上述自定义的`CheckBoxHeaderCell`作为表头单元格。

public class CheckBoxColumn : DataGridViewCheckBoxColumn
{
    public CheckBoxColumn()
    {
        CellTemplate = new CheckBoxHeaderCell();
    }
}

3. 在窗体中使用DataGridView:
? ?
? ?将自定义的`CheckBoxColumn`添加到DataGridView控件中。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        InitializeDataGridView();
    }

    private void InitializeDataGridView()
    {
        var dataGridView = new DataGridView
        {
            Dock = DockStyle.Fill,
            AutoGenerateColumns = false
        };

        var checkBoxColumn = new CheckBoxColumn
        {
            HeaderText = "Select All",
            Name = "selectAllColumn"
        };
        dataGridView.Columns.Add(checkBoxColumn);

        for (int i = 0; i < 10; i++)
        {
            var normalColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = $"Column {i}",
                Name = $"column{i}"
            };
            dataGridView.Columns.Add(normalColumn);
        }

        for (int i = 0; i < 50; i++)
        {
            dataGridView.Rows.Add(false, $"Data {i}");
        }

        dataGridView.Scroll += (sender, e) =>
        {
            // 重新绘制表头,实现复选框跟随滚动
            dataGridView.InvalidateColumn(0);
        };

        Controls.Add(dataGridView);
    }
}

上述代码中,通过订阅`Scroll`事件,当横向滚动时,通过`InvalidateColumn(0)`重新绘制第一列(包含复选框的列),实现了复选框跟随滚动的效果。

文章来源:https://blog.csdn.net/nbspzs/article/details/134951746
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。