function DemoOnline()
{
window.open("http://www.projetando.net/Articles/DemoOnline.aspx?ArticleID=29", "", "width=750, height=580, scrollbars=yes, resizable=yes");
}
Com a vinda do ASP.NET, muitos recursos foram implementados para garantir a facilidade no desenvolvimento de aplicações Web. Uma das inúmeras facilidades criadas pela Microsoft, foi o
WebControl DataGrid. Um controle muito rico, que disponibiliza uma série de "features", dentre elas a possibilidade de editarmos registros vindos de uma Base de Dados dentro do
DataGrid.
Claro que somente isso não era/é necessário. A necessidade de utilizarmos
DropDownList dentro do
DataGrid é muito grande, o que exige um pouco de atenção para poder populá-lo. Mas nesse caso a dificuldade não é tão grande. O problema começa a aparecer quando há a necessidade de termos dois
DropDownLists dentro deste
DataGrid, mas um deles dependendo da seleção do primeiro, e baseado nisso popular este segundo
DropDownList. Um cenário bastante conhecido: a exibição dos Clientes dentro deste
DataGrid, visualizando a cidade e estado de residência deste Cliente, que ao clicar em editar, deve-se exibir dois
DropDownList contendo o Estados e os Municípios que devem ser populados de acordo com o Estado selecionado.
Tendo este cenário, este artigo explicará como construir um
DataGrid onde dentro dele, quando editarmos um determinado registro, a linha em edição deverá mostrar os
DropDownLists (Estado e Município, respectivamente), onde ao selecionar o Estado, o segundo
DropDownList deverá ser populado com as cidades referentes aquele Estado.
Depois de criado uma Aplicação do tipo ASP.NET Web Application, você deve adicionar um
DataGrid ao seu
WebForm. Com isso, vá até o
Property Builder e desmarque a opção: "Create columns automatically at run time". Com isso, basta adicionarmos o campos a serem exibidos no
DataGrid e juntamente os botões de Editar e Cancelar. Finalmente você terá o teu
DataGrid próximo à Figura 1 (abaixo):
|
Figura 1 - DataGrid já formatado. |
Depois de definido as colunas que serão apresentadas no
DataGrid, devemos formatar agora o modo de edição do mesmo. Para isso, clique com botão direito do mouse em cima do
DataGrid, e na opção
Edit Template, selecione a coluna Estado. Com o Template em edição, você adiciona um
DropDownList no
EditItemTemplate chamado "cboEstado". Repita os passos anteriores para a coluna Cidade. A Figura 2 (abaixo) ilustra o processo:
|
Figura 2 - Configurando o EditItemTemplate. |
Com o design do
DataGrid pronto, resta agora começarmos a codificar o
WebForm para popular o
DataGrid, mas inicialmente vou chamar a atenção para o código abaixo:
|
|
Public Class _Default |
|
    Private _estado As String |
    Private _cidade As String |
|
End Class |
|
|
Código 1 - Membros da Classe.
|
Como podemos ver, é criado estes dois
Data Members que serão utilizados posteriormente para quando o Usuário desejar editar o registro, ficar armazenado nestes membros o Estado e Cidade do registro à ser editado, para que seja possível após a carga nos
DropDownLists, posicionar os Items de acordo com a Cidade e Estado atual do Cliente.
O método abaixo (
CarregaGrid()) é utilizado para preencher o
DataGrid no evento
Load do
WebForm. Está densvinculado, pois será necessário chamarmos em diversos locais. Vejamos:
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
|
|
Private Sub Page_Load(ByVal sender As System.Object, _ |
ByVal e As System.EventArgs) Handles MyBase.Load |
|
If Not Page.IsPostBack Then |
Call Me.CarregaGrid() |
End If |
End Sub |
|
Private Sub CarregaGrid() |
Dim conn As New SqlConnection("CONNECTION_STRING") |
Dim cmd As New SqlCommand("SELECT * FROM [User] ORDER BY Nome ASC", conn) |
Try |
conn.Open() |
With Me.dg |
.DataSource = cmd.ExecuteReader() |
.DataBind() |
End With |
Catch ex As Exception |
Response.Write(ex.ToString) |
Finally |
If Not conn.State = ConnectionState.Closed Then |
conn.Close() |
End If |
End Try |
End Sub |
|
|
Código 2 - Método para carregar o DataGrid.
|
Como vemos acima, no evento
Load do
WebForm, chamamos a função
CarregaGrid() quando não for um
PostBack. Utilizando o
SqlDataReader, resgatamos os registros da tabela "Users" e popularmos o
DataGrid. Como já definimos as colunas a serem apresentadas, a exibição é controlada pelo
DataGrid.
Com o
DataGrid já preenchido, devemos codificar os eventos
EditCommand e
CancelCommand do
DataGrid, para que quando o Usuário optar por editar uma determinada linha/registro do
DataGrid, puder transformá-la, colocando a disposição os
DropDownLists de Estado e Cidade. Abaixo o código para isso:
|
|
Private Sub dg_EditCommand(ByVal source As System.Object, _ |
ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dg.EditCommand |
|
Me._cidade = DirectCast(e.Item.FindControl("Label1"), Label).Text |
Me._estado = DirectCast(e.Item.FindControl("Label2"), Label).Text |
Me.dg.EditItemIndex = e.Item.ItemIndex |
Call Me.CarregaGrid() |
End Sub |
|
|
Código 3 - Evento EditCommand do DataGrid.
|
Vemos que no evento
EditCommand, qual ocorre sempre que o Usuário desejar editar algum registro do
DataGrid, armazenamos nos nossos
Data Members (falado acima) os valores atuais do Estado e da Cidade do Cliente, que estão armazenados nos
Labels. Abaixo o evento
CancelCommand do
DataGrid, necessário para quando o Usuário desejar cancelar a edição o
DataGrid voltar à sua posição inicial:
|
|
Private Sub dg_CancelCommand(ByVal source As System.Object, _ |
ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) _ |
Handles dg.CancelCommand |
|
Me.dg.EditItemIndex = -1 |
Call Me.CarregaGrid() |
End Sub |
|
|
Código 4 - Evento CancelCommand do DataGrid.
|
Depois dessas funcionalidades codificadas, temos que criar os métodos que serão responsáveis por popular os
DropDownLists. Veremos abaixo o método
CarregaEstado() que retorna um
ArrayList contendo os Estados que serão inseridos no
DropDownList Estado dentro do
DataGrid:
|
|
Private Function CarregaEstado() As ArrayList |
Dim arr As New ArrayList |
With arr |
.Add(String.Empty) |
.Add("SP") |
.Add("MT") |
End With |
Return arr |
End Function |
|
|
Código 5 - Método para carregar o DropDownList Estado.
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
|
|
Private Sub PopulaCidades(ByVal drop As DropDownList, _ |
ByVal cidadeAtual As String, ByVal estado As String) |
|
Select Case estado |
Case "SP" |
With drop.Items |
.Add("Valinhos") |
.Add("São Paulo") |
.Add("Campinas") |
End With |
Case "MT" |
With drop.Items |
.Add("Rondonópolis") |
.Add("Cuiabá") |
.Add("Várzea Grande") |
End With |
End Select |
drop.SelectedIndex = drop.Items.IndexOf(drop.Items.FindByText(cidadeAtual)) |
End Sub |
|
|
Código 6 - Método para carregar o DropDownList Cidade.
|
O método
PopulaCidades(...) acima, recebe por parâmetro o
DropDownList que será carregado com as cidades, a cidade atual para que possamos selecionar (marcarmos) a mesma dentro do
DropDownList depois de carregado e finalmente o estado para poder fazer a busca de acordo com a seleção do Usuário.
Agora será necessário codificarmos dois eventos do
DataGrid:
ItemDataBound e
ItemCreated. O evento
ItemCreated é disparado quando um controle é criado no
DataGrid. Já o evento
ItemDataBound é disparado logo após que um Item é inserido no cliente. Utilizaremos o evento
ItemCreated para quando o
DataGrid estiver com algum Item sendo editado, o mesmo possa atribuir ao
DropDownList de Estado uma função para ser disparada quando ocorrer o evento
SelectedIndexChanged do mesmo. Vejamos abaixo como ficará este evento:
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
|
|
Private Sub dg_ItemCreated(ByVal source As System.Object, _ |
ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dg.ItemCreated |
|
If e.Item.ItemType = ListItemType.EditItem Then |
With DirectCast(e.Item.FindControl("cboEstado"), DropDownList) |
.DataSource = .CarregaEstado() |
.DataBind() |
End With |
AddHandler DirectCast(e.Item.FindControl("cboEstado"), DropDownList).SelectedIndexChanged, _ |
AddressOf Me.CarregaCidade |
End If |
End Sub |
|
|
Código 7 - Evento ItemCreated do DataGrid.
|
Como vemos no evento
ItemCreated logo acima, ao encontrar o
DropDownList de Estado, já o populamos com o retorno da função
CarregaEstado(), e em seguida utilizamos o
AddHandler para que quando o evento
SelectedIndexChanged deste
DropDownList for disparado, executar a função chamada:
CarregaCidade(...). Esta função deverá ter obrigatoriamente a mesma assinatura do evento
SelectedIndexChanged. Veremos abaixo ela em detalhes:
|
|
Private Sub CarregaCidade(ByVal sender As Object, ByVal e As EventArgs) |
Dim drop As DropDownList = DirectCast(sender, DropDownList) |
Dim dgi As DataGridItem = drop.Parent.Parent |
Dim drop2 As DropDownList = DirectCast(dgi.FindControl("cboCidade"), DropDownList) |
drop2.Items.Clear() |
Call Me.PopulaCidades(drop2, drop2.SelectedValue, drop.SelectedValue) |
End Sub |
|
|
Código 8 - Método que será disparado quando o DropDownList Estado for alterado.
|
Analisando o código acima, criamos três objetos: drop, dgi e drop2. O drop resgata a referência do objeto que como parâmetro através do
sender. Já o dgi, recuperamos a referência do controle pai do drop na hierarquia de controles da página. Com isso, conseguimos saber em qual Item do
DataGrid ele se encontra. E finalmente, como temos o Item do
DataGrid, basta utilizarmos o método
FindControl para popularmos o
DropDownList com as cidades.
Para finalizar, apenas resta codificarmos o evento
ItemDataBound do
DataGrid qual utilizaremos para quando o Usuário desejar editar algum Item, os
DropDownLists de Estado e Cidade já vieram populados de acordo com registro atual do Cliente na Base de Dados, ou seja, se o Cliente pertencer ao Estado de "SP", o
DropDownList de Cidade já deverá conter as cidades pertencentes à este Estado.
Depois de todos estes passos, o resultado será:
|
Figura 3 - Ao clicar em Editar, os DropDownLists já aparecem carregados corretamente. |
|
Figura 4 - Repare que a Cidade e Estado estão "marcados" de acordo com o Registro atual. |
|
Figura 5 - Ao selecionar o Estado, o DropDownList é carregado de acordo com o Estado selecionado. |
CONCLUSÃO: Vemos que o WebControl DataGrid nos fornece uma grande facilidade no desenvolvimento. Neste caso, utilizando DropDownLists e executando seu o evento SelectedIndexChanged precisamos codificar algumas linhas, mas nada complexo. Vimos neste artigo, um cenário bastante comum em nosso "dia-a-dia", ficando aqui explicado como implementá-lo.
Artigo desenvolvido utilizando:
* Visual Studio .NET 2003
* SQL Server 2000
* .NET Framework 1.1
* Windows XP Professional
Clique aqui para fazer Download do Código.