C#

Essa técnica consiste em trabalhar com a classe Object e fazer Casting Seguro.

O código para percorrer todos os TextBox é o seguinte:

/* ------------------------------------------------------------- */
// O "varContainer" nesse caso é o Grid de WPF
// Mas pode ser um Panel.Controls por exemplo
// Na verdade a classe Grid é derivada da Panel
// O importante é obter uma Classe de Coleção chamada UIElementsCollections
/* ------------------------------------------------------------- */
foreach (object ob in varContainer.Children)
 {
    TextBox caixaTexto = ob as TextBox;

    if (caixaTexto != null)
     {
        caixaTexto.Text = "S";
    }
 }
  • Para cada objeto retornado do Array de Controles (UIElementCollection) a referência dele é colocada na variável ob (object)
  • Com a variável ob referenciando um objeto fazemos o Casting Seguro com o operador “as
  • Se a variável caixaTexto (tipo TextBox) não for NULL o Casting foi executado com sucesso, isso quer dizer que o objeto pego no UIElementCollection realmente era um objeto do tipo TextBox e que a referência daquele objeto agora foi passada para a variável caixaTexto.
  • Atribuímos “S” à propriedade Text do TextBox

P.S Não esqueçam de trocar o varContent pelo objeto que contém os TextBox na sua aplicação, pode ser por um Panel por exemplo. Você também pode trabalhar também com Labels, ComboBox, Buttons e etc é so fazer o Casting determinando o tipo desejado, use a sua imaginação.

O Que é esse Tal de Object?

Primeiro você deve entender o que é um tipo-referência, já entendido do assunto você agora tem que ter em mente que o tipo-referência mais importante no C# é o tipo OBJECT meu amigo…. que na verdade é um alias para System.Object!

Todos as classes existentes no C# são herdados do System.Object e uma variável tipo Object pode referenciar qualquer objeto existente!

Boxing

Quando você usa o Object para referenciar algo, você pode referenciar um tipo-valor

int numero = 8;
object o = numero;

Valores do tipo int ficam na pilha da memória, o object fica no heap. Todas referências obrigatoriamente devem apontar para o heap e não para a pilha, se o C# permitisse criar referencia para a pilha poderíamos ter sérios problemas de segurança.

Então o runtime aloca uma parte da memória no heap copia o valor da variável numero e agora sim ele faz o objeto “o” referenciar o valor no heap, essa cópia automática de um valor na pilha para o heap é chamado de boxing.

Unboxing (casting)

Depois de fazer o Boxing naturalmente você gostaria em alguma hora devolver esse valor que está no heap para uma variável tipo-valor:

int numero = 8;
object o = numero;
int n2 = o; // ERRO!

Se tentar fazer isso você terá um erro em tempo de compilação, naturalmente isso não funcionará porque o compilador não confia em você!

Nós sabemos que o valor na variável “o” é equivalente a um inteiro, mas poderia ser qualquer outra coisa, como uma Classe criado por você, resumindo qualquer outra coisa mesmo! E isso não seria nada legal.

Para obter o valor referenciado pelo “o” será necessário fazer o unboxing (casting) dizendo o runtime que é seguro converter aquele valor referenciado, caso você esteja errado o casting lançará um exception (InvalodCastException), veja um exemplo:

int numero = 8;
object o = numero;
int n2 = (int)o; // Agora sim!

OBS: O boxing e unboxing são processos caros para o runtime, ele aloca bastante memória e faz muitas verificações, então procure não utilizar muito e utilize ele com atenção.

OBS2: Você deverá estar preparado para capturar o exception lançado e trata-lo corretamente aí entra os operadores “is” e “as” para amenizar o nosso sofrimento!

Casting de Dados Seguro

Operador is

Utilize o operador is para verificar se o tipo de objeto é o esperado:

int numero = 8;
object o = numero;

if(o is int){
    int numero2 = (int)o; // Isso é seguro! o objeto "o" é um inteiro
}

Operador as

O operador is retorna true ou false já o operador as trabalha um pouco diferente.

Assim como o operador is no lado esquerdo recebe um objeto tipo-referência e à direita o tipo especificado. Se o casting for bem sucedido o operador “as” retornará o objeto se não retornará NULL.

int numero = 8;
object o = numero;
int numero2 = o as int;
if(numero2 != null){
    Console.WriteLine("Casting OK!");
}

Até a próxima…

Posts Relacionados