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

ASP.NET: Gridview com Controlos nas Colunas

O controlo GridView é bastante usado em ASP.NET pois é muito versátil e simples de utilizar. Existem inúmeras propriedades que permitem com duas ou três alterações tornar esteticamente muito agradável e funcionalmente muito robusto. Possui ainda alguns poderosos wizards que permitem executar diversas tarefas, como por exemplo, associar a fontes de dados ou formatar a visualização.

     

No entanto algumas operações têm de ser efectuadas através do código para permitir uma manipulação de informação correcta.

     

Neste exemplo pretende-se mostrar como adicionar DropDownLists a colunas, adicionar-lhes informação e verificar os dados seleccionados.

     

Para começar adiciona-se uma GridView a uma nova página e no canto superior direito temos um wizard que nos permite realizar algumas tarefas “GridView Tasks”. Vamos seleccionar “Edit Columns”.

     

Nesta janela podemos adicionar novas colunas e modificar as existentes. Para o exemplo vamos adicionar duas colunas BoundField (associadas a um campo) e duas colunas TemplateField (onde iremos colocar as DropDownLists). Nas colunas BoundField colocamos a seguinte informação (figura 1):

     

Coluna1

HeaderText = "ID"

DataField = "id"

     

Coluna2

HeaderText = "Nome"

DataField = "nome"

     

     

(figura 1)

     

Para terminar removemos a selecção “Auto-generate fields” para que a GridView não crie as colunas automaticamente.

     

De seguida, e ainda no GridView Tasks seleccionamos “Edit Template”. No menu de Templates seleccionamos o ItemTemplate de cada coluna (2 e 3) e adicionamos uma DropDownList da Toolbox (figura 2). Para terminar seleccionamos “End Template Editing".

     


(figura 2)

     

Adicionamos um Botão (asp:button) e podemos ainda escolher a opção “Auto Format” e escolher um formato aleatoriamente a nosso gosto. No final o código ficará semelhante ao seguinte:

     

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

   

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title>Untitled Page</title>

</head>

<body>

<form id="form1" runat="server">

<div>

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4"

        Font-Names="Arial" Font-Size="10pt" ForeColor="#333333" GridLines="None" Width="352px">

        <Columns>

            <asp:BoundField DataField="id" HeaderText="ID" />

            <asp:BoundField DataField="nome" HeaderText="Nome" />

            <asp:TemplateField>

                <ItemTemplate>

                    <asp:DropDownList ID="DropDownList2" runat="server">

                    </asp:DropDownList>

                </ItemTemplate>

            </asp:TemplateField>

            <asp:TemplateField>

                <ItemTemplate>

                    <asp:DropDownList ID="DropDownList1" runat="server">

                    </asp:DropDownList>

                </ItemTemplate>

            </asp:TemplateField>

        </Columns>

        <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />

        <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />

        <EditRowStyle BackColor="#999999" />

        <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />

        <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />

        <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />

        <AlternatingRowStyle BackColor="White" ForeColor="#284775" />

    </asp:GridView>

    <br />

    <asp:Button ID="Button1" runat="server" Text="Verificar" Height="32px" Width="104px" />

    <br />

</div>

</form>

</body>

</html>

     

No código VB associado a esta página vamos colocar informação dinamicamente, podendo ser alterada para uma base de dados. Para este exemplo vamos utilizar um DataTable

     

     

Imports System.Data

     

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

     

    ' Verifica se é a primeira vez que a página é actualizada

    ' (para não repetir sempre que se actualize)

    If Not Page.IsPostBack Then

     

      Dim strNomes() As String = {"Jorge Miguel", "João Alexandre", _

                      "Paulo Jorge", "Rui Sousa", "Carlos Andrade"}

     

      ' Cria uma nova DataTable e adiciona duas colunas

      Dim dt As New DataTable

      dt.Columns.Add(New DataColumn("id", GetType(Integer)))

      dt.Columns.Add(New DataColumn("nome", GetType(String)))

     

      ' Adiciona as DataRows (linhas)

      Dim dr As DataRow

      For x As Byte = 0 To strNomes.Length - 1

        dr = dt.NewRow()

        dr.Item("id") = x.ToString

        dr.Item("nome") = strNomes(x).ToString

        dt.Rows.Add(dr)

      Next

     

      ' Define a DataTable criada com DataSource (fonte de dados da Gridview)

      Me.GridView1.DataSource = dt

      Me.GridView1.DataBind()

     

    End If

     

  End Sub

     

     

No evento Row Created, ou seja, sempre que cada linha da GridView é criada irá correr este evento. Neste evento adicionasse a informação às DropDownList

     

     

  Protected Sub GridView1_RowCreated(ByVal sender As Object, _

    ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated

     

    ' Verifica se o item criado é do tipo DataRow

    ' e não outro como Header ou Footer

    If e.Row.RowType = DataControlRowType.DataRow Then

     

      Dim strMeses() As String = {"", "Janeiro", "Fevereiro", _

      "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", _

      "Setembro", "Outubro", "Novembro", "Dezembro"}

     

      ' Procura pela DropDownList

      Dim ctrl1 As DropDownList = e.Row.FindControl("DropDownList1")

     

      ' Preenche a DropDownList1 com os meses e selecciona um item em branco

      ctrl1.DataSource = strMeses

      ctrl1.DataBind()

      ctrl1.SelectedIndex = 0

     

      ' Preenche a DropDownList2 com os anos

      Dim ctrl2 As DropDownList = e.Row.FindControl("DropDownList2")

      ctrl2.Items.Add("")

      ' Ciclo que irá adicionar os anos em ordem decrescente

      For x As Int16 = 20 To 0 Step -1

        ctrl2.Items.Add(Year(DateTime.Now) - 20 + x)

      Next

      ctrl2.SelectedIndex = 0

     

    End If

     

  End Sub

     

     

Finalmente um ciclo executado através do botão de comando que irá mostrar de uma forma simples as selecções efectuadas

     

     

Protected Sub Button1_Click(ByVal sender As Object, _

          ByVal e As System.EventArgs) Handles Button1.Click

     

    ' Percorre todas as linhas da GridView

    For Each row As GridViewRow In GridView1.Rows

     

      ' Verifica na linha actual qual o mês seleccionado

      Dim ctrl1 As DropDownList = row.FindControl("DropDownList1")

      Dim mes As String = ctrl1.SelectedIndex

     

      ' Verifica na linha actual qual o ano seleccionado

      Dim ctrl2 As DropDownList = row.FindControl("DropDownList2")

      Dim ano As String = ctrl2.SelectedValue

     

      ' Mostra a informação no ecra

      Response.Write(ano.ToString + " " + mes.ToString + "<br>")

    Next

     

  End Sub

     

     

     

(figura 3)

     

O objectivo deste exemplo é mostrar como adicionar controlos a uma GridView e como manipula-los. Neste caso colocamos informação apenas mas poderiamos seleccionar com base em informações da base de dados ou utilizar outros controlos nas colunas.

     

     


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

VB.NET: Implementar Pesquisa numa Listview

A ListView é um controlo bastante utilizado para mostrar informação de várias fontes de dados, sejam elas bases de dados, ficheiros xml ou mesmo ficheiros de texto. Existem outros controlos que possíbilitam este tipo de visualização, como é o caso da datagridview, listbox, etc, mas por ser simples de utilizar e muito versátil a listview é ainda bastante utilizada.

   

A pesquisa de informação é algo muito prático em qualquer controlo, principalmente quando está disponível muita informação. O método mais aconselhável para fazer, principalmente quando se utiliza bases de dados, é filtrar a informação que se adiciona à lista através de uma select query. No entanto, e por diversos motivos, é por vezes necessário implementar um pesquisa na própria lista.

   

No seguinte exemplo vou mostrar uma implementação simples de uma pesquisa, colocando o item encontrado no topo da lista, preenchendo também a lista com alguns dados aleatórios.

   



Para a execução de uma pesquisa simples pode-se utilizar a função FindItemWithText da listview, mas esta apenas pesquisa no início do texto. Exemplo:

   

   

Me.ListView1.FindItemWithText("Texto A Pesquisar", True, 0)

   

   

Para o exemplo vamos preencher e configurar a lista no evento Form Load e declarar uma variável privada:

   

   

' lastIndex serve para identificar a posição (index) do ultimo item encontrado para

' não encontrar sempre o mesmo. Sem isto iria aparecer sempre o primeiro a encontrar

Private lastIndex As Integer

   

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

  Dim str() As String = {"visual", "basic", "exemplo", "dados", "vbtuga", "teste",   "vb.net", _

                                              "pesquisa", "studio", "listview", "microsoft", "2005"}

  Dim item As ListViewItem

  Dim rnd As New Random()

   

   

  ' Define as colunas e propriedades da lista

  With Me.ListView1

    .Columns.Add("ID", 50, HorizontalAlignment.Left)

    .Columns.Add("Item", 100, HorizontalAlignment.Left)

    .Columns.Add("Descrição (dados aleatórios)", 250, HorizontalAlignment.Left)

    .FullRowSelect = True

    .GridLines = True

    .View = View.Details

  End With

   

   

  ' Inicia um ciclo que irá preencher a listview

  For x As Byte = 0 To 100

    item = New ListViewItem

    item.Text = x.ToString

    item.SubItems.Add("Item " + x.ToString)

   

    ' Selecciona aleatóriamente três valores do array

    ' criado para permitar pesquisas diferentes

    Dim arrayLenght As Byte = str.Length - 1

    Dim itemString As String = _

              String.Format("{0} {1} {2} {3}", _

              str(rnd.Next(arrayLenght)), str(rnd.Next(arrayLenght)), _

              str(rnd.Next(arrayLenght)), str(rnd.Next(arrayLenght)))

       item.SubItems.Add(itemString)

   

       ' Adiciona o item à lista

      Me.ListView1.Items.Add(item)

    Next

   

End Sub

   

   

Depois vamos adicionar a seguinte função que irá ser a responsável pelo ciclo nos items/sub-items:

   

   

''' <summary>

''' Pesquisa por um item numa listview e devolve o ListViewItem

''' </summary>

''' <param name="lvName">Nome da ListView</param>

''' <param name="lvSearchString">Texto a procurar</param>

Private Function FindListViewText(ByVal lvName As ListView, ByVal lvSearchString As String) As ListViewItem

   Dim result As ListViewItem = Nothing

   

   ' Ciclo nos items da lista

   For Each item As ListViewItem In lvName.Items

   

     ' Ciclo nos sub items da lista

     For Each subitem As ListViewItem.ListViewSubItem In item.SubItems

   

        ' Verifica se o texto de pesquisa existe e se o index é diferente

        If subitem.Text.ToUpper.Contains(lvSearchString.ToUpper) And lastIndex <>  item.Index Then

           lastIndex = item.Index

           Return item

        End If

     Next

   Next

   

  ' Caso não encontre

  lastIndex = 0

  Return result

End Function

   

   

Finalmente o botão responsável por iníciar a pesquisa:

 

Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click

   

  ' Pesquisa na listview com base na informação de uma TextBox

  Dim itemSearch As ListViewItem = FindListViewText(Me.ListView1,     Me.TextBox1.Text.ToString)

   

  ' Caso tenha encontrado o item

  If itemSearch IsNot Nothing Then

   

    ' Posiciona a lista indicando a selecção

    Me.ListView1.TopItem = itemSearch

  Else

   

    'Caso não encontre mostra uma mensagem de informação

    Dim str As String = "Não foi encontrado nenhum item na lisview!"

    MessageBox.Show(str, "Pesquisa na ListView", MessageBoxButtons.OK, MessageBoxIcon.Information)

  End If

   

End Sub

   

   

Este é apenas um pequeno exemplo podendo-se depois acrescentar funcionalidades como por exemplo, colorir a linha encontrada, apagar o item, etc, etc.

 



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

Excel: Contar Cores das Célula

Muitas vezes utilizam-se no Excel cores para identificar diferentes prioridades ou estados de terminados pontos/itens. Essas identificações são preciosas ajudas na visualização mas podem também ser quantificadas para uma melhor contabilização ou para uma visualização gráfica.

No entanto, esta possibilidade apenas pode ser conseguida como recurso a VBA (Visual Basic for Applications), uma vez que as fórmulas disponíveis no Excel não o permitem.

Para adicionarmos esta função a uma folha de Excel devemos fazer o seguinte:

1 – Menu Tools – Macros – Visual Basic Editor ou ALT+F11
2 – Adicionar um novo módulo clicando com o botão direito ou através do menu Insert (Figura 1)


(Figura 1) 

3 – Colocar a seguinte função no módulo criado

' -------------------------------------------------------------------------
' Função que irá retornar o número de cores encontrada numa área

  (deverá ser inserido a área e o código da cor)
' -------------------------------------------------------------------------
Public Function CountColors(rng As Range, color As Integer) As Integer
Dim rg As Range
Dim x As Integer

' Valor inicial
CountColors = 0

    ' Ciclo que irá percorrer todas as células definidas
    For Each rg In rng   

      ' Caso a cor interior (background) seja a escolhida
      If rg.Interior.ColorIndex = color Then

           ' Incrementa o contador
           x = x + 1          

      End If

    Next

    ' Define que a função (valor a retornar) tem o valor de x
    CountColors = x 

End Function

4 – Fechar o Editor de VBA e na folha de cálculo utilizar a função criada. No exemplo (Figura 2) deverá ser inserido o seguinte:

(Figura 2)

Célula C12: =CountColors(C3:C10;4)
Célula C13: =CountColors(C3:C10;19)
Célula C14: =CountColors(C3:C10;46)

O índice de cores do Microsoft Excel 2003 (ColorIndex) é composto por 56 cores (1 - 56) e podem verificar os códigos e correspondência de cores na imagem seguinte (Figura 3)

(Figura 3)

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




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