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 |
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 DataTableDim 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()
'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 :
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
................................. |
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........................
'---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)
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
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 = TrueEnd 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 ...