Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Dicas de Programação #5

DataGridView – Actualização imediata após selecção na ComboBox

O controlo DataGridView permite definir diversos tipos para as suas células, além de se poder inserir novos controlos nas células. A DataGridViewComboBoxCell é um desses tipos e permite ao utilizador efectuar um diverso número de escolhas para cada registo.

Para detectar uma alteração é necessário utilizar o evento EditingControlShowing em conjunto com a  DataGridViewComboBoxEditingControl (que representa a ComboBox alojada na célula). Sem a utilização deste evento é possível também detectar o valor através do evento CellValueChanged mas para isso é necessário mudar de célula para que o evento seja disparado.

Este exemplo mostra como implementar isto, permitindo sempre que se altere um item na ComboBox (através do SelectedIndexChanged) execute uma acção, que neste caso é a actualização do um valor numa célula.

Tratasse de uma lista de produtos com nomes e valores aleatórios em que, ao ser alterado o valor de desconto, altera também o valor do total do artigo.

    Private WithEvents dgvCombo As DataGridViewComboBoxEditingControl

    Private Sub dgvCombo_SelectedIndexChanged(ByVal sender As Object, _ 
                      ByVal e As System.EventArgs)

        ' Caso o valor seja Nothing sai do procedimento
        If dgvCombo Is Nothing Then Exit Sub

        ' Caso tenha sido alterado a coluna da ComboBox
        If Me.DataGridView1.CurrentCell.ColumnIndex = 4 Then

            Dim row As Integer = Me.DataGridView1.CurrentCell.RowIndex

            ' Guarda a informação do preço
            Dim preco As Double = Me.DataGridView1(2, row).Value
            Dim desc As Double = dgvCombo.Text.ToString.Replace("%", "")

            ' Caso o calor seleccionado não seja > 0
            If desc > 0 Then

                ' Calcula o preço com o desconto e actualiza o campo "Total"
                Me.DataGridView1(3, row).Value = preco - (preco * (desc / 100))

            Else

                ' Actualiza o campo "Total" sem desconto
                Me.DataGridView1(3, row).Value = preco

            End If

        End If

    End Sub

     

    ' Define a dgvCombo = Nothing para funcionar na próxima ComboBox
    Private Sub DataGridView1_CellLeave(ByVal sender As Object, _
        
ByVal e As System.Windows.Forms.DataGridViewCellEventArgs)
         Handles
DataGridView1.CellLeave

        dgvCombo = Nothing

    End Sub

    ' Quando um controlo é editado
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) _
  Handles DataGridView1.EditingControlShowing

        ' Verifica se o control editado foi a ComboBox
        If TypeOf e.Control Is DataGridViewComboBoxEditingControl Then

            ' Atribui o controlo 
            If dgvCombo Is Nothing Then
                dgvCombo = e.Control
            End If

            ' Atribui um evento quando é alterado o a selecção
            AddHandler dgvCombo.SelectedIndexChanged, _
                  New EventHandler(AddressOf dgvCombo_SelectedIndexChanged)
        End If

    End Sub

     

O objectivo é mostrar como executar uma acção de imediato após a selecção de item numa combobox, facilitando a utilização deste controlo.

     

ListView – Criar coluna de hyperlinks detectando a coluna clicada

A ListView não permite inserir um tipo na coluna específico para hiperligações. Para conseguirmos criar uma coluna personalizada de hiperligações é necessário detectar qual a coluna que foi clicada e também alterar o ponteiro do rato na coluna especifica. No entanto, e para detectar a coluna clicada ou que o ponteiro do rato está sobre ela, é necessário que não esteja visível a scrollbar, ou seja, as colunas têm de estar visíveis.

Este exemplo mostra como criar a coluna personalizada, sendo introduzidos dados aleatórios e um dos SubItems da lista estar definido com a cor da fonte a azul. Não esquecer de que é necessário definir no item principal o UseItemStyleForSubItems = False para que seja possível definir vários formatos em diversos SubItems.

    ''' <summary>
    ''' Verifica qual a coluna onde o ponteiro do rato está
    ''' </summary>
    ''' <param name="e">MouseEventArgs</param>
    Private Function lvColumnNumber( _
            ByVal e As System.Windows.Forms.MouseEventArgs) As Integer

        Dim colend As Integer = 0
        Dim colstart As Integer = 0
        Dim x As Integer

        ' Ciclo nas colunas
        For x = 0 To (ListView1.Columns.Count - 1)

            ' Verifica qual a largura da coluna
            colend = colend + ListView1.Columns(x).Width

            If colstart <= e.X And e.X <= colend Then
                Return x + 1
            End If

            colstart = colstart + ListView1.Columns(x).Width
        Next

    End Function

     

    ' Quando é feito um clique na lista
    Private Sub ListView1_MouseDown(ByVal sender As Object, _
             ByVal e As System.Windows.Forms.MouseEventArgs) _
             Handles ListView1.MouseDown

        ' Verifica se a coluna é a dos URL's
        If lvColumnNumber(e) = 2 Then

            ' Verifica qual o item onde foi feito o clique
            Dim item As ListViewItem = Me.ListView1.GetItemAt(e.X, e.Y)

            ' Caso tenha sido sobre um item
            If item IsNot Nothing Then

                ' Verifica qual a coluna e lança um novo processo
                ' com o URL da lista, abrindo o explorador por defeito
                Dim col As Integer = lvColumnNumber(e) - 1

                Process.Start(item.SubItems(col).Text)

            End If

        End If

    End Sub

    ' Quando o ponteiro do rato está sobre a lista
    Private Sub ListView1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseMove

        ' Verifica se a coluna é a dos URL's
        If lvColumnNumber(e) = 2 Then
            Windows.Forms.Cursor.Current = Cursors.Hand
        Else
            Windows.Forms.Cursor.Current = Cursors.Default
        End If

    End Sub

Deste modo é possível criar uma coluna com uma aparência diferente e também detectar qual a coluna que foi clicada.

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

0 comentários:

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico