Если SelectionMode является FullRowSelect, то вам необходимо переопределить SetSelectedRowCore для этого DataGridView, а не вызывать базовый SetSelectedRowCore для строк вы не хотите, выбранных.
Если SelectionMode не является FullRowSelect, вам необходимо дополнительно переопределить SetSelectedCellCore (и не вызывать базовый SetSelectedCellCore для строк, которые вы не хотите выбирать), поскольку SetSelectedRowCore будет работать только в том случае, если вы нажмете заголовок строки, а не отдельная ячейка.
Вот пример:
public class MyDataGridView : DataGridView
{
protected override void SetSelectedRowCore(int rowIndex, bool selected)
{
if (selected && WantRowSelection(rowIndex))
{
base.SetSelectedRowCore(rowIndex, selected);
}
}
protected virtual void SetSelectedCellCore(int columnIndex, int rowIndex, bool selected)
{
if (selected && WantRowSelection(rowIndex))
{
base.SetSelectedRowCore(rowIndex, selected);
}
}
bool WantRowSelection(int rowIndex)
{
//return true if you want the row to be selectable, false otherwise
}
}
Если вы используете WinForms, трещина открыть designer.cs для соответствующей формы, и измените объявление экземпляра DataGridView, чтобы использовать этот новый класс вместо DataGridView, а также замените this.blahblahblah = new System.Windows.Forms.DataGridView(), чтобы указать на новый класс.
Для тех, кто нашел этот вопрос, чтобы узнать, как отключить выбор строк на все: набор `SelectionMode` свойство` CellSelect` – Pavel 2017-02-07 16:00:36