.NET

Publicidade

Todos nós já ouvimos sobre o maravilhoso Datagrid em ASP.Net, muito útil, aliás. Neste exemplo iremos criar a uma versão do datagrid.

Para criar uma classe DataGrid, o primeiro problema foi a eficiência. Ao aprender como obter registros de uma base de dados e exibi-los em uma tabela em sua página ASP, muitas vezes fazemos desta forma.

<table> 
<%
Do Until objRec.EOF
%>
<tr>
<td><%=objRec("nome") %></td>
<td><%=objRec("enderco") %></td>
<td><%=objRec("email") %></td>
</tr>
<%
objRec.movenext
loop
%>
</table>

Ainda mais eficaz é a utilização do método de GetRows do Recordset para preencher a 2 array dimensional . Então você já não tem que usar os recursos acessando o Recordset.

dim arTable 
arTable = objRec.GetRows
objRec.Close
set objRec = nothing

Você tem agora 2 array dimensional, mas como o recordset armazena informação neste array?

arTable’s – 2 dimensões: arTable (TotalCols, TotalRows). Portanto, se o meu Recordset retornou 10 registros, seria arTable (3, 10) e você teria que ir de arTable (0, 0) para arTable (2, 9) para recuperar cada valor que você deve ir através do TotalCols, seguido pelo TotalRows. Você não sabe quantos registros vai retornar, assim, usamos a função UBound:

dim tCols, tRows 
tCols = UBound(arTable, 1)
tRows = UBound(arTable, 2)

Com um array de mais de uma dimensão que necessita abastecer UBound com um valor para indicar, que o elemento deseja o total. Como vimos acima, nos tCols para definir o total da primeira dimensão e tRows para o total da segunda dimensão. Com esta informação, através dos registros utilizando loop aninhado.

<table> 
<%
Dim x, y
For x = 0 to tRows
Response.Write "<tr>"
For y = 0 to tCols
Response.Write "<td>" & rTable(y, x) & "</td>"
Next
Response.Write "</tr>"
Next
%>

Um bom modelo que podemos mover/encapsular em uma classe.

Quando a classe inicia estabelecemos nosso objeto connection e objeto Recordset, também definimos a variável Column Count para 0 para usar nas nossas próprias colunas e, finalmente, usamos a AutoColumns = true. É neste processo que você colocaria quaisquer predefinições que você deseja para sua classe.

private pAutoColumns, pConnStr, pSqlStr, intColCnt 
Private pOutPut, pConn, pRec, x, y, pArray
Private Sub Class_Initialize()
Set pConn = server.createobject("adodb.connection")
Set pRec = server.createobject("adodb.recordset")
intColCnt = 0
pAutoColumns = True
End Sub

Em seguida, criamos as regras que nos permitem definir as várias propriedades:

Public Property Let ConnectionString(strConn) 
pConnStr = strConn
End Property

Public Property Let AutoColumns(bAutoCols)
If bAutoCols = True or bAutoCols = False then
pAutoColumns = bAutoCols
End IF
End Property

Public Property Let SqlString(strSql)
pSqlStr = strSql
End Property

Agora sobre os métodos, procedimentos, para a sua classe, adicionamos a funcionalidade real para a classe:

Public Sub AddColumn(strColName) 
If intColCnt = 0 then
pOutPut = "<table width='100%' border=1 cellpadding=0 cellspacing=0>" & vbcrlf
pOutPut = pOutPut & "<tr>" & vbcrlf
End If
pOutPut = pOutPut & "<td><strong>" & strColName & "</strong></td>" & vbcrlf
intColCnt = intColCnt + 1
End Sub

Se optar por especificar a nossa própria column names, então nós chamamos este método para adicionar um column names. Ele apenas acrescenta uma nova célula de nosso grid (tabela) para cada coluna, se quisermos iniciar a linha da tabela e se está em 0. Em qualquer outro momento podemos acrescentar a célula, ou não, se você usar AutoColumns.

Public Sub Bind 
pConn.Open pConnStr
Set pRec = pConn.Execute(pSqlStr)
If pAutoColumns = True then
'atribuir nomes de coluna retornados
pOutPut = "<table width='100%' border=1 cellpadding=0 cellspacing=0>" & vbcrlf
pOutPut = pOutPut & "<tr>" & vbcrlf
Redim pColNames(pRec.Fields.Count)
For x = 0 to pRec.Fields.Count - 1
pOutPut = pOutPut & "<td>" & pRec.Fields(x).Name & "</td>" & vbcrlf
Next
End If
pOutPut = pOutPut & "</tr>" & vbcrlf
pArray = pRec.GetRows
For x = 0 to UBound(pArray, 2)
pOutPut = pOutPut & "<tr>" & vbcrlf
For y = 0 to UBound(pArray, 1)
pOutPut = pOutPut & "<td>" & pArray(y, x) & "</td>" & vbcrlf
Next
pOutPut = pOutPut & "</tr>" & vbcrlf
Next
pOutPut = pOutPut & "</table>" & vbcrlf
Response.Write pOutPut
End Sub

Basicamente, nós abrimos o recordset, se AutoColums = true então ficamos com os campos nomes e criamos células para eles ou vamos com o custom column names. Então usamos o código para percorrer a nossa matriz de valores. Tudo isto está a ser concatenado a uma string de saída, que é finalmente escrita para o browser no final.

Usando a classe em uma página ASP, salve-o como DataGrid.asp em sua pasta wwwroot, foi usado o nwind.mdb para o banco de dados.

Estrutura do banco:

[nwind]

[i]ID – autonum

Nome – texto

Profissão – texto

Fone – texto[/i]

<%@ LANGUAGE="VBSCRIPT" %> 
<% option explicit %>
<% response.buffer=true %>
<html>
<head>
<title>DataGrid Teste</title>
</head>
<!-- #include file="DataGrid.asp"-->
<body>
<%
dim meuDataGrid, mapPath
Set meuDataGrid= New caDataGrid
mapPath = "nwind.mdb"
' conexao
meuDataGrid.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="& Server.MapPath(mapPath)
meuDataGrid.SqlString = "select nome, profissao, fone from cadastro"
meuDataGrid.Bind
set meuDataGrid= nothing

'agora permite definir nossas próprias colunas
response.write "<br><br>"
Set meuDataGrid= New caDataGrid
meuDataGrid.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="& Server.MapPath(mapPath)
meuDataGrid.SqlString = "select nome, profissao, fone from cadastro"
meuDataGrid.AutoColumns = false
meuDataGrid.AddColumn("nome")
meuDataGrid.AddColumn("profissao")
meuDataGrid.AddColumn("fone")
meuDataGrid.Bind
set meuDataGrid= nothing
%>
</body>
</html>

Abaixo o código completo

<% 
Class caDataGrid
' variaveis private
private pAutoColumns, pConnStr, pSqlStr, intColCnt
Private pOutPut, pConn, pRec, x, y, pArray

'este é executado quando você cria uma referência para a classe caDataGrid
Private Sub Class_Initialize()
Set pConn = server.createobject("adodb.connection")
Set pRec = server.createobject("adodb.recordset")
intColCnt = 0
pAutoColumns = True
End Sub

'Propriedades - todos writable
Public Property Let ConnectionString(strConn)
pConnStr = strConn
End Property

Public Property Let AutoColumns(bAutoCols)
If bAutoCols = True or bAutoCols = False then
pAutoColumns = bAutoCols
End IF
End Property

Public Property Let SqlString(strSql)
pSqlStr = strSql
End Property

'Metodos
Public Sub AddColumn(strColName)
If intColCnt = 0 then
pOutPut = "<table width='100%' border=1 cellpadding=0 cellspacing=0>" & vbcrlf
pOutPut = pOutPut & "<tr>" & vbcrlf
End If
pOutPut = pOutPut & "<td><strong>" & strColName & "</strong></td>" & vbcrlf
intColCnt = intColCnt + 1
End Sub

Public Sub Bind
pConn.Open pConnStr
Set pRec = pConn.Execute(pSqlStr)
If pAutoColumns = True then
'atribuir nomes de coluna retornados
pOutPut = "<table width='100%' border=1 cellpadding=0 cellspacing=0>" & vbcrlf
pOutPut = pOutPut & "<tr>" & vbcrlf
Redim pColNames(pRec.Fields.Count)
For x = 0 to pRec.Fields.Count - 1
pOutPut = pOutPut & "<td>" & pRec.Fields(x).Name & "</td>" & vbcrlf
Next
End If
pOutPut = pOutPut & "</tr>" & vbcrlf
pArray = pRec.GetRows
For x = 0 to UBound(pArray, 2)
pOutPut = pOutPut & "<tr>" & vbcrlf
For y = 0 to UBound(pArray, 1)
pOutPut = pOutPut & "<td>" & pArray(y, x) & "</td>" & vbcrlf
Next
pOutPut = pOutPut & "</tr>" & vbcrlf
Next
pOutPut = pOutPut & "</table>" & vbcrlf
Response.Write pOutPut
End Sub

'isso é quando finalizamos nossa referência caDataGrid
Private Sub Class_Terminate()
pOutPut = ""
pRec.Close
Set pRec = nothing
pconn.close
Set pConn = nothing
End Sub

End Class
%>