Fórum Personalizando o GRID VIEW manualmente agora... #837
27/11/2008
Carlos
Boa Noite
Solicito uma consultoria de como implementar uma solução para o seguinte problema
Como montar uma tela de Cadastro, sem Wizard e ainda em 2 camadas(banco e aplicação) onde terei
que cadastrar os seguintes dados num_os, nome do usuario, tipo do equipamento, com defeito s/ n ?
cad_os(Num_os int pk ,codusuario int, cod_equip int fk ,defeito_sn bolean)
cad_eqp(cod_equip int,descricao varchar(20))
cad_usu(cod_usuario int, nomeusuario varchar(20))
O objetivo é entender como popular drowpdownlist sem usar SqlDataSource e usar algum em ASP.NET
talvez ajax, onde possa fazer a consutla do nome do cliente.
Apos Cadastrado, os campos de Cad_Os deverão aparecer numa GRIDVIEW e na direita dos campos da tabela, aparecer icones para editar e excluir registros.
Não consegui uma maneira de colocar os botoes Edit , Exclui de modo que eles apareçam depois dos campos da tabela, com o uso do SqlDataReader.
Ainda não entendi bem o uso do SqlAdatapter, SqlDataTable.
Procurei algum exemplo na videos e artigos da Devmedia e não encontrei. Resolvi abrir uma consultoria.
Muits de minhas duvidas podem ser bobas, mas não estou conseguindo posta-las no forum da DEVMEDIA para poder sanalas, e como isto é para meu aprimoramento no trabalho optei pela consultoria.
Desde já agradeço a atenção
[]s
Sérgio
Posts
28/11/2008
Guinther Pauli
Sérgio,
Desculpe-nos pela demora,
Estaremos dando prioridade ao seu chamado,
Guenta só mais um poquinho ai,
abs
28/11/2008
Guinther Pauli
Olá Sérgio,
A Primeira coisa a fazer é construir uma classe de dados que retornara um DataSet com os registros para serem carregados na combo, como abaixo:
private void CarregarCliente()
{
DataTable dt = cliente.Buscar();
ddlCliente.DataSource = dt;
ddlCliente.DataValueField = "cod_cliente";
ddlCliente.DataTextField = "nom_cliente";
ddlCliente.DataBind();
ddlCliente.Items.Insert(0, new ListItem("Selecione", "0"));
}
Onde cliente.Buscar() serão:
Cliente = nome da classe de acesso aos dados no banco;
Buscar = Nome do método que retorna o DataTable usado para pupular a combo.
Feito isto, vc deve motar sua Grid usando um UpdatePanel do Ájax, assim cada inserção no banco sua pagina é atualizada fazendo o RoundTrip sem dar um Post na tela.
Para montar a grid sem o Wizard, faça como no exemplo abaixo:
<asp:DataGrid id="dgTeste" Runat="server" Width="100%" CssClass="sua_classe_css" CellPadding="3"
AutoGenerateColumns="False" BorderWidth="1px" BorderColor="Black">
<HeaderStyle CssClass="cabecalho" BackColor="#CCCCFF"></HeaderStyle>
<Columns>
<asp:BoundColumn DataField="nome_coluna_1" HeaderText="Teste 1"></asp:BoundColumn>
<asp:BoundColumn DataField="nome_coluna_2" HeaderText="Teste 2"></asp:BoundColumn>
<asp:BoundColumn DataField="nome_coluna_3" HeaderText="Teste 3"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="Editar">
<HeaderStyle HorizontalAlign="Center" Width="1px"></HeaderStyle>
<ItemStyle HorizontalAlign="Center" CssClass="acao"></ItemStyle>
<ItemTemplate>
<asp:ImageButton id="ibEditar" OnClick="Editar" runat="server" ImageUrl="../../Imagens/ico_editar.gif"></asp:ImageButton>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Excluir">
<HeaderStyle HorizontalAlign="Center" Width="1px"></HeaderStyle>
<ItemStyle HorizontalAlign="Center" CssClass="acao"></ItemStyle>
<ItemTemplate>
<asp:ImageButton id="ibExcluir" OnClick="Excluir" runat="server" ImageUrl="../../Imagens/ico_excluir.gif"></asp:ImageButton>
<asp:Label id="lbExcluir" Visible="False" runat="server">-</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
Da forma acima você consegue setar a ordem de suas colunas manualmente, e basta usar o evento RowDataBound (.net 2 ou superior) ou ItemDataBound (.net 1.1) para que os registros sejam instanciados na Grid já com os valores necessários para a recuperação, como abaixo:
private void dgTeste_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
{
int codUsuario = Convert.ToInt32(DataBinder.Eval(e.Item.DataItem, "cod_usuario"));
ImageButton ibEditar = e.Item.FindControl("ibEditar") as ImageButton;
ImageButton ibExcluir = e.Item.FindControl("ibExcluir") as ImageButton;
Label lbExcluir = e.Item.FindControl("lbExcluir") as Label;
ibEditar.CommandArgument = codPaciente.ToString();
ibExcluir.CommandArgument = codPaciente.ToString();
ibExcluir.Attributes["onclick"] = "return confirmarExclusao(este Usuario);";
lbExcluir.Visible = (registros != 0);
ibExcluir.Visible = !(registros != 0);
}
}
Quando for clicado qualquer ícone, seja ele de Editar ou excluir serão chamados os métodos que farão as alterações e exclusão dos registros, lembrando que deve ser colocado uma mensagem js cliente de confirmação no caso de exclusão. Código dos métodos dos eventos de Edição e Exclusão:
protected void Editar(object sender, System.Web.UI.ImageClickEventArgs e)
{
ExecutarEdicao(Convert.ToInt32((sender as ImageButton).CommandArgument));
}
protected void Excluir(object sender, System.Web.UI.ImageClickEventArgs e)
{
cliente.Excluir(Convert.ToInt32((sender as ImageButton).CommandArgument));
}
Código javascript necessario para mensagem de exclusão:
function confirmarExclusao(item, extra)
{
return confirm("Voce deseja realmente excluir " + item + "?\n\nATENCAO: Esta acao nao podera ser desfeita." + ((typeof(extra) != "undefined") ? "\n\nOBSERVACAO: " + extra : ""));
}
Aguardamos seu retorno,
abs
Guinter
1o) Qto a questão da DropDownList, se eu usar a mesma DropDownlist como poderei reutilizar o codigo?
2o) Não entendi ou talvez não achei em que lugar a GRIDVIEW é populada com o DataSource de modo que os Imagensbuttons fiquem a direita dos dados
Fico no aguardo!
Atte
Sérgio
29/11/2008
Guinther Pauli
Olá Sérgio,
O chamado foi trocado de consultor,
Quem estará lhe acompanhando neste chamado é o Luiz Maia,
abs.
Bom dia Sérgio,
Quanto ao DDL, você terá uma classe de negócios onde terá o metodo que retorna os registros para popular a DDL, no caso vc pode passar o controle DDL por parametro e chamar a classe que faz o preenchimento, como abaixo, você poderá reaproveitar somente a estrutura de negócio, o controle não. Portanto terá que ter varios controles em diferentes páginas que serão populados pelo mesmo método, que estará num classe diferente que será instanciada em suas páginas aspx:
private void CarregarDDL(DropDownList ddl)
{
DataTable dt = cliente.Buscar();
ddl.DataSource = dt;
ddl.DataValueField = "cod_cliente";
ddl.DataTextField = "nom_cliente";
ddl.DataBind();
ddl.Items.Insert(0, new ListItem("Selecione", "0"));
}
Em relação ao GridView, como você pode ver no comentário anterior, suas colunas são montadas da maneira que você bem entender. No código da GV as colunas de edição e exclusão, com os ImageButons são as duas últimas colunas da grig, no caso eles são TemplateColuns:
<asp:TemplateColumn HeaderText="Editar">
<HeaderStyle HorizontalAlign="Center" Width="1px"></HeaderStyle>
<ItemStyle HorizontalAlign="Center" CssClass="acao"></ItemStyle>
<ItemTemplate>
<asp:ImageButton id="ibEditar" OnClick="Editar" runat="server" ImageUrl="../../Imagens/ico_editar.gif"></asp:ImageButton>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Excluir">
<HeaderStyle HorizontalAlign="Center" Width="1px"></HeaderStyle>
<ItemStyle HorizontalAlign="Center" CssClass="acao"></ItemStyle>
<ItemTemplate>
<asp:ImageButton id="ibExcluir" OnClick="Excluir" runat="server" ImageUrl="../../Imagens/ico_excluir.gif"></asp:ImageButton>
<asp:Label id="lbExcluir" Visible="False" runat="server">-</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
E para preenchimento da grid você deve usar um método:
private void PopulaGrid()
{
DataTable resultado = cliente.Buscar();
dvSuaGrid.DataSource = resultado;
dvSuaGrid.DataBind();
}
Abraços Sergio, caso haja alguma dúvida, estou a disposição.
Att,
Luiz Maia
Sergio,
Dê uma olhada neste vidio aula:
https://www.devmedia.com.br/cursos/listcurso.asp?curso=77
Aqui tem algumas coisas que serão úteis para você.
Caso nâo tenha acesso, por favor me avise para que eu possa providenciar.
Abraços
Luiz Maia
Sérgio,
Espero que tenha resolvido o problema.
Como não obtive seu retorno, estou considerando o chamado encerrado.
Estou a disposição para qualquer dúvida eventual.
Abraços
Att,
Luiz Maia