Fazer com que o Grid não tenha célula ativa, apenas seleção em linhas

A 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.

A 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.

Veja como fica a classe :

 

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)