Veja como fazer o DataGrid não ter célula ativa, apenas seleção em linhas
O DataGrid não possui uma propriedade que diretamente resolva este problema. Para chegarmos na solução precisamos lidar com as classes de estilo da grid. O DataGrid possui uma propriedade chamada TableStyles.
Esta propriedade é preenchida com um objeto TableStyle, que determina o estilo visual da grid. Cada objeto TableStyle possui uma propriedade GridColumnStyles que é preenchida com variações da classe DataGridColumnStyles (esta classe propriamente é abstrata, para o preenchimento utilizamos classes filhas).
A solução para o problema de seleção é criarmos uma nova classe herdando de DataGridTextboxColumn (que por sua vez herda de DataGridColumnStyles) e fazermos um overrides no método Edit sem chamar a classe base, fazendo com que ao clicarmos em uma célula esta não se torne a célula ativa.
Exemplo:
Imports Microsoft.VisualBasic
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Public Class DataGridNoActiveCellColumn
Inherits DataGridTextBoxColumn
Private SelectedRow As Integer
Protected Overloads Overrides Sub Edit(ByVal source As CurrencyManager,
ByVal rowNum As Integer, ByVal bounds As Rectangle,
ByVal [readOnly] As Boolean, ByVal instantText As String,
ByVal cellIsVisible As Boolean)
'make sure selectedrow is valid
If (SelectedRow > -1) And (SelectedRow < source.List.Count + 1) Then
Me.DataGridTableStyle.DataGrid.UnSelect(SelectedRow)
End If
SelectedRow = rowNum
Me.DataGridTableStyle.DataGrid.Select(SelectedRow)
End Sub
End Class
Feito isso devemos configurar os estilos por código:
Dim ts As New DataGridTableStyle
Dim col As DataColumn
ts.MappingName = "Customers"
For Each col In Ds1.Customers.Columns
Dim cs As New DataGridNoActiveCellColumn
cs.MappingName = col.ColumnName
ts.GridColumnStyles.Add(cs)
Next
DG.TableStyles.Add(ts)
DA.Fill(Ds1)