C# 不按控制键选择多行

C# 不按控制键选择多行,c#,winforms,gridview,selection,C#,Winforms,Gridview,Selection,我有一个gridview,我可以通过按控制键选择多行。不按控制键也可以实现同样的效果。您需要订阅鼠标单击事件,并通过将属性设置为true以编程方式选择行 请记住,如果该行已被选中,则需要将其设置为false,以便用户能够取消选择该行。我从未这样做过,但在按住其中一个按钮的同时移动鼠标时,应该可以使用MouseDown和MouseUp事件来选择光标下的任何行。由于.net默认操作还将更新datagridview的slectedrows,您需要有一个数组来保留旧的选择: DataGridViewRo

我有一个gridview,我可以通过按控制键选择多行。不按控制键也可以实现同样的效果。

您需要订阅鼠标单击事件,并通过将属性设置为true以编程方式选择行


请记住,如果该行已被选中,则需要将其设置为false,以便用户能够取消选择该行。

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

由于.net默认操作还将更新
datagridview的
slectedrows
,您需要有一个数组来保留旧的选择:

DataGridViewRow[] old; 
private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    old = new DataGridViewRow[dataGridView1.SelectedRows.Count];
    dataGridView1.SelectedRows.CopyTo(old,0);  
}
将在
CellMouseDown
更新(在默认.net操作修改您的选择之前):

之后,您可以在
RowHeaderMouseClick
(因为
RowHeaderSelect
是默认的datagridview
selectionmode
)中进行更改,或者使用
CellMouseClick
进行
FullRowSelect
并重新选择那些旧的选定行:

private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{    
    foreach (DataGridViewRow gr in old)
    {
        if (gr == dataGridView1.CurrentRow)
        {
            gr.Selected = false;
        }
        else
        {
            gr.Selected = true;
        }    
    }  
}
编辑:更好的解决方案:
您需要实现自己的
datagridview
源于原始视图,并覆盖
OnCellMouseDown
&
OnCellMouseClick
以取消默认的取消选择操作并使其平滑。创建一个新类,如下所示:

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);
    }
}
在Form.Designer.cs中,将
DataGridView
object
DataGridView 1
(如果是名称)更改为
myDataGridView
object

例如:改变

private System.Windows.Forms.DataGridView dataGridView1

private myDataGridView dataGridView1;
this.dataGridView1=new myDataGridView ()
改变

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

private myDataGridView dataGridView1;
this.dataGridView1=new myDataGridView ()

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

我必须在触摸屏上这样做,在触摸屏上,我希望在单击时进行多选,而不需要丑陋的复选框。 为什么要把它复杂化,只需要保留一个索引就行了

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

我知道这个答复有点晚,但对每个人来说

您可以使用InputSimulator并执行以下操作:

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

如果您在没有控制键的情况下选择多行,您将如何取消选择它们?@Giorgi再次单击一行,但我使用的是FullRowSelect选择模式。我找不到FullRowSelectMouseClick事件。我已经测试了u'r代码,但每次选择任何一行时,网格看起来都会刷新。@Gulshan,它正在刷新,因为它正在执行取消选择和重新选择。我认为我的回答已经为你的上述问题提供了正确的解决方案,从我的回答中,你应该有足够的知识知道下一步该做什么,即使没有我的上述评论,因为我只是想帮助你,不应该为你做这项工作。…@古尔山,你测试过我的上述解决方案吗?因为在我的更新之后没有更多的评论。这个myDataGridView:DataGridView技巧不仅允许你在不按住ctrl键的情况下选择多个单元格,还允许你单击其中一个选定单元格并开始拖动它而不取消选择它。干净利落的解决方案!