C# 不按控制键选择多行
我有一个gridview,我可以通过按控制键选择多行。不按控制键也可以实现同样的效果。您需要订阅鼠标单击事件,并通过将属性设置为true以编程方式选择行C# 不按控制键选择多行,c#,winforms,gridview,selection,C#,Winforms,Gridview,Selection,我有一个gridview,我可以通过按控制键选择多行。不按控制键也可以实现同样的效果。您需要订阅鼠标单击事件,并通过将属性设置为true以编程方式选择行 请记住,如果该行已被选中,则需要将其设置为false,以便用户能够取消选择该行。我从未这样做过,但在按住其中一个按钮的同时移动鼠标时,应该可以使用MouseDown和MouseUp事件来选择光标下的任何行。由于.net默认操作还将更新datagridview的slectedrows,您需要有一个数组来保留旧的选择: DataGridViewRo
请记住,如果该行已被选中,则需要将其设置为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
是默认的datagridviewselectionmode
)中进行更改,或者使用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
objectDataGridView 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键的情况下选择多个单元格,还允许你单击其中一个选定单元格并开始拖动它而不取消选择它。干净利落的解决方案!