Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

xanburzum

[Resolvido] Datagrid

Recommended Posts

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

Para criar uma classe DataGrid ,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 qualquer 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 permite 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 quizermos iniciar a linha da tabela e se está em 0. 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 escrito 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]

ID - autonum

Nome - texto

Profissão - texto

Fone - texto

 

 

<%@ 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 
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.