Desenvolvimento de Website com ASP.NET e SQL Server – Parte 5

Olá caro leitor!
Você acompanhou até aqui o desenvolvimento de website com ASP.NET e SQL Server. Se não acompanhou, acesse:

Hoje iremos finalizar nosso projeto realizando o desenvolvimento das funcionalidades principais do nosso painel de controle. Iremos abordar os seguintes tópicos:

  • Criação das telas de gerenciamento de páginas
  • Uso do CK Editor
  • Link para encerrar sessão do usuário

Para iniciarmos, faça o download do fonte do projeto disponibilizado no Github.

Na teoria, as funcionalidades para o gerenciamento das páginas serão as mesmas que dos usuários com a diferença que iremos utilizar o CK Editor como nosso editor.
Para iniciar, vamos criar a nossa página gerenciar_paginas.aspx. Você já fez isso antes, então não tem segredo.
Clique com o botão direito sobre a pasta painel e em seguida Add new item.

Defina o nome para nossa página. Ela irá se chamar gerenciar_paginas.aspx.

Defina a MasterPage. Atente-se a selecionar a MasterPage do painel de controle.

A página ficará semelhante à de usuários. Essa página conterá um GridView para listar as páginas. Para preencher esse GridView utilizaremos um ObjectDataSource. Então, adicione um GridView, um ObjectDataSource e um Button. O Button será usado para nos direcionar para a página de cadastro.

Clique em cima do ObjectDataSource, e clique na seta para selecionar a opção Configure Data Source.

Na janela de configuração selecione o nosso objeto WebSite.Business.Paginas pois é nele que contem nossas regras de negocio.

Selecionaremos a opção para ListaPaginas.

Antes de concluir, clique na aba DELETE e selecione a o método ExcluiPagina e em seguida clique no botão Finish para concluirmos.

Agora que temos definido a opção de excluir e listar as páginas, vamos configurar nosso GridView. Para isso associaremos no GridView o ObjectDataSource. Clique no GridView e na seta que aparece no canto superior direito clique e seleciona o ObjectDataSource na opção Choose Data Source. Aproveite e selecione as opções Enable Paging e Enable Deleting. Essas opções irão habilitar a paginação e o link para excluir registro.

Vamos definir no GridView qual é o DataKeyNames. No nosso caso informaremos DataKeysName igual Id e foi como fizemos no caso dos usuários. Assim sendo, estamos informando ao GridView que a chave de cada registro será o Id e essa será utilizada quando formos excluir algum registro. Para definir o DataKeyNames, clique no GridView e vá em properties.

É possível definir mais de um, mais nesse caso não será necessário.
Agora defina um estilo para o GridView.

Agora já temos nosso resultado.

Vamos definir a funcionalidade do nosso botão Nova página. De duplo clique e vamos atribuir o evento.


protected void btnNovaPagina_Click(object sender, EventArgs e)
{
    Response.Redirect("editar_pagina.aspx");
}

Crie uma nova página. Ela deverá se chamar editar_pagina.aspx.

Defina a MasterPage do painel de controle.

Antes de darmos continuidade, nessa página iremos precisar do CKEditor e para isso precisaremos realizar o download. Faça o download do CKEditor e do CKEditor for ASP.NET. Ele será usado como nosso editor HTML.
Acesse o link direto da versão utilizada:

Agora adicionaremos o CKEditor for ASP.NET ao nossa Toolbox do Visual Studio. Descompacte o arquivo que fizemos o download. Clique em Add Tab, defina o nome e em seguida clique em Choose Item.

Procure o arquivo do CKEditor e adicione.

Agora é só utiliza-lo em nosso projeto.

Agora abra a página editar_pagina.aspx para adicionarmos os campos necessários para a edição da pagina. Inclua 1 HiddenField, 1 TextBox, 1 CheckBox, 2 Button e o CKEditor conforme o código abaixo.


<div class="form">
    <h3>Nova página</h3>
    <br />
    <asp:HiddenField ID="hdfId" runat="server" />
    <label class="label">Titulo</label>
    <asp:TextBox ID="txtTitulo" runat="server"></asp:TextBox><br />
    <label class="label">Texto</label>
    <ckeditor:ckeditorcontrol runat="server"></ckeditor:ckeditorcontrol>
    <asp:CheckBox ID="chkAtivo" runat="server" Text="Ativo" /><br />
    <div class="command">
        <asp:Button ID="btnSalvar" runat="server" Text="Salvar" />
        <asp:Button ID="btnCancelar" runat="server" Text="Cancelar" />
    </div>
</div>
<br />

Se você executar a página agora, o CKEditor for ASP.NET não irá ser exibido. Para isso precisaremos copiar o CKEditor que realizamos o download para dentro do nosso projeto. Abra a pasta onde está salvo o projeto e copie para a raiz.

Agora sim nosso CKEditor irá aparecer.

O CKEditor possui muitas funcionalidades, mais muitas delas serão desnecessárias para nós nesse momento. Como desativar? Basta editar a propriedade ToolbarFull. Altere o conteúdo da propriedade incluindo o texto abaixo:


Cut|Copy|Paste|PasteText|PasteFromWord|-|Print|SpellChecker|Scayt|Undo|Redo|-|Find|Replace|-|SelectAll
/
Bold|Italic|Underline|Strike|-|Subscript|Superscript|NumberedList|BulletedList|-|Outdent|Indent|
Blockquote|JustifyLeft|JustifyCenter|JustifyRight|JustifyBlock|Link|Unlink|Anchor|Image|Table|
HorizontalRule|Smiley|SpecialChar
/
Styles|Format|Font|FontSize|TextColor|BGColor|Maximize|Source

Agora ficou assim nosso editor.

Com a nossa página definida, vamos implementar nosso código. No CodeBehind da página, adiciona referencia a nossa classe de negocio e de entidades.


using UsuariosBO = WebSite.Business.Usuarios;
using Usuarios = WebSite.Entities.Usuarios;

Agora daremos um duplo clique no botão Salvar para implementarmos o código que salvará os dados da nova página. O código do botão ficara assim.


protected void btnSalvar_Click(object sender, EventArgs e)
{
    int Id;
    int.TryParse(hdfId.Value, out Id);
    string Titulo = txtTitulo.Text;
    string Texto = txtTexto.Text;
    bool Ativo = chkAtivo.Checked;

    Paginas pagina = new Paginas();
    pagina.Id = Id;
    pagina.Titulo = Titulo;
    pagina.Texto = Texto;
    pagina.Ativo = Ativo;

    PaginasBO paginasBO = new PaginasBO();
    bool Salvou = paginasBO.SalvaPagina(pagina);

    if (Salvou)
    {
        Response.Redirect("gerenciar_paginas.aspx");
    }
}

No código estamos recebendo todos os dados e os atribuindo na classe Paginas para posteriormente salva-lo. Após ser salvo, seremos redirecionados para a página que lista todas as nossas páginas criadas.
Vamos atribuir código ao botão cancelar para que o usuário possa desistir de editar os dados. De duplo clique sobre o botão Cancelar.


protected void btnCancelar_Click(object sender, EventArgs e)
{
    Response.Redirect("gerenciar_paginas.aspx");
}

Como ficará nosso código HTML.


<%@ Page Title="" Language="C#" MasterPageFile="~/painel/MasterPage.master" AutoEventWireup="true" CodeFile="editar_pagina.aspx.cs" Inherits="painel_editar_pagina" %>

<%@ Register Assembly="CKEditor.NET" Namespace="CKEditor.NET" TagPrefix="CKEditor" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <div class="form">
        <h3>Nova página</h3>
        <br />
        <asp:HiddenField ID="hdfId" runat="server" />
        <label class="label">Titulo</label>
        <asp:TextBox ID="txtTitulo" runat="server"></asp:TextBox><br />
        <label class="label">Texto</label>
        <ckeditor:ckeditorcontrol ID="txtTexto" runat="server" ToolbarFull="Cut|Copy|Paste|PasteText|PasteFromWord|-|Print|SpellChecker|Scayt|Undo|Redo|-|Find|Replace|-|SelectAll
/
Bold|Italic|Underline|Strike|-|Subscript|Superscript|NumberedList|BulletedList|-|Outdent|Indent|Blockquote|JustifyLeft|JustifyCenter|JustifyRight|JustifyBlock|Link|Unlink|Anchor|Image|Table|HorizontalRule|Smiley|SpecialChar
/
Styles|Format|Font|FontSize|TextColor|BGColor|Maximize|Source"></ckeditor:ckeditorcontrol>
        <asp:CheckBox ID="chkAtivo" runat="server" Text="Ativo" /><br />
        <div class="command">
            <asp:Button ID="btnSalvar" runat="server" Text="Salvar" 
                onclick="btnSalvar_Click" />
            <asp:Button ID="btnCancelar" runat="server" Text="Cancelar" 
                onclick="btnCancelar_Click" />
        </div>
    </div>
    <br />
</asp:Content>

E o código CodeBehind ficará dessa forma.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using PaginasBO = WebSite.Business.Paginas;
using Paginas = WebSite.Entities.Paginas;

public partial class painel_editar_pagina : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btnSalvar_Click(object sender, EventArgs e)
    {
        int Id;
        int.TryParse(hdfId.Value, out Id);
        string Titulo = txtTitulo.Text;
        string Texto = txtTexto.Text;
        bool Ativo = chkAtivo.Checked;

        Paginas pagina = new Paginas();
        pagina.Id = Id;
        pagina.Titulo = Titulo;
        pagina.Texto = Texto;
        pagina.Ativo = Ativo;

        PaginasBO paginasBO = new PaginasBO();
        bool Salvou = paginasBO.SalvaPagina(pagina);

        if (Salvou)
        {
            Response.Redirect("gerenciar_paginas.aspx");
        }
    }
    protected void btnCancelar_Click(object sender, EventArgs e)
    {
        Response.Redirect("gerenciar_paginas.aspx");
    }
}

Vamos implementar agora a página para que seja possível editar as páginas criadas.
Clique sobre o GridView da página de gerencia e clique na seta no canto superior direito em seguinda clique no link Edit Column.

Selecione um HyperLinkField e adicione. Mova até o inicio da lista. Selecione o HyperLinkField adicionado e defina o Text, DataNavigationUrlFields e DataNavigationUrlFormat e em seguida clique no botão OK. Teste a página.
Será necessário agora implementarmos em nossa página de edição de páginas a opção para receber uma QueryString para buscar os dados. Vamos implementar o Page_Load.


protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        if (Request.QueryString["id"] != null)
        {
            int Id;
            int.TryParse(Request.QueryString["id"], out Id);

            PaginasBO paginasBO = new PaginasBO();
            Paginas pagina = paginasBO.ListaPaginas(new Paginas(Id)).FirstOrDefault();

            hdfId.Value = pagina.Id.ToString();
            txtTitulo.Text = pagina.Titulo;
            txtTexto.Text = pagina.Texto;
            chkAtivo.Checked = pagina.Ativo;
        }
    }
}

Agora teste sua página.

Agora o resultado da edição de uma das minhas páginas.

Existe um detalhe importante que não mencionei. As páginas que eu desativo continuam aparecer. Vamos mudar o código do nosso menu. No foreach que monta o menu, vamos fazer um verificação se a página está ativa.
Veja como fica o código.


protected void Page_Load(object sender, EventArgs e)
{
    // Instancia da classe de Negocio
    WebSite.Business.Paginas paginasBO = new WebSite.Business.Paginas();
    // Chamada ao metodo que lista todas as paginas que irá gerar um array das mesmas
    WebSite.Entities.Paginas[] paginas = paginasBO.ListaPaginas();

    // Realizando um laço de repetição no array para ler cada registro
    foreach (WebSite.Entities.Paginas pagina in paginas)
    {
        if (pagina.Ativo)
        {
            // Formatando a string para que seja gerado uma saida conforme exemplo
            // <li>Titulo Pagina</li>
            string mnu = string.Format("<li><a href=\"pagina.aspx?id={0}\">{1}</a></li>", pagina.Id, pagina.Titulo);
            // Atribuindo o texto gerado no Server Control Literal
            ltlItensMenu.Text += mnu;
        }
    }
}

Agora para finalizar crie uma página chamado sair.aspx. Essa não necessita ser utilizando a MasterPage pois ela será usada para encerrar a sessão do painel de controle.

Agora vamos implementar o código no evento Page_Load que irá destruir a Session relacionada ao login do usuário.


protected void Page_Load(object sender, EventArgs e)
{
    Session.Remove("PainelAutenticado");
    Session.Remove("Usuario");
    Response.Redirect("login.aspx");
}

Assim concluímos o projeto proposto. Se você acha que ele para por ai, você tem inúmeras possibilidade basta ter criatividade e implementar em seu projeto.
Espero ter sido claro ao longo dos artigos e que não tenha deixado nenhuma dúvida. Fiquem a vontade de abrir um tópico no Forum para postar suas dúvidas e discutir as melhores praticas no desenvolvimento de um projeto com ASP.NET. Podem postar comentários que estarei pronto para responder.

Fonte do projeto: Github

Não deixe de participar do fórum. Siga o C# Brasil no Twitter e Facebook.
Até o próximo artigo e bons estudos!

104 thoughts on “Desenvolvimento de Website com ASP.NET e SQL Server – Parte 5”

  1. Olá Raphael, gostaria de dar os meus parabéns.
    Estou começando a desenvolver em C#.
    Gostei do seu post.
    Muito sucesso rapaz

  2. Post bem detalhado e informativo, comecei a mexer com outras linguagens há pouco tempo e com certeza está página servirá como mais uma referência!

  3. Bastante explcativo e assim se torna muito mais fácil de aprender, grato pela cordialidade e por ter gasto seu tempo precioso e pela boa vontade em disponibilizar este conteúdo maravilhoso que com certeza agradará á todos da comu. Grande abraço e que Deus sempre lhes abençoe.

  4. Olá Raphael,

    Estou iniciando na linguagem, preciso de umas dicas.
    No Painel, foi utilizado a opção “<a href=" na master ,para chamar uma nova página.

    Como faço isso usando as classe Pagina do Entidades e na masterPage o controle, MenuControl1.Como faço para chamar uma nova página utilizando esta ferramenta.

    Atenciosamente,

    1. Ola Stenio. Sim, seria interessante. Mas eu particularmente prefiro dessa forma. Mas deixo anotado sua crítica e que sabe nos próximos artigos e adote essa idéia.

      Abraço

  5. a aplicaçao requer a base dados para funcionar era isso que pretendia para q a conseguisse por a correr e ver o seu funcionamento.

  6. olha massa d+ os tutoriais.. estou com um probleminha …
    na hora que meu site roda carrega a master page e não o login!!!

    sei que deu trbalho fazer o tutorial ,mas fica a dica sincera de que com video,nos “os confusos” rsss… ficariamos menos confusos.
    ta eu sei que o tutorial esta proticamente soletrado,mas ex é meu primeiro contato com asp net!

    aliás pq algumas vezes na master page fica um simbolo do cursor mostrando qe não posso tocar no designer?
    tive um problemao com isso…ao inserir o grid ele ficava em outro lugar,eu tentei arrastar e o cusror não deixava!!!

  7. Raphael,

    Ótimo trabalho, parabéns. Estou utilizando esse material para estudo e já esta rodando em minha maquina conectando ao banco Mysql, foi necessário pouco mudanças (ddl mysql e alteração da string de conexão.
    Porém quando eu publico na locaweb no endereço http://www.3sh.com.br/dueto é gerado o erro “Parser Error Message: Unknown server tag ‘userControl:Menu’.” se possível poderia ajudar ou dar o norte para resolução?

    Obrigado e novamente,parabéns pelo trabalho, esta sendo muito útil.

  8. Raphael ,bom dia.

    estou com um problema na aplicação ,

    Conversion failed when converting date and/or time from character string.

    nao estou conseguindo resolver, este topico. Pode ajudar?

    abraço

  9. galhardoro, pelo visto seu problema está sendo a conversão de uma variavel date para string.
    você está usando o método toString();

    ai vai um exemplo

    DateTime dataConvertida = DateTime.ParseExact(data, “yyyy-MM-dd”, null);
    MessageBox.Show(dataConvertida.ToString());

    e se for passar uma data para uma string usa

    string data = dataConvertida.toString();

    Abraços espero ter ajudado.

  10. Fala ae Raphael,

    Muito bom esse artigo hein, gostei bastante.
    Tive algumas dificuldades, mas achei as respostar nos comentatios e aí ficou tranquilo.

    Só passando para registrar meu elogio.

    Parabéns

    Abs.
    Isac.

  11. muito bom tutorial parabens!!
    usando esse projeto como ficaria para fazer uma pesquisa em um cadastro de produtos por palavra… ?
    ate listar o cadastro consegui! mas nao consegui mudar o modo da pesquisa.

  12. Raphael boa noite.
    Parabéns pelo tutorial.
    Eu goataria de saber, como faço para que um usuário tenha acesso a parte de “Gerenciar página” e outro tenha acesso a “Gerenciar usuários”. Seria possível?

    Obrigado.

    1. Ola Helton, tudo bem?
      Nesse caso você terá de implementar a parte de permissoes. Para cada parte do sistema no ato da criação do usuário você irá selecionar o que o usuário terá acesso.
      Quando o usuário logar no sistema deverá ser carregado as permissoes e desativar o que ele não tem acesso.
      Fui claro? Se ainda tiver dúvida é só falar que tento ser mais claro e detalhar um pouco mais claro.

  13. Olá Helton!
    Você vai precisar criar uma nova entidade Permissões para conter o que o usuário terá acesso.
    Assim, quando o usuário logar, você invocará a classe trazendo as permissões do usuário e aplica-las ao painel. É algo bem simples de implementar.

    Abraço!

  14. Raphael tenho uma duvida, como faço para aparecer a minha primeira master page(aquela que não está no painel) que nem você fez em uma das imagens ali encima em que você mostra todas informações alteradas sobre a empresa nesta master page, como faz??

    1. Olá Guilherme. Se entendi bem sua pergunta, a masterpage que perguntou, deverá estar na raiz do site. Essa é a primeira masterpage criada que no caso é do website. A segunda é a masterpage do painel de controle que deverá estar na pasta painel.
      Seria essa sua dúvida? Se sim, no hora de escolher a masterpage, selecione o projeto que a masterpage será exibida na lista a direita da janela “Select a Master Page”.

  15. Olá Raphael, muito bom mesmo o tutorial, estou iniciando no Asp.net e tive algumas dúvidas, agradeço a atenção.
    Como faço para colocar uma consulta usando mais de uma tabela para aparecer no gridview?
    Outra dúvida, é melhor usar o tipo de solução que vc demonstra aqui ou usar o entity framework?

    1. Obrigado! Ate onde sei não é possível exibir mais de uma tabela no GridView.
      Quanto a sua outra pergunta, depende muito. A forma que demonstro no artigo é o que se usa normalmente em qualquer projeto e independente da linguagem. O Entity Framework além de um excelente projeto é uma excelente alternativa que nos garante agilidade no desenvolvimento do projeto. Eu o utilizo em alguns projetos da mesma forma que utilizo a técnica aqui apresentada em outros. Fica a nosso cargo levantar a melhor solução.

      Espero ter esclarecido suas dúvidas.

      Abraço

  16. Raphael Cardoso!
    Excelente seu tutorial. Está bastante didático e esclarecedor. Fiz tudo conforme o tutorial e deu tudo certo, agora irei customizar conforme as minhas necessidades.

    Excelente! Parabéns!

    Abraços,

    Rafael Vale Lima

  17. Ola caro amigo. quero muito te agradecer seu tutorial me ajudou muito… pois estou desenvolvendo um sistema de pedido online aki para empresa… minha duvida é a seguinte, coloquei um textBox e um botao (cmdPesquisar) quero fazer o seguinte usando esse modelo de classe que vc passou no meu caso é cliente quero listar o cliente como alimentar o Grid e objectDataSource pelo metodo ListaCliente? lembrando que que é o mesmo metodo do usuario tirando somente a parte de autenticação e bla bla bla… de alterando os nomes do campos como alimentar o grid com o resultado.

    1. Willian, você precisa criar o método que irá listar os cliente, criar a página, adicionar o GridView, incluir um ObjectDataSource e vincula-lo ao GridView e configurar o ObjectDataSource informando o Assembly que contem as regras de negócio e o método que será utilizado. Dessa forma os clientes serão listados.
      A forma de realizar esse procedimento é o mesmo que o apresentado nas primeiras imagens do artigo.

      Fui claro? Qualquer outra dúvida, manda seu comentário que procuro detalhar mais.

      Abraço

  18. Ola Raphael… excelente seu tutorial aprendi demais com eles. Muito Obrigada!
    Agora abusando um pouco, eu gostaria de pedir sua ajuda.
    Continuando esse seu tutorial eu estou tentando inserir imagens por meio do BD também, para elas poderem ser gerenciadas futuramente. Como eu faço isso, estou quebrando um pouco a cabeça aqui, mas não consigo evoluir.
    Você poderia me ajudar?
    Ex: imagens de produtos da minha empresa.

    Agradeço sua dedicação e atenção.

  19. Poliana.. eu também ja usei muito esse excelente exemplo do raphael.. acabei até fazendo varias coisas diferentes usando os exemplos.. e inclusive uma galeria de imagens com banco de dados.. o que eu fiz foi o seguinte:

    Criei uma pagina chamada galeria, e Coloquei um campo de file upload do proprio asp.net, e no metodo que vc criar para fazer o upload para a pasta física.. voce usa o nome do upload + FileName, para pegar o nome do arquivo que foi postado no ato do upload. e com esse nome vc insere no campo do banco de dados. desta forma vc pode recuperar o nome da imagem que foi feita o upload para pasta fisica.. e ficando mais facil recuperar.. em um datalist, gridview onde vc queiser..

    usando..por exemplo, tenho um grid view que tem um campo imagem, onde o usuario seta em uma lista de imagens qual será a imagem principal.. ai eu coloco e mostro a imagem no grid view assim..

    <asp:Image ID="imgPrincipalGrid" runat="server" CssClass="img-polaroid" Height="50px" Width="50px" ImageAlign="Middle" ImageUrl='’ />

    * Usando esta forma.. e a mais simples.. e que eu mais uso..
    ** ImageUrl=”

    no campo : Container.DataItem, “Foto” –> e o nome do campo da tabela.. que contem o nome da imagem..

    no campo: String.Format(“fotos/{0}” –> eu concateno a pasta fisica onde esta as fotos.. com o nome que vem do banco..

    ai eu so populo o grid ou datalist.. com o componente de imagens do proprio asp.net..

    Salvar imagem em pasta fisica..

    private void SalvarImagem()
    {
    FileUpload1.SaveAs(“C:\Documents and Settings\Meus documentos\Visual Studio 2008\WebSites\ABA\Fotos” + FileUpload1.FileName);

    string connstring = (new Functions()).GeraString();
    SqlConnection conn = new SqlConnection(connstring);
    conn.Open();
    SqlCommand comm = new SqlCommand(“UPDATE TB_USER set nm_user='” + nm_user.Text + “‘, ql_foto='” + FileUpload1.FileName + “‘, conn);
    comm.ExecuteNonQuery();

    }

    Basicamente isso.. espero que tenha ajudado.. qualquer coisa.. mande um exemplo do seu codigo para eu ver.. o que vc tentou fazer.. Espero que eu tenha entendido sua duvida..

    Obrigado..

  20. ola raphael, certo eu segui seu tutorial fiz alguma modificações em questao de banco estou usando o mysql, tbm fiz algumas alterações, exemplo uso stored procedure, vou postar como ficou minha camada de negocio no pastebin no mais uso da mesma forma que vc nos explicou.. pois bem… eu ja consegui resolver com uma forma bem gambiarra sei que nao é o certo mais ja me atendeu, mais quero modificar para ficar de uma forma correta vamos la…ja fiz o dito e funcionou certinho inclui o grid o ObjectDataSource,
    oq eu quero é txtbox e um botao, ao digitar no txt e clicar no botao deve preencher o grid, eu sabendo isso farei a parte para exibir novamente todos os cliente

    link com o metodo ListaCliente http://pastebin.com/wNPcB2Ue

    link com a rotina do botao Pesquisar http://pastebin.com/9UZA2BYH

    Obrigado pela ajuda seu site está me ajudando muito
    ele agora é referencia para meus estudos e projetos

    Desde ja agradeço

  21. Raphael.. Desculpe amigo axo que nao estou sendo claro essa forma que eu postei nao é a gambiarra é a forma como eu axo que deveria acontercer, o jeito que eu fiz foi diferente do jeito que vc explicou. o metodo ListaCliente retorna um array acredito. Explemo lstCliente.ToArray(); eu fiz outro metodo que retorna um dataTable para o ObjectDataSource assim eu posso usar o metodo ExpressionFilter do grid para fazer a busca é essa a gambiarra que eu fiz pq cambiarra? pq pesquisar pesquisa exibe o resultado, soh que para listar todos os clientes novamente eu dou um refresh na pagina mostrando todos clientes de novo… mais eu gostaria de usar seu metodo retornando o array filtrar. desculpa.. axo que nao tava explicando direito.. assim abusando da sua boa vontade.. mais uma vez agradeço

    1. William, seguindo raciocínio do exemplo que dei e com base que você me exemplificou podemos fazer da seguinte forma.
      Configure o ObjectDataSource para que ele receba como parâmetro um valor passado por Session.
      Da seguinte forma:

      < asp:ObjectDataSource ID="objClientes" runat="server" SelectMethod="ListaClientes" TypeName="WebSite.Business.Clientes" >
      < SelectParameters >
      < asp:SessionParameter Name="clientes" SessionField="cliente" Type="Object" / >
      < /SelectParameters >
      < /asp:ObjectDataSource >

      Esse session recebera a entidade Clientes que conterá os dados da pesquisa e usaremos como criterio de filtragem.
      No botão de pesquisa faremos o seguinte. Instanciaremos a entidade Clientes, atribuiremos os valores necessários (no seu caso é o CNPJ e no meu foi Razão Social como exemplo) e criaremos o Session atribuindo o objeto como no exemplo abaixo.

      protected void btnPesquisar_Click(object sender, EventArgs e)
      {
      WebSite.Entities.Clientes cliente = new WebSite.Entities.Clientes();
      cliente.RazaoRocial = txtNome.Text;

      Session.Remove("cliente");

      if (txtNome.Text.Length > 0)
      {
      Session.Add("cliente", cliente);
      }

      gridClientes.DataBind();
      }

      Dessa forma, o método receberá o parâmetro e fará a filtragem.
      Quando quisermos trazer todos os valores, basta remover o Session e dar um DataBind() no grid novamente.

      Fui claro? Espero que lhe ajude.
      Precisando ou tendo outra dúvida deixe seu comentário.

      Abraço

  22. Muito obrigado amigo me ajudou muito eh isso mesmo… continue esse belo trabalho que vem desempenhando aqui no site. ta de parabens e desculpe ser um empecilho, obrigado mais uma vez

    1. Eu que agradeço William. As dúvidas e comentários ajudam e muito a complementar o conteúdo. Isso é muito importante principalmente ao iniciantes.
      Sinta-se a vontade de comentar e perguntar. Não é empecilho algum.

      Bom estudo!

  23. Ola Raphael,

    Parabens pelo curso… muito bom.
    Veja se consegue me ajudar com a seguinte situação:
    1) Cadastrei um usuario no sistema mais não consigo efetuar o login por ele.
    2) A instrução que o programa roda esta assim:
    select * from usuarios where 1 = 1
    and login_usuario like ‘jean’
    and senha_usuario = ‘320BCDCE6AF79B5DEC8B698083AE6F82’
    3) Se eu rodar assim funciona:
    select * from usuarios where 1 = 1
    and login_usuario like ‘%jean%’
    and senha_usuario = ‘320BCDCE6AF79B5DEC8B698083AE6F82’

    Coloquei somente os % na consulta do login_usuario e funciona. Alguem tem alguma dica ?

    Obrigaduuu

  24. Raphael tambem não mostra nada.
    Pelo que vi o problema é o valor que fica no txtlogin que esta gravando um valor errado. Ja exclui o campo e inclui novamente e esta pegando sempre o mesmo valor.

  25. protected void btnSalvar_Click(object sender, EventArgs e)
    {
    int Id;
    int.TryParse(hdfId.Value, out Id);
    string Nome = txtNome.Text;
    string Email = txtEmail.Text;
    string Login = txtLogin.Text;
    string Senha = txtSenha.Text;
    bool Ativo = chkAtivo.Checked;
    bool Admin = chkAdmin.Checked;
    bool Operador = ChkOperador.Checked;
    bool Supervisor = ChkSupervisor.Checked;
    bool Gerenciador = ChkGerenciador.Checked;

    Usuarios usuario = new Usuarios();
    usuario.Id = Id;
    usuario.Nome = Nome;
    usuario.Email = Email;
    usuario.Login = Login;
    usuario.Senha = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(Senha, “MD5”);
    usuario.Ativo = Ativo;
    usuario.Admin = Admin;
    usuario.Operador = Operador;
    usuario.Supervisor = Supervisor;
    usuario.Gerenciador = Gerenciador;

    UsuariosBO usuariosBO = new UsuariosBO();
    bool Salvou = usuariosBO.SalvaUsuario(usuario);

    if (Salvou)
    {
    Response.Redirect(“gerenciar_usuario.aspx”);
    }
    }

  26. Olá Raphael…
    Terminei minha aplicação assim como esta no seu site… funcionou completamente, porem no momento adicionei uma nova tabela no meu banco de dados chamada Cliente, criei as classes cliente no WebSite.Entities e no WebSite.Business, esta tudo correto,alem de criar as cliente.aspx no WebSite tudo conforme o seu exemplo – porem quando vou rodar a aplicação na classe connection do WebSite.Data apresenta o seguinte erro na parte

    SqlCommand command = new SqlCommand();
    command.Connection = this.Conexao;
    command.CommandText = sql;
    int result = command.ExecuteNonQuery(); – erro de sintaxe mais não consigo achar esse erro. se vc puder me auxiliar Agradeço….

    Muito obrigado….!!!!

  27. Raphael eu revisei todo meu código Query SQL porem continua apresentando esse erro.
    veja como criei os códigos.
    if (cliente != null)
    {
    sqlString.AppendLine(“where 1 = 1”);

    if (cliente.IdClientes > 0)
    {
    sqlString.AppendLine(“and id_clientes = ” + cliente.IdClientes + “”);
    }

    if (!string.IsNullOrEmpty(cliente.Nome) && cliente.Nome.Length > 0)
    {
    sqlString.AppendLine(“and Nome_clientes like ‘” + cliente.Nome.Replace(“‘”, “””) + “‘”);
    }

    if (!string.IsNullOrEmpty(cliente.Endereco) && cliente.Endereco.Length > 0)
    {
    sqlString.AppendLine(“and enderecoe_clientes like ‘” + cliente.Endereco + “‘”);
    }
    }

    IDataReader reader = connection.RetornaDados(sqlString.ToString());

    int idxIdCliente = reader.GetOrdinal(“ID_CLIENTES”);
    int idxNome = reader.GetOrdinal(“NOME_CLIENTES”);
    int idxEndereco = reader.GetOrdinal(“ENDERECO_CLIENTES”);
    int idxTelefone = reader.GetOrdinal(“TELEFONE_CLIENTES”);
    int idxDataCriacao = reader.GetOrdinal(“DATACRIACAO_CLIENTES”);

    while (reader.Read())
    {
    Entities.Clientes _cliente = new Entities.Clientes();
    _cliente.IdClientes = reader.GetInt32(idxIdCliente);
    _cliente.Nome = reader.GetString(idxNome);
    _cliente.Endereco = reader.GetString(idxEndereco);
    _cliente.Telefone = reader.GetString(idxTelefone);
    _cliente.DataCriacao = reader.GetDateTime(idxDataCriacao);

    lstCliente.Add(_cliente);
    }

    connection.FechaConexao();

    return lstCliente.ToArray();
    }

    public bool SalvaCliente(Entities.Clientes clientes)
    {
    bool salvou = false;

    if (clientes != null)
    {
    Data.Connection connection = new Data.Connection(this.ConnectionString);
    connection.AbrirConexao();

    StringBuilder sqlString = new StringBuilder();

    if (clientes.IdClientes > 0 )
    {
    sqlString.AppendLine(“update clientes set”);
    sqlString.AppendLine(“nome_clientes = ‘” + clientes.Nome.Replace(“‘”, “””) + “‘,”);
    sqlString.AppendLine(“endereco_clientes = ‘” + clientes.Endereco.Replace(“‘”, “””) + “‘,”);
    sqlString.AppendLine(“telefone_clientes = ‘” + clientes.Telefone.Replace(“‘”, “””) + “‘,”);
    sqlString.AppendLine(“where id_clientes = ” + clientes.IdClientes + “”);
    }
    else
    {
    sqlString.AppendLine(“insert into clientes(nome_clientes,endereco_clientes,datacriacao_clientes,telefone_clientes)”);
    sqlString.AppendLine(“values(‘” + clientes.Nome.Replace(“‘”, “””) + “‘, ‘” + clientes.Endereco.Replace(“‘”, “””)
    + “‘, GETDATE(), ” + clientes.Telefone.Replace(“‘”, “””));
    }

    int i = connection.ExecutaComando(sqlString.ToString());
    salvou = i > 0;

    connection.FechaConexao();
    }

    return salvou;
    }

    1. Thalita, analisando seu código, não vi nenhum problema nele. Qual é o erro apresentado? Passe o erro completo.
      Um jeito de verificar se exite algum problema, é você debugar. Coloque um Breakpoint na linha que retorna o IDataReader, quando a execução chegar naquele ponto, pegue a query SQL gerada e execute diretamente no SQL Manager. Assim você conseguirá ver onde está ocorrendo o erro de sintaxe.

  28. Olá Raphael!
    Bom o problema é o seguinte…Quando testo e clico na aba cadastrar novo cliente aparece a tela de cadastros então quando clico pra salvar o cadastro ele nem passa pela pagina cliente que contem o IDataReader ele ja aparece o erro de sintaxe antes de entrar no comando SQL.

    veja o seguinte erro:

    SqlException was unhandled by user code
    Incorrect syntax near ‘,’

    Porem antes de adicionar a tabela de clientes não estava apresentando esse erro…

    Valew…. Obrigado me ajudar…

  29. Oi Raphael encontrei o meu erro…. realmente era na estrutura do meu select…..
    Obrigadão mesmo….

    mais to com um outro problema quando tirei essa virgula que mencionei nos comentarios anteriores deu um erro {“Referência de objeto não definida para uma instância de um objeto.”} System.Exception {System.NullReferenceException}, porem todos os objetos que criei declarei….

    Esse erro pode ocorrer por causa da estrutura da minha tabela no banco de dados? ou pode ocorrer no meu comando no ASP.NET?

    1. Olá Thalita, que bom que deu certo.
      Sobre o erro de Referencia, ele não está relacionado a suas tabelas e nem banco de dados. Esse erro está relacionado a um objeto que se encontra NULO e que você tentou acessar suas propriedades e/ou métodos.
      Quando tentamos acessar as propriedades e/ou métodos de um objeto NULO é acionado o System.NullReferenceException.
      Revise seu código em busca desse problema. Normalmente ao ocorrer o exception, a linha referente a ele é destacada.

  30. Ola Raphael…

    Gostaria da sua ajuda novamente. Estou tentando publicar esse Website mas não estou conseguindo.
    Como mudei recentemente para o Visual Studio 2012, na verdade não estou achando nem está opção para publicar. Não sei se eu fiz alguma coisa errada no projeto, ou se estou cega mesmo e não estou achando (rsrsrs).
    Será que você poderia me ajudar com isso. Como faço para publicar este projeto?

    Obrigada.

  31. Fala Raphael, cara, seu projeto realmente excelente!
    Porém preciso de uma “ajudinha”.. kkk…
    Vamos lá, minha grande dificuldade está sendo na criação da lista na business. O que acontece é que vou ter cerca de 10 tabelas bem grandes, com cerca de 30 campos cada, então pra escrever o código é bem penoso, existe uma forma de melhorar isso? Tipo automatiza como a SP que você fez para gerar as entities?

    Sei que pode parecer preguiça, mas isso acaba sendo um pé no saco quando se tem muitas tabelas, que é o meu caso.

    Ah, mais uma vez parabéns pelo trabalho!

  32. Olá Luiz. Sim, realmente é tedioso demais.
    Você mesmo pode criar um script para automatizar a criação.
    Mais seria um pouco trabalhoso fazer isso e depois de qualquer forma você precisaria dar manutenção.
    Quer uma solução melhor, estude sobre o NHibernate e o Fluent NHibernate ou Entity Framework. Acredito que eles serão as peças ideias para seus projetos.

  33. Fala Raphael!
    Só mais uma dúvida, trabalho com MySQL, usando o Entity Framework terei alguma dificuldade?

    Cara, muito obrigado pela atenção!!!

    1. Luiz, a principio não. Tudo depende da versão do Entity Framework e MySql Connector que você irá utilizar.
      Recentemente fiz um trabalho usando Visual Studio 2010, Framework 3.5, MySql 5.1 e MySql Connector 6.6.4 e não tive nenhum problema.

  34. E ae Raphael!

    Estou tendo uma base desse seu desenvolvimento para meu projeto de TCC (trabalho de conclusão de curso) porque achei inovador e interessante.

    Caso me obriguem a apresentar esse WebSite que estou desenvolvendo feito em C# e Asp.NET em um Computador (que já contem o Banco de Dados SQL Server 2008). Quais são os requisitos mínimos de softwares para que execute com êxito esse meu projeto caso na hora não contenha o Microsoft Visual Studio (em nenhuma das quaisquer versões)?

    Grato.

    1. Olá Igor

      Você precisará de um computador com IIS, Microsoft .NET Framework 3.5, SQL Server 2008 (Pode ser versão Express).
      Faça um teste para não ter surpresas. Crie um maquina Virtual com Windows e configure-a como se você fosse fazer a apresentação.
      Assim se tiver algum problema, poderá pesquisar e tirar dúvidas se for preciso.

      Abraço e boa sorte.

  35. Olá raphael,obrigado por comrpartilhar seus conhecimentos.
    Alterei os atributos da classe usuário e ao fazer cadastro de novos usuários o Visual Studio retornou o seguinte erro “System.Data.SqlClient.SqlException Incorect Syntax near 1”
    Como corigir esse erro?

    Desde já obrigado pela atenção.

  36. E ae Raphael ,resolvi o erro,estava no SQL,vlw.
    Mas estou com outra dúvida, qual é a melhor maneira de se proceder para retornar na consulta de login e senha um outro campo do banco(bool).Ex: Verificar o valor desse campo, para ao logar redirecionar para uma página especifica se o valor for verdadeiro.
    Desde já obrigado.

  37. Olá Raphael,vou me explicar melhor.
    Como seria para na consulta de verificação de login e senha, fosse verificado também outro campo(que seria um bool).No caso, se no login do usuario esse campo retornar verdadeiro seria redirecionado para uma determinada pagina, senao seria para outra.

    1. Olá Spina, você pode ao invés de retornar um bool no método de login, pode retornar um outro Objeto. Por exemplo, criar um objeto “DadosAutenticacao” e nele conter informações importantes como o que citou.

  38. Olá Raphael, boa noite!

    Estou iniciando meus estudos em .NET e caiu com uma luva este seu projeto.

    Meus Parabéns, pelo POST e muito sucesso!

  39. Bom Dia Raphael…

    Preciso urgentemente da sua ajuda mais uma vez.
    Eu estou tentando fazer o seguinte:

    No cadastro de uma nova página, eu gostaria de guardar o ID do usuário que está gerando essa nova página. Assim como também, caso essa página for alterada futuramente, guardar o ID do usuário que está fazendo essa alteração.
    Isso tudo apenas “por debaixo dos panos” diriamos assim. Por Favor, como posso fazer isso… HELP ME!!!

    Obrigada.

    1. Olá Poliana
      Na entidade Paginas, você vai precisar criar uma nova propriedade para que possa passar o usuário e com isso no método de gravar recuperar esse usuário, pegar o ID dele e armazenar no banco. Ou talvez seja interessante armazenar diretamente o nome do usuário. Isso fica a seu critério.
      Nesse caso realmente ficará “por baixo dos panos” como falou, ou seja, é somente uma informação para o próprio sistema e o usuário não terá acesso para editar ou visualizar. Somente caso necessite disponibilizar para que o administrador possa visualizar.

  40. Ola Raphael obrigado por estar me ajudando novamente.
    No caso eu criei dois novos campos no Entities (IdInclusao e IdAlteracao),como FK, não sei se fiz o correto.
    E meu problema realmente está sendo pegar o ID desse usuário logado na hora de gravar e depois para alterar.
    Será que tem como você me dar um exemplo, para eu entender melhor.

    1. Poliana, quando o usuário loga no sistema, você está guardando alguma informação sobre ele na Session do ASP.NET? Se sim, basta recupera-la para gravar. Senão, terá de guardar por exemplo o ID ou o nome ou qualquer outra informação que necessitar para recuperar posteriormente e gravar.

  41. Olá Raphael! Parabéns pelo Projeto ficou excelente!! Eu consegui concluir todas as partes, mas por incrível que pareça eu não consigo corrigir um problema no menu de todas as páginas. O que acontece: a pagina só está formatando os menus que vëm da lista do banco de dados, os que estão fixos no html, por exemplo: Gerenciar Páginas
    Gerenciar Usuários
    Sair o CSS nao está formatando. Vocë consegue me ajudar?
    Obrigado.

  42. Olá Raphael, talvez não tenho sido claro nas minhas duvidas, mas não tenho tido sucesso nas respostas…vai mais uma se poder me atender. Seguinte estou tentando fazer um cadastro com 3 tabelas diferentes…(permissionario, linha e linhaperm), uma dependendo da outra, usei um gridview1 e detailview e inerjoin para comandos inserção, update e etc, uma quarta tabela(4 campos e uma estrangeira de linhaperm) entraria nesse processo(gridview2), quero que quando selecionar um registro no detailview, podesse fixar a chave estrangeira para cadastro dos dados nessa gridview somente daquela chave…??

  43. Raphael, a duvida é quando selecionar um permissionário na detailview, depois inserir em uma tabela(gridview2), dados somente daquele permissionário selecionado, uma forma de fixar o id do permissionário selecionado na hora da inserção da tabela linhaperm(gridview2).
    idperm: 11
    (primeira linha da grid)
    secao: são paulo
    km: 230
    tempo: 1:50
    (segunda linha da grid)
    secao: barretos
    km: 120
    tempo: 2:30
    dai por diante, sem precisar ficar digitando o idperm..entende, uma vez que tá selecionado na listview e é chave estrangeira em linhaperm

  44. Boa tarde Rafael!

    Estou com o seguinte erro: “The type or namespace name ‘CKEditor’ could not be found in the global namespace (are you missing an assembly reference?)”

    Na linha: protected global::CKEditor.NET.ckeditorcontrol txtTexto;

    O que pode ser?

    Abraço!

  45. Valeu rafael deu certo aqui…mas agora todo web form ou webcontrol que crio da o erro abaixo ao executar…

    Line 1:
    Line 2:
    Line 3:

    o que pode ser ??

  46. Raphael, estava desenvolvendo normal meu projeto usando vsultimate 2010, com c# e depois de desenvolver vários webforms, webcontrols e algumas classes, parou de funcionar, só funcionar se alterar no cabeçalho de CODEHIND, para CODEFILE e não acha mais meus webcontrols, tem alguma sugestão ?? Obs: o erro mais acima que citei erra isso !?

  47. Raphael, blz ? Preciso de uma dica para validar um campo null, no webcontrol, o cadastro funciona beleza, mas se deixo o textbox em branco da erro !

  48. Bom dia!

    Raphael fiz tudo como está no tutorial passo a passo no VS2008 e no VS2012, mas infelismente nao consigo de maneira nenhuma fazer com que o CKEditor funcione, teria algo que poderia estar fazendo de errado? Sou novo em programação web, eu nao entendi muito bem como devo incluir esse controle na aplicação.
    e qual dos dois devo colocar.

    Att.
    Tiago

    1. Olá Tiago, Você fez download do CKEditor for ASP.NET? Quando você faz o download, o arquivo zip tem o assembly do CKEditor e outros arquivos.
      Para facilidade, faça download novamente da versão mais recente, “CKEditor 3.6.4 for ASP.NET”, descompacte o arquivo. Conterá uma pasta _Samples e nela terá uma pasta com o nome “ckeditor”. Copie essa pasta para o seu projeto e inclua o assembly do CKEditor que está na pasta “bin”.
      Se você realizar esse procedimento corretamente e seguir o tutorial, não tem erro.

      Comenta para nós como foi o resultado.

      Abraço

  49. Raphael deu certinho!!!!

    Obrigado pela ajuda vou dar mais uma brincadinha agora pra me aprofundar no aprimoramento.

    Parabens pelos tutoriais!

    Abraço.

  50. Raphael,

    Segui seu tutorial e deu muito certo, ficou ótimo.

    Agora eu gostaria de fazer algo um pouco mais avançado e talvez você possa me ajudar.

    Meu objetivo é desenvolver “módulos”, para exibir alguns dados (como por exemplo notícias, formulário de contato, etc)

    Imagino que User Controls possam atender minha necessidade, por exemplo:

    O usuário do CMS, quando for criar páginas, possa fazer o upload de algum user control, com seu devido css, para que este user control seja utilizado na página que ele esta criando. No código html da página que ele está cadastrando, ele utilizaria uma tag especial (Ex.: $noticias) e essa tag, na hora de montar a página buscaria o user control que ele fez upload e o exibiria ali.

    Existe essa possibilidade? Existe alguma maneira melhor de se fazer isso?

    Aguardo seu contato.

    Abrção e parabéns!

    1. Olá Ariel. Fico feliz que esteja evoluindo com a ajuda desse artigo.
      Bom, as sua ideia é possível. Mais você acha que o usuário terá um nível de conhecimento avançado ao ponto de criar um UserControl utilizando as API do seu CMS?
      Talvez seja interessante você criar vários UserControls com funcionalidades variadas e dar a possibilidade de ele escolher o que usar da forma que você comentou.
      Essa é a ideia que tenho e que eu faria. De qualquer forma, a sua ideia também é muito bom e funciona sim. Um exemplo disso é o funcionamento do BlogEngine.NET.

      Abraço

  51. É uma idéia mais para facilitar minha vida mesmo, e mais por curiosidade.

    Existe algum tutorial sobre isso por aí?

    Estou rodando a internet e não acho naaaaaada!

    Abração!

    1. Olá Ariel, que eu conheço não tem. Isso é já uma programação mais avançada e acaba sendo mais difícil de achar. Talvez você encontre referências em Inglês.
      Talvez seja interessante você estudar o BlogEngine.NET e ver como ele funcione. Acredito que isso irá enriquecer seu conhecimento.
      Visite o site do projeto http://www.dotnetblogengine.net

      Abraço

  52. Olá Raphael!! Segui seu tutorial fiz tudo certinho, gostei mesmo, mas estou precisando colocar uma sistema de login para um projeto que estou fazendo e quero saber como faço para colocar logins com diferentes tipos de acesso(Ex:prof, aluno, funcionário…) para entrar no site? obg

Os comentários estão fechados.