📜  c# datagridview 多行选择无控件 - C# (1)

📅  最后修改于: 2023-12-03 14:59:39.860000             🧑  作者: Mango

C# DataGridView 多行选择无控件

在使用C#中的DataGridView时,我们经常需要进行多行选择,网上大多数的教程都是使用CheckBox或其他控件来实现,本篇文章将介绍如何实现无控件多行选择。

实现原理

DataGridView控件本身自带多行选择功能,我们只需在DataGridView的属性中设置即可。主要是通过监听鼠标事件,来判断是否要选中该行。

实现步骤
1. 设置DataGridView的SelectionMode属性

在使用DataGridView之前,我们需要在属性中把SelectionMode设置成FullRowSelect,这样才能选中整行,而不是单元格。

dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
2. 监听鼠标事件

我们需要监听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;
        }
    }
}
3. 允许多行选择

默认情况下,DataGridView只允许选择一行,我们需要设置MultiSelect属性为true,允许多行选择。

dataGridView1.MultiSelect = true;
4. 效果展示

最后,我们可以把上述代码整合到一个窗体应用程序中,运行后即可实现无控件多行选择。

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

效果展示

总结

通过上述步骤,我们可以很容易地实现无控件多行选择,更好地提升了用户体验。