Если для 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 () указывает на новый класс.