lounatico 0 Denunciar post Postado Julho 22, 2008 Fala galera, bele? Talvez pela maneira que eu esteja acostumado a programar eu esteja com dificuldade pra entender umas coisas. Pesquisei e vi que o .net disponibiliza umas facilidades pra listagem de dados, e que se eu fosse fazer na mão ia ficar tudo fora do padrão. Enfim, criei uma classe Usuario, por exemplo, e nela tem uma função listar() que retorna uma List (Of Usuario) (estou trabalhando com VB) Esse grid pronto que o .net disponibiliza pede a instrução sql no meio do html, e isso não é bem a forma que eu acho mais certa. Tem como eu puxar os dados da minha list de Objetos? ou alguma outra forma que minha consulta fique na classe? Ou não, eu devo mesmo jogar o sql no meio do html/aspx? Valeu a força Compartilhar este post Link para o post Compartilhar em outros sites
Lab Design 0 Denunciar post Postado Julho 22, 2008 Exitem várias formas: 1 delas que uso é apontar o grid para um objectdatasource que aponta para um class como no exemplo abaixo. <fieldset> <legend class="legenda">Cotações on Line</legend> <asp:GridView ID="grdCotacoes" DataSourceID="dsCotacoes" DataKeyNames="idCotacao" AutoGenerateColumns="False" GridLines="None" CssClass="grid" OnSelectedIndexChanged="grdCotacoes_SelectedIndexChanged" Style="background-color: #6699cc; font-weight: bolder; color: white" runat="server"> <Columns> <asp:ButtonField CommandName="Select" DataTextField="idCotacao" ItemStyle-Font-Bold="true" HeaderText="Cot. Nr." /> <asp:BoundField DataField="data" HeaderText="Data" ItemStyle-HorizontalAlign="Center" ItemStyle-Width="60px"/> <asp:BoundField DataField="empresa" HeaderText="Cliente" ItemStyle-HorizontalAlign="Left"/> <asp:BoundField DataField="fone" HeaderText="Fone" ItemStyle-HorizontalAlign="Left"/> <asp:BoundField DataField="dataResp" HeaderText="Enviada" ItemStyle-HorizontalAlign="Center" ItemStyle-Width="60px"/> </Columns> <EmptyDataTemplate> Nenhum Cliente Localizado! </EmptyDataTemplate> </asp:GridView> <asp:ObjectDataSource id="dsCotacoes" TypeName="Ridgid.Cotacoes" SelectMethod="Select" Runat="server"> <SelectParameters> <asp:SessionParameter Name="idDst" SessionField="dstId" Type="Int32"/> </SelectParameters> </asp:ObjectDataSource> </fieldset> p ODS aponta para o meu class Ridgid.Cotacoes e para o metodo Select [system.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjec tMethodType.Select, false)] public static List<Cotacoes> Select(int idDst) { // Initialize command string sql; if (idDst == 0) sql = "SELECT * FROM cotacoes ORDER BY dataCot desc"; else sql = "SELECT * FROM cotacoes WHERE did1=" + idDst + " OR did2=" + idDst + " OR did3=" + idDst + " OR did4=" + idDst + " OR did3=" + idDst + " ORDER BY dataCot DESC"; SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd = new SqlCommand(sql, con); cmd.CommandType = CommandType.Text; List<Cotacoes> results = new List<Cotacoes>(); using (con) { con.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) results.Add(new Cotacoes(reader, idDst)); } return results; } o metodo acima retorna os resultados e já preenche o grid com os dados, ou seja os dados da conexão ficam no class e nao no html Compartilhar este post Link para o post Compartilhar em outros sites
Lab Design 0 Denunciar post Postado Julho 22, 2008 Noa usando o objectdatasource: <asp:GridView ID="grdProdutos" DataKeyNames="cod_prod" AutoGenerateColumns="False" GridLines="None" CssClass="grid" width="250px" Style="background-color: #6699cc; font-weight: bolder; color: white" runat="server" OnPageIndexChanging="grdProdutos_PageIndexChanging" OnSelectedIndexChanged="grdProdutos_SelectedIndexChanged" PageSize="20" AllowPaging="True"> <Columns> <asp:ButtonField CommandName="Select" DataTextField="cod_prod" ItemStyle-Font-Bold="true" HeaderText="Código" ItemStyle-CssClass="BuscaCod"/> <asp:BoundField DataField="desc_prod" HeaderText="Descrição" ItemStyle-CssClass="BuscaDescr"/> </Columns> </asp:GridView> no code-behind o metodo é chamado no page_load da pagina. protected void loadGrid() { DataSet ds = new DataSet(); string strConn; if (Request.UserHostAddress.ToString() == "127.0.0.1") strConn = WebConfigurationManager.ConnectionStrings["RidgidLocalString"].ConnectionString; else strConn = WebConfigurationManager.ConnectionStrings["RidgidMDBString"].ConnectionString; OleDbConnection conn = new OleDbConnection(strConn); OleDbConnection cn = new OleDbConnection(strConn); string strSQL; if (Session["searchText"] == null) strSQL = "SELECT cod_prod, desc_prod, pr_tabela FROM estoque_web order by desc_prod"; else strSQL = "SELECT cod_prod, desc_prod, pr_tabela FROM estoque_web where desc_prod like '%" + Session["searchText"].ToString() + "%' OR referencia like '%" + Session["searchText"].ToString() + "%' order by desc_prod"; cn.Open(); OleDbDataAdapter da = new OleDbDataAdapter(strSQL, cn); ds.Tables.Add("estoque_web"); ds.EnforceConstraints = false; ds.Tables["estoque_web"].BeginLoadData(); da.Fill(ds.Tables["estoque_web"]); ds.Tables["estoque_web"].EndLoadData(); grdProdutos.DataSource = ds.Tables["estoque_web"]; cn.Close(); grdProdutos.DataBind(); // preenche o grid } Compartilhar este post Link para o post Compartilhar em outros sites
lounatico 0 Denunciar post Postado Julho 22, 2008 nossa, valeu, funcionou.. agora vou dar uma fuçada nesse monte de propriedade.. mas só uma perguntinha, na minha aplicação eu coloco ou não uma coluna na minha table, dependendo se o cara pode ou não editar o registro.. tem como eu fazer isso? porque do jeito que está (tudo errado) eu monto a table na mão no aspx, então eu tenho total controle. Valeu! Compartilhar este post Link para o post Compartilhar em outros sites
Lab Design 0 Denunciar post Postado Julho 23, 2008 Existe duas formas de fazer isso: 1) é colocar o atributo ShowEdit="true" no gridview antes de fechar o cabeçalho. O aspx coloca automaticamente em cada linha do grid um link Edit (o texto pode ser alterado e inclusive usado um icone). Ao clicar no link, é feito um postback e a pagina retorna com a linha no modo de edição e é colocado automaticamente os links Update e Cancel (estes textos também podem ser alterados ou utilizados ícones). Os campos que não possam ser alterados você coloca no atributo readonly=true que eles nao sao renderizados como input os outros, retornam como input. Neste caso voce tem que ter um class para receber o evento edit com a mesma quantidade de campos disponíveis para edição. Exemplo GridView para edição: usei um <asp:CommandField para montar os botões como ícones. O campo DataKeyNames é utilizado para recuperar o ID do registro selecionado. Esse ID é enviado automaticamente ao metodo Update indicado no objectdatasouce, assim como o comando Delete é enviado ao metodo Delete, ambos no class <asp:GridView ID="GrdPedidoItens" DataSourceID="srcEditPedido" DataKeyNames="numreg" AutoGenerateColumns="False" GridLines="None" CssClass="grid" width="100%" Style="background-color: #6699cc; font-weight: bolder; color: white" runat="server" ShowFooter="true" OnRowDataBound="grdPedidoItens_RowDataBound"> <Columns> <asp:BoundField DataField="numcat" HeaderText="Código" ReadOnly="true"/> <asp:BoundField DataField="descricao" HeaderText="Descrição" ItemStyle-HorizontalAlign="Left" ItemStyle-Font-Size="7" ReadOnly="true"/> <asp:BoundField DataField="modelo" HeaderText="Mod." ReadOnly="true" ItemStyle-Font-Size="7"/> <asp:BoundField DataField="quant" HeaderText="Quant" ControlStyle-Width="30" ItemStyle-HorizontalAlign="Center" ControlStyle-CssClass="edValores"/> <asp:BoundField DataField="preco" HeaderText="Preço" ItemStyle-HorizontalAlign="Right" ReadOnly="true"/> <asp:BoundField DataField="total" HeaderText="Total R$" ItemStyle-HorizontalAlign="Right" ReadOnly="true"/> <asp:CommandField ShowEditButton="true" EditText="<img src='Images/edit.png' border='0' alt='Alterar Registro'/>" CancelText="<img src='Images/Undo.png' border='0' alt='Gravar Alteração'/>" UpdateText="<img src='Images/Update.png' border='0' alt='Cancelar Alteração'/>"/> <asp:TemplateField> <ItemTemplate> <asp:LinkButton ID="btnDel" Text="<img src='Images/delete.png' border='0'>" CommandName="Delete" runat="server" OnClientClick="return confirm('Você tem certeza ?');" Visible="true"/> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> <asp:ObjectDataSource ID="srcEditPedido" TypeName="Ridgid.Pedidos" SelectMethod="SelectItens" UpdateMethod="Update" runat="server" DeleteMethod="Delete" OnDeleted="grdPedidoItens_Deleted"> <SelectParameters> <asp:SessionParameter Name="idPedido" SessionField="pedId" Type="Int32" /> </SelectParameters> </asp:ObjectDataSource> Observe o comando Delete também. Compartilhar este post Link para o post Compartilhar em outros sites
lounatico 0 Denunciar post Postado Julho 23, 2008 nossa MUITO obrigado, vai ser de grande ajuda esse exemplo. Outra perguntinha: é muito feio botar um if no meio do aspx? Porque o editar já está pronto, só que ele manda o id pruma outra página, essa página busca os valores desse registro, joga em campos bonitinhos, o usuário edita, ela faz a validação, depois é feito o update. Sendo assim, eu não queria usar esse editar pronto deles, queria continuar jogando com o meu. Só que aí um perfil de usuário pode ver, outro perfil não, e eu tenho uma boolean que é true ou false para mostrar ou não. Nesse caso, eu faria algo como CODE <% if (alterar) then %> <asp:CommandField ShowEditButton="true" EditText="<img src='Images/edit.png' border='0' alt='Alterar Registro'/>"/> <% end if %> Como deixar isso correto? Eu não queria simplesmente esconder com CSS porque alguem mais esperto poderia ver o código, pegar parâmetro, enfim, dar uma funçada nisso ae, você me entende? acho que com essa orientação e com esse exemplo aí de cima eu sigo mais tranquilo.. valeu! Compartilhar este post Link para o post Compartilhar em outros sites
Lab Design 0 Denunciar post Postado Julho 24, 2008 Olha só lounatico, uma das características do dotnet que me chamou a atenção é exatamente isso de separar em camadas. Isso além de facilitar a manutenção, suas páginas ficam mais curtas e objetivas. Eu não uso qualquer tipo de programação nas paginas aspx, exceto alguns parametros mas esses não são renderizados para o cliente. Geralmente o que faço é o seguinte: Pra voce poder inserir um registro, o formview tem que estar no modo Insert, para editar um registro o formview tem que estar no modo edit, portanto dessa forma, eu tenho no mesmo aspx os dois formview so que são renderizados com o atributo visible=false e no code-behind da página eu habilito um ou outro para o usuário. E cada um tem um botão de disparo que posso direcionar para um método especifico no code-behind. Nada impede que voce use duas páginas, uma para inclusão e outra para edição mas eu nao sou adepto e prefiro manter os dois numa mesma página e bem documentado. No caso de um grid, acho que voce num pode usar um if, sei la não me parece lógico. Você poderia sei la colocar algum botão na pagina que ao disparar colocaria o grid em modo de edit mas lembre-se que ele nao abre todas as linhas, voce tem que selecionar uma linha. Compartilhar este post Link para o post Compartilhar em outros sites