Utilizando CustomValidator para validar CheckBoxList – Parte 02
Vamos nesse artigo continuar utilizando o controle CustomValidator.
No artigo anterior aprendemos a validar um CheckBoxList. Mas se você quiser validar mais de um CheckBoxList nas mesma página? Você responde prontamente: basta criar um CustomValidator para cada instância de CheckBoxList e um método de validação.
Mas se os campos não existirem em tempo de design? Se o seu formulário for dinâmico e você precisar criar e validar campos em tempo de execução? E se os campos puderem ser do tipo CheckBoxList? Então precisamos criar uma rotina que valide todos os controles existentes na página.
Crie um projeto de WebSite em C# com seu visual studio 2005. Na página default.aspx arraste um GridView e código dentro da tag deve ficar igual a Listagem 01.
Listagem 01 – Código da tag da default.aspx
Porém para simular essa situação precisamos criar um código que crie controles em tempo de execução. Para isso vamos escrever o código da página default.aspx.cs igual a Listagem 02 e criar um arquivo xml chamado enquête.xml na pasta App_Data com o conteúdo igual a Listagem 03. Vamos utilizar um modelo simples de enquête apenas para ilustrar a criação de
controles em tempo de execução e a validação de forma dinâmica que foco desse artigo.
Listagem 02 – Default.aspx.cs
Listagem 03 – Conteúdo do arquivo enquete.xml
Método GridView1_RowDataBound
Nesse método ocorre a criação dos controles em tempo de execução através do método Eval da classe DataBinder recuperamos do DataSource os valores da Ordem e do Tipo do controle relacionado a pergunta da pesquisa. Logo após carregamos um DataSet com o conteúdo do arquivo enquetes.xml. O valor do tipo de controle é utilizado no laço switch para sabermos qual classe devemos instanciar.
Caso o tipo seja igual a CheckBoxList então instanciamos um objeto do tipo CheckBoxList, atribuímos os valores das propriedades DataTextField, DataValueField e DataSource e executamos o método Databind. Dessa forma temos um controle que foi criado em tempo de execução e carregados com os dados que precisamos. Como o controle já "existe" podemos inseri-lo na célula que está contida na linha que está sendo criada nesse momento no GridView1.
Veja que fazemos referência à célula de índice zero (e.Row.Cells[0].Controls.Add()) porque no nosso GridView só temos uma coluna. Na maioria dos casos existem mais colunas, então você pode obter o índice da coluna dinamicamente através de um laço foreach.
O procedimento citado acima é repetido para os demais controles, sendo alterado apenas as classes dos respectivos controles.
Método ValidaCampos
Esse método é responsável pela validação pois está associado ao evento OnServerValidate do CustomValidator. O método iniciar percorrendo todas as linhas do GridView1 através de um laço foreach. Dentro desse primeiro laço, criamos um segundo laço foreach para percorrer a coleção de controles existente na célula de índice 0 (zero) em cada linha.
Devemos apenas nos lembrar que a referência da célula 0 (zero) só é feita de forma direta, pois o nosso GridView só tem uma coluna.
Dentro do segundo laço, fazemos o teste se o tipo do controle atual é igual a um valor esperado por nós. Porém a comparação é feita através da propriedade FullName do método GetType() do controle, pois dessa forma temos certeza que a classe que iremos utilizar ao realizar o Cast (CheckBoxList ck = (CheckBoxList)ctrl;) do tipo do controle, será a classe correta. Após a ter ocorrido o cast, temos um objeto com o tipo correto. Então basta fazer a verificação se a propriedade SelectIndex é igual a -1 e como no artigo anterior atribuir o valor para a variável args.