Поскольку действие .net по умолчанию также обновит slectedrows
вашего datagridview
, вам необходим массив для резервирования старых выборов:
DataGridViewRow[] old;
, который будет обновлен на CellMouseDown
(перед действием .net по умолчанию измените ваш выбор):
private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
old = new DataGridViewRow[dataGridView1.SelectedRows.Count];
dataGridView1.SelectedRows.CopyTo(old,0);
}
после этого вы можете внести изменения в RowHeaderMouseClick
(так как RowHeaderSelect
является сетевым представлением по умолчанию 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
объект datagridview1
(если это имя) на myDataGridView
объект ......
Например: изменить
private System.Windows.Forms.DataGridView dataGridView1;
до
private myDataGridView dataGridView1;
и изменить
this.dataGridView1=new System.Windows.Forms.DataGridView()
до
this.dataGridView1=new myDataGridView ()