VB.NET 2005 - Explorando o DataGridView III


Em meu artigo VB 2005  - Explorando o Controle DataGridView  mostrei alguns dos recursos que o DataGridView oferece ao desenvolvedor e deixei claro que o apresentado era somente a ponta do iceberg, portanto neste artigo continuarei apresentando mais recursos do controle DataGridView.

A forma mais simples de usar o controle arrastar o controle a partir da ToolBox para o formulário, mas você também pode definir sua utilização via código.Veja como...

Definindo o DataGridView via código

Inicie o Visual Basic 2005 Express e crie um novo projeto do tipo Windows Application com o nome de datagridviewNet2.

A seguir no formulário padrão form1.vb inclua o seguinte código:

Private WithEvents dataGridView1 As New DataGridView()
Private bindingSource1 As New BindingSource()

Public Sub New()

  InitializeComponent()
  ' Inicializa o formulário.
   Me.dataGridView1.Dock = DockStyle.Fill

   'Permite a inclusão de linhas e desabilita a exclusão
   'permite a leitura de todo o controle
   With dataGridView1
    .AllowUserToAddRows = True
    .AllowUserToDeleteRows = False
    .ReadOnly = False
   End With

  Me.Controls.Add(dataGridView1)
  
End Sub

<STAThread()> _
Shared Sub Main()
   Application.EnableVisualStyles()
   Application.Run(New Form1())
End Sub

No código estou usando a propriedade AllowUserToAddRows definida como True o que indica que a linha para novos registros estará presente no fim do controle vai estar disponível.

A propriedade AllowUserToDeleteRows foi definida como False indicando que o usuário não poderá remover linhas do controle.

A propriedade ReadOnly foi definida como False e desta forma o controle poderá ser editado.

Agora vamos definir a função GetDados() que irá acessar a tabela Orders do banco de dados Northwind.mdf e exibir no DataGridView:

Private Shared Function GetDados(ByVal selectCommand As String) As DataTable


Dim
connectionString As String =
"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\dados\NORTHWND.MDF;Integrated Security=True;Connect Timeout=30;User Instance=True"


' Conecta com o banco de dados e preenche o datatable.

Dim adapter As New SqlDataAdapter(selectCommand, connectionString)
'define  o datatable

Dim data As New DataTable()


data.Locale = System.Globalization.CultureInfo.InvariantCulture


'preenche o dataadapter

adapter.Fill(data)


'retorna os dados

Return data


End
Function

Finalmente  para carregar o controle com os dados vamos incluir o código abaixo no evento Load do formulário.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

' Inicializa o BindingSource e vincula o DataGridView ao controle
bindingSource1.DataSource = GetDados(
"select OrderID, CustomerID,OrderDate, Freight, ShipCity, ShipCountry from Orders Where OrderID > 10700")

Me.dataGridView1.DataSource = bindingSource1
Me.dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)

End Sub

No código acima estou passando a instrução SQL para obter os dados da tabela Orders somente para os valores de OrderID maiores que 10700.

Select OrderID, CustomerID,OrderDate, Freight, ShipCity, ShipCountry from Orders Where OrderID > 10700"

Executando o projeto iremos obter o seguinte resultado:

Restringindo valores na entrada de dados em células do DataGridView

A coluna Freight representa o valor do frete . Vamos supor que desejamos restringir a entrada do usuário para este campo. Para isso podemos usar o evento EditingControlShowing  do controle DataGridView.

O evento DataGridView.EditingControlShowing ocorre quando o controle é exibido durante a edição de uma célula. Você pode tratar este evento para aplicar uma personalização ao controle quando a célula estiver no modo de edição.

Para customizar o controle você pode definir as propriedades do objeto retornado pela propriedade DataGridViewEditingControlShowingEventArgs.CellStyle efetuando um conversão forçada do valor da propriedade DataGridViewEditingControlShowingEventArgs.Control para o tipo de controle específico.

Vou usar este evento para aplicar duas customizações :

  1. Alterar a cor de fundo da célula que esta sendo editada;
  2. Restringir a entrada de dados do usuário na coluna Freight não permitindo valores incorretos;

A primeira coisa a fazer e definir o seguinte código no evento dataGridView1_EditingControlShowing  :

Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) _

Handles dataGridView1.EditingControlShowing
 

'define a cor de fundo do controle durante a edição

e.CellStyle.BackColor = Color.Yellow


'---restringe a entrada de dados para a coluna freight

If Me.dataGridView1.CurrentCell.ColumnIndex = 3 And Not e.Control Is Nothing Then

    Dim tb As TextBox = CType(e.Control, TextBox)

     '---inclui um tratamento de evento para o controle TextBox---

     AddHandler tb.KeyPress, AddressOf TextBox_KeyPress

End If

End Sub

 

A linha de código abaixo  quando a célula entra no modo de edição estou alterando a sua cor de fundo para amarelo;

Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles dataGridView1.EditingControlShowing

       e.CellStyle.BackColor = Color.Aquamarine

      .................................  

End Sub

O código a seguir um tratamento de eventos para o campo TextBox da coluna Freight (a terceira coluna) ;

Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles dataGridView1.EditingControlShowing
 

........................


'---restringe a entrada de dados para a coluna freight

If Me.dataGridView1.CurrentCell.ColumnIndex = 3 And Not e.Control Is Nothing Then

    Dim tb As TextBox = CType(e.Control, TextBox)

     '---inclui um tratamento de evento para o controle TextBox---

     AddHandler tb.KeyPress, AddressOf TextBox_KeyPress

End If

End Sub

 

Agora definimos no evento KeyPress do TextBox as restrições a entrada do usuário feita pelo teclado conforme abaixo:

Private Sub TextBox_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)


'---Se o textbox esta vazio e o usuario pressionou um caractere decimal ---

If CType(sender, TextBox).Text = String.Empty And e.KeyChar = Chr(44) Then

     e.Handled = True

Return

End If


'---Se o textbox já possui um ponto decimal---

If CType(sender, TextBox).Text.Contains(Chr(44)) And e.KeyChar = Chr(44) Then

    e.Handled = True

Return


End If


'---se a tecla pressionada não é um número decimal valido ---

If (Not (Char.IsDigit(e.KeyChar) Or Char.IsControl(e.KeyChar) Or (e.KeyChar = Chr(44)))) Then

   e.Handled = True

End If

End Sub

 

Vamos usar o evento CellValidating do controle para não permitir que o usuário deixe a célula sem informar um valor. O evento CellEndEdit permite que ao teclar ESC o valor anterior seja retornada com o fim da edição;

Private Sub dataGridView1_CellValidating(ByVal sender As Object, ByVal e As DataGridViewCellValidatingEventArgs) Handles dataGridView1.CellValidating
 

' Valida a coluna Freight não permitindo valores vazios

If dataGridView1.Columns(e.ColumnIndex).Name = "Freight" Then

    If String.IsNullOrEmpty(e.FormattedValue.ToString()) Then

         dataGridView1.Rows(e.RowIndex).ErrorText = "O valor do frete é obrigatório"

          e.Cancel = True

     End If

End If

End Sub

 

Private Sub dataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dataGridView1.CellEndEdit

    ' Limpa a linha com erro se o usuário pressionar ESC

    dataGridView1.Rows(e.RowIndex).ErrorText = String.Empty

End Sub

Solicitando a confirmação do usuário para exclusão de uma linha do DataGridView

Quando o usuário seleciona um a linha no controle DataGridView e pressiona a tecla Delete, é disparado o evento UserDeletingRow. Você pode usar este evento para solicitar uma confirmação ao usuário. É recomendável verificar se a linha selecionada não é uma nova linha.

Abra o VB 2005 Express e crie um novo projeto do tipo WIndows Application e inclua um controle DataGriView no formulário form1.vb.

Vou definir uma fonte de dados para exibir os dados da tabela Customers do banco de dados Northwind.mdf.

Inclua o código abaixo no evento UserDeleting do controle DataGridView:

Private Sub DataGridView1_UserDeletingRow(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles DataGridView1.UserDeletingRow

'Verifica se a linha é uma nova linha
If (Not e.Row.IsNewRow) Then

Dim resposta As DialogResult
'Exibe caixa de diálogo solicitando confirmação ao usuário
resposta = MessageBox.Show("Confirma exclusão deste registro?", "Excluir linha?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)

'Se o usuário não confirmar cancela o processo
If resposta = Windows.Forms.DialogResult.No Then
   e.Cancel = True
End If

End If

O resultado pode ser visto na figura abaixo:

Pegue o projeto completo aqui : datagridviewValidacoes.zip

Eu sei, é apenas Visual Basic, mas eu gosto ...