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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!