Evento ItemDataBound Data[Grid][List]

Muitas vezes necessitamos resgatar os valores que estão sendo inseridos no Data[Grid][List] para manipulações ou até mesmo efetuar verificações para exibir uma informação mais personalizada ou ocultar algum controle, etc. Tendo este cenário, uma solução seria utilizar o evento ItemDataBound destes controles. Este evento é disparado sempre quando uma nova linha é inserida no controle, durante o DataBind().

Mas para isso, algumas condições devem ser verificadas para que não ocorra um erro. A começar que devemos verificar o tipo da linha que esta sendo inserida no controle através do Enumerador ListItemType. Os dados estão sempre nas linhas do tipo Item ou AlternatingItem, para certificarmos que não seja estejamos inserindo ou tentando acessar um controle que não exista, mesmo porque muitas vezes não utilizamos as linhas do controle do tipo Header e Footer para inserir os dados da DB e sim para uma somatória, ou algo assim, que no caso do DataBind() devem ser desconsideradas.

Então, o código ficará desta forma:

[ VB.NET ]
    Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, _
        ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DataGrid1.ItemDataBound
        If e.Item.ItemType = ListItemType.AlternatingItem OrElse e.Item.ItemType = ListItemType.Item Then
            ‘…
        End If
    End Sub

[ C# ]
  private void DataGrid1_ItemDataBound(object sender, 
      System.Web.UI.WebControls.DataGridItemEventArgs e)
   {   
       if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
          {
               //…
          }
   }

Feito essa verificação, devemos agora nos atentar para qual o tipo de fonte de dados está sendo passado para a propriedade DataSource do controle. Isso varia quando utilizamos DataSets e DataReaders, pois devemos fazer o Cast para o tipo de objeto correto. Vejamos abaixo as duas opções:

[ VB.NET ] [ DataSets ]
DirectCast(e.Item.DataItem, DataRowView).Item(“NomeColuna”)
DirectCast(e.Item.DataItem, DataRowView).Item(0)

[ C# ] [ DataSets ]
((DataRowView)e.Item.DataItem)[“NomeColuna”]
((DataRowView)e.Item.DataItem)[0]

[ VB.NET ] [ DataReaders ]
DirectCast(e.Item.DataItem, DbDataRecord).Item(“NomeColuna”)
DirectCast(e.Item.DataItem, DbDataRecord).Item(0)

[ C# ] [ DataReaders ]
((DbDataRecord)e.Item.DataItem)[“NomeColuna”]
((DbDataRecord)e.Item.DataItem)[0]

Lembrando que no caso do uso dos DataReaders, devemos importar o Namespace System.Data.Common para podermos utilizar a Classe DbDataRecord.

Com isso, já podemos ter acesso aos dados/colunas que estão sendo adicionados no nosso controle, e com isso, nos permite fazermos manipulações e até mesmo testarmos condicionais para exibir ou não uma mensagem mais personalizada para o usuário de acordo com esses dados vindos da DB.

Performance em Aplicações ASP.NET

A Microsoft disponibilizou as apresentações exibidas no TechED neste link. Entre as apresentações, baixei uma chamada:

DEV411 ASP.NET: Best Practices for Performance
Speaker(s): Stephen Walther

Learn how to dramatically improve the performance of your ASP.NET applications by taking advantage of the best practices for caching and database access. Learn methods for accurately measuring the current performance of your applications and identifying performance bottlenecks. Explore a variety of application authoring techniques that will enhance the performance of your applications.
Download Powerpoint Presentation

Entre as comparações realizadas pelo autor, temos:

* DataReaders vs. DataSets
* Utilizando ArrayList em relação aos DataReaders
* OleDbDataReader vs. SqlDataReader
* InLine SQL vs. Stored Procedures
* DataReader Column Reference (Interessante)
* Proper Case vs. Improper Case (Interessante)
* InLine vs. ASP.NET Controls
* ViewState Enabled vs. ViewState Disabled (DataGrid)
* Auto Generate Columns vs. Template Columns (Interessante)

Realmente vale a pena dar uma olhada, principalmente para quem desenvolve aplicações para Web e necessitar uma boa performance (talvez isso seja essencial em qualquer software).

Escrevendo em Imagens

Há momentos em que precisamos por algum motivo escrevermos em uma imagem (até hoje não entendi o porque disso, se alguém puder explicar, agradeço) para que as pessoas confirmem, escrevendo a mesma String em uma caixa de texto. Apenas com algumas linhas de código, é bem simples fazer isso em .NET. A seguir os passos:

1 – No seu WebForm1.aspx, coloque um controle do tipo Image. Crie mais um WebForm em sua aplicação chamado WebForm2.aspx. Atribua à propriedade ImageUrl do controle Image que está no WebForm1.aspx para WebForm2.aspx

2 – No evento Load do WebForm2, faça:

Dim imagem As New Bitmap(Server.MapPath(“Imagem.jpg”))
Dim gr As Graphics = Graphics.FromImage(imagem)

Dim texto As String = “PontoNetPT“
Dim fonte As New Font(“Arial”, 16)
Dim cor As New SolidBrush(Color.White)
Dim posicao As New PointF(2.0F, 2.0F)

gr.DrawString(texto, fonte, cor, posicao)
Response.ContentType = “image/jpeg”

imagem.Save(Response.OutputStream, Imaging.ImageFormat.Jpeg)
gr.Dispose()
imagem.Dispose()

Deve-se importar o Namespace System.Drawing.Image para podermos fazer tais manipulações. Feito isso, a imagem será exibida no controle Image do WebForm1.aspx.