Muitas vezes vejo em fóruns alguns trechos de códigos em que o pessoal faz o casting de um controle em outro para acessar uma determinada propriedade. O que quero chamar a atenção aqui é que nem sempre esses castings são necessários e, por menor que seja, efetuá-los sempre tem o seu custo.
Todo controle em ASP.NET herda direta ou indiretamente da classe Control. Essa classe fornece grande parte das propriedades e métodos que todo server-control deve ter. Imagine que dentro de um controle DataBound, como o ListView, voce possui um controle ASP.NET qualquer, e queira definir a sua propriedade Visible como False. Para exemplificar, notem que abaixo estou procurando pelo controle “Calendar1” através do método FindControl. Com o retorno deste método (que é um objeto derivado da classe Control) eu faço o casting para o controle Calendar e, consequentemente, defino a propriedade Visible como False.
protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
((Calendar)e.Item.FindControl(“Calendar1”)).Visible = false;
}
}
Como dito anteriormente, a propriedade Visible está definida na classe Control, e com isso não há necessidade de efetuar o casting para acessá-la. Voce só precisa efetuar o casting caso queira acessar uma propriedade exclusiva do controle. Para finalizar, abaixo temos o mesmo código sem o casting, e tendo o resultado conforme o esperado:
protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
e.Item.FindControl(“Calendar1”).Visible = false;
}
}