O
idle time é o tempo que uma aplicação não está a ser utilizada, estando no entanto
ligada, quer seja um programa simples ou um sistema operativo. O
idle time é utilizado, por exemplo, para iniciar o
screensaver do sistema operativo mas pode ser utilizado para outros
fins. Por exemplo se necessitarmos de fazer o
logout automático de um utilizador caso este não esteja a utilizar a aplicação
durante x segundos, temos de calcular o idle time. Mas existem com certeza
mais aplicações.
Para calcular o
idle time temos de utilizar uma API (Application Programming Interface) que
nos irá verificar o tipo de mensagens encontradas num processo, como o movimento
do rato ou o pressionar de uma tecla. Esse API é o GetQueueStatus() e para mais
informações podem visitar o seguinte link MSDN GetQueueStatus()
' Declaração do API
Private Declare Function GetQueueStatus Lib "user32"
(ByVal fuFlags As Long)
As Long
' Definição das constantes
de sistema
Private Const QS_KEY = &H1
Private Const QS_MOUSEMOVE = &H2
Private Const QS_MOUSEBUTTON = &H4
Private
Const QS_MOUSE = (QS_MOUSEMOVE Or QS_MOUSEBUTTON)
Private Const QS_INPUT = (QS_MOUSE Or QS_KEY)
Public blnCancel As
Boolean
Esta função irá verificar o tempo
em que não existem mensagens de um tipo seleccionado, permitindo executar uma acção ou mostrar
uma informação caso esse tempo tenha sido atingido. Neste exemplo
irá ser usada uma mensagem de informação.
Public Sub
CheckInputIdle(ByVal TimeOut_InSeconds
As Long)
Dim
t As Long
' Atribui à variável t o valor do Time. O Timer representa
' o número de segundos que passou desde a meia-noite
t = Timer
' Inicia o ciclo enquanto a variável blnCancel ser falsa
Do While blnCancel =
False
' Caso não exista actividade actualiza a variável t
If GetQueueStatus(QS_INPUT) Then
t = Timer
DoEvents
End If
' Caso tenha sido detectado que o tempo ultrapassou sai do
ciclo
If Timer - t >= TimeOut_InSeconds
Then Exit Do
Loop
' Notificação de que o tempo chegou ao fim
If blnCancel = False
Then
MsgBox "A aplicação está sem actividade à " & Timer - t &
" segundos.", vbInformation
' Para voltar a chamar esta verificação
' Call CheckInputIdle(10)
End If
End Sub
Finalmente a chamada da função no
evento load do
form e que neste caso irá mostrar uma mensagem passados 10 segundos
Private Sub Form_Load()
Me.Show
Call CheckInputIdle(10)
End Sub
Um exemplo simples que poderá ser
adaptado às necessidades de cada aplicação para os mais diversos fins.
PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!
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!
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!