📅  最后修改于: 2023-12-03 14:59:39.860000             🧑  作者: Mango
在使用C#中的DataGridView时,我们经常需要进行多行选择,网上大多数的教程都是使用CheckBox或其他控件来实现,本篇文章将介绍如何实现无控件多行选择。
DataGridView控件本身自带多行选择功能,我们只需在DataGridView的属性中设置即可。主要是通过监听鼠标事件,来判断是否要选中该行。
在使用DataGridView之前,我们需要在属性中把SelectionMode设置成FullRowSelect,这样才能选中整行,而不是单元格。
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
我们需要监听DataGridView的MouseDown和MouseUp事件,在MouseDown事件中记录当前鼠标的位置,以便在MouseUp事件中判断是否选中该行。
private int mouseDownRowIndex = -1; // 鼠标按下时所在的行
private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
// 鼠标左键按下
if (e.Button == MouseButtons.Left)
{
// 按下位置所在的行
mouseDownRowIndex = dataGridView1.HitTest(e.X, e.Y).RowIndex;
}
}
private void dataGridView1_MouseUp(object sender, MouseEventArgs e)
{
// 鼠标左键松开
if (e.Button == MouseButtons.Left)
{
// 松开位置所在的行
int mouseUpRowIndex = dataGridView1.HitTest(e.X, e.Y).RowIndex;
// 如果按下和松开的位置在同一行,则选中
if (mouseDownRowIndex == mouseUpRowIndex)
{
dataGridView1.Rows[mouseDownRowIndex].Selected = true;
}
}
}
默认情况下,DataGridView只允许选择一行,我们需要设置MultiSelect属性为true,允许多行选择。
dataGridView1.MultiSelect = true;
最后,我们可以把上述代码整合到一个窗体应用程序中,运行后即可实现无控件多行选择。
public partial class Form1 : Form
{
private int mouseDownRowIndex = -1;
public Form1()
{
InitializeComponent();
InitDataGridView();
}
private void InitDataGridView()
{
dataGridView1.ColumnCount = 3;
dataGridView1.Columns[0].Name = "编号";
dataGridView1.Columns[1].Name = "姓名";
dataGridView1.Columns[2].Name = "年龄";
dataGridView1.Rows.Add(new string[] { "1", "张三", "20" });
dataGridView1.Rows.Add(new string[] { "2", "李四", "25" });
dataGridView1.Rows.Add(new string[] { "3", "王五", "30" });
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.MultiSelect = true;
dataGridView1.MouseDown += dataGridView1_MouseDown;
dataGridView1.MouseUp += dataGridView1_MouseUp;
}
private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
mouseDownRowIndex = dataGridView1.HitTest(e.X, e.Y).RowIndex;
}
}
private void dataGridView1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
int mouseUpRowIndex = dataGridView1.HitTest(e.X, e.Y).RowIndex;
if (mouseDownRowIndex == mouseUpRowIndex)
{
dataGridView1.Rows[mouseDownRowIndex].Selected = true;
}
}
}
}
通过上述步骤,我们可以很容易地实现无控件多行选择,更好地提升了用户体验。