简体   繁体   中英

Select multiple Rows without pressing Control Key

I have a gridview where I can select multiple rows by pressing a control key. Is it possible to achieve the same without pressing a control key.

As the .net default action will also update the slectedrows of your datagridview you need to have an array to reserve the old selections:

DataGridViewRow[] old; 

which will be updated at CellMouseDown (before the default .net action modify your selections):

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    old = new DataGridViewRow[dataGridView1.SelectedRows.Count];
    dataGridView1.SelectedRows.CopyTo(old,0);  
}

after that, you can do your changes in RowHeaderMouseClick (as RowHeaderSelect is the default datagridview selectionmode ) or use CellMouseClick for FullRowSelect and reselect those old selected rows:

private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{    
    foreach (DataGridViewRow gr in old)
    {
        if (gr == dataGridView1.CurrentRow)
        {
            gr.Selected = false;
        }
        else
        {
            gr.Selected = true;
        }    
    }  
}

Edit: Better solution:
You need to implement your own datagridview derived from the original one and override OnCellMouseDown & OnCellMouseClick to cancel the default deselect action and make it smooth. make a new Class as something like this:

Using System;
Using System.Windows.Forms;

public class myDataGridView:DataGridView
{
    protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e)
    {
        //base.OnCellMouseDown(e);
        this.Rows[e.RowIndex].Selected = !this.Rows[e.RowIndex].Selected;
    }

    protected override void OnCellMouseClick(DataGridViewCellMouseEventArgs e)
    {
        //base.OnCellMouseClick(e);
    }
}

and in your Form.Designer.cs change DataGridView object datagridview1 (if that is the name) to myDataGridView object......

For example:Change

private System.Windows.Forms.DataGridView dataGridView1; to

private myDataGridView dataGridView1;

and change

this.dataGridView1=new System.Windows.Forms.DataGridView() to

this.dataGridView1=new myDataGridView ()

最简单的方法是在每一行中放置一个复选框,并在标题上可能选中“全选”复选框。

I had to do this for a touch screen where I wanted multiselect on single click, without ugly check boxes. Why over complicate it, just keep a not of the Index'es

    private List<int> SelectedIndexs { get; set; }

Then add or remove them from the list as you click them... Then look through you datagrid and select the rows in the list.

    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        if (SelectedIndexs.Contains(e.RowIndex))
        {
            SelectedIndexs.Remove(e.RowIndex);
        }
        else
        {
            SelectedIndexs.Add(e.RowIndex);
        }

        foreach (DataGridViewRow row in this.dataGridView1.Rows)
        {
            row.Selected = SelectedIndexs.Contains(row.Index);
        }
    }

You need to subscribe to mouse click event and select the row programmatically by setting Selected property to true.

Keep in mind that ff the row is already selected you need to set it to false so that the user is able to deselect the row.

我从来没有这样做过,但是当你按住其中一个按钮的同时移动鼠标时,应该可以使用MouseDown和MouseUp事件来选择光标下的任何行。

I know this reply is a bit late but for everyone..

you can use InputSimulator and do this:

InputSimulator sim = new InputSimulator();


    private void CommandeDataGridView_MouseHover(object sender, EventArgs e)
    {
        sim.Keyboard.KeyDown(WindowsInput.Native.VirtualKeyCode.LCONTROL);
    }

    private void CommandeDataGridView_MouseLeave(object sender, EventArgs e)
    {
        sim.Keyboard.KeyUp(WindowsInput.Native.VirtualKeyCode.LCONTROL);
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM