Paginacao no DataList

26/08/2014

Ola galera estou tentando criar uma paginacao no datalist para limitar o tamanho da pagina porem estou tentando fazer a paginacao e nao esta dando certo da este erro:

Não é possível converter um objeto do tipo 'System.Data.DataRowView' no tipo 'maos.DAO.SERVICO'.

nesta linha:
   ((Label)e.Item.FindControl("lblProfissional")).Text = ((SERVICO)e.Item.DataItem).TIPOPROFISSIONAL.descTipoProf; 


Minha oaginação esta assim o codigo galera mas nao sei o que esta errado.

   //paginacao do datalist
        protected void ListarDados(string tipo)
        {
            int tamPagina = 5;
            int regInicio = 0;

            if (ViewState["regInicio"] != null)
            { regInicio = (int)ViewState["regInicio"]; }

            if (tipo == "proximo")
            { regInicio += tamPagina; }
            else if (tipo == "anterior")
            { regInicio -= tamPagina; }

            if (regInicio < 0)
            { regInicio = 0; }

            SqlConnection con = new SqlConnection(@"Data Source=DEVALDO-PC\SQLDELIVERY;Initial Catalog=maosObra;Integrated Security=True");
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "SELECT TIPOPROFISSIONAL.descTipoProf, SERVICO.codServico, SERVICO.responsavel, SERVICO.cidade, SERVICO.tipoServico, SERVICO.foneContato, SERVICO.email, "
                + "SERVICO.descricao, SERVICO.dataCadastro FROM     SERVICO INNER JOIN TIPOPROFISSIONAL ON SERVICO.codTipoprof = TIPOPROFISSIONAL.codTipoProf";

            SqlDataAdapter da = new SqlDataAdapter(cmd.CommandText, con);
            DataTable dt = new DataTable();

            da.Fill(regInicio, tamPagina, dt);

            if (tipo == "proximo" && dt.Rows.Count == 0 && regInicio > 0)
            {
                regInicio -= tamPagina;
                da.Fill(regInicio, tamPagina, dt);
            }

            dtlServicos.DataSource = dt;
            dtlServicos.DataBind();

            ViewState.Add("regInicio", regInicio);
        }

        protected void lnkPrevious_Click(object sender, EventArgs e)
        {
            ListarDados("anterior");
        }

        protected void lnkNext_Click(object sender, EventArgs e)
        {
            ListarDados("proximo");
        }


O meu html esta assim:

   <FooterTemplate>
                <asp:LinkButton ID="lnkPrevious" runat="server" ><< Anterior</asp:LinkButton>
                <asp:LinkButton ID="lnkNext" runat="server" >Próximo >></asp:LinkButton>
            </FooterTemplate>


Alguem sabe como faço para resolver este erro?

Grato DeliveryTI.

Delivery-ti

Melhor resposta

04/10/2014

Amigo, o código que está entre as linhas 14 e 28 pode ser reduzido para o seguinte:
if (((Label)e.Item.FindControl("lblProfissional")).Text != null)
{
	((Image)e.Item.FindControl("imgServ")).ImageUrl = "~/images/"+((Label)e.Item.FindControl("lblProfissional")).Text+".jpg";
}

Substitua aí, por favor, e veja se funciona. Não resolve seu problema, mas já limpa um pouco o código.

Joel Rodrigues

Responder Citar

Outras Respostas

02/09/2014

Joel Rodrigues

Como você está atribuindo os dados a este DataList? Está ligando a um DataSet, DataTable, List, o que?
Responder Citar

03/09/2014

Alisson

Amigo boa noite, se não me engano essa funcionalidade já existe nos componentes do ASP.Net, a unica coisa que tem que fazer é utilizar uma ligação de dataset com a tabela em questão que já está pronto.
Responder Citar

03/09/2014

Delivery-ti

Acho que nao cara o DataList nao tem tem o GridView o datalist tem que fazer na unha eu estou tentando mas esta com erro.
Responder Citar

03/09/2014

Delivery-ti

Aqui esta joel ele carrega os dados na minha view dessa maneira.

    protected void dtlProfissionais_ItemDataBound(object sender, DataListItemEventArgs e)
        {
            if (e.Item.ItemType != ListItemType.Header && e.Item.ItemType != ListItemType.Footer)
            {
                if (Session["cliente"] != null)
                {
                    ((Image)e.Item.FindControl("imgProf")).ImageUrl = "http://localhost:3719/Servicos/" + ((PROFISSIONAL)e.Item.DataItem).fotoProf1.ToString();

                    codProf = int.Parse(((Label)e.Item.FindControl("lblcodPr")).Text = ((PROFISSIONAL)e.Item.DataItem).codProfissional.ToString());
                    ((Label)e.Item.FindControl("lblnome")).Text = ((PROFISSIONAL)e.Item.DataItem).nomeProfissional;
                    ((Label)e.Item.FindControl("lblFonePr")).Text = ((PROFISSIONAL)e.Item.DataItem).foneProfissional;
                    ((Label)e.Item.FindControl("lblTipoProfi")).Text = ((PROFISSIONAL)e.Item.DataItem).TIPOPROFISSIONAL.descTipoProf;
                    ((Label)e.Item.FindControl("lblDesc")).Text = ((PROFISSIONAL)e.Item.DataItem).descProfissional;

                    if (profissional.reputacaoProfissional <= 5)
                    {
                        ((Label)e.Item.FindControl("lblReputacao")).Text = "Ruim";
                    }
                    if (profissional.reputacaoProfissional <= 50)
                    {
                        ((Label)e.Item.FindControl("lblReputacao")).Text = "Bom";
                    }
                    if (profissional.reputacaoProfissional <= 100)
                    {
                        ((Label)e.Item.FindControl("lblReputacao")).Text = "Exelente";
                    }
                    ((Button)e.Item.FindControl("btnAval")).Visible = true;
                }
                else {
                    ((Label)e.Item.FindControl("Label6")).Visible = false;
                    ((Label)e.Item.FindControl("lblFonePr")).Visible = false;

                    ((Image)e.Item.FindControl("imgProf")).ImageUrl = "http://localhost:3719/Servicos/" + ((PROFISSIONAL)e.Item.DataItem).fotoProf1.ToString();

                    ((Label)e.Item.FindControl("lblcodPr")).Text = ((PROFISSIONAL)e.Item.DataItem).codProfissional.ToString();
                    ((Label)e.Item.FindControl("lblnome")).Text = ((PROFISSIONAL)e.Item.DataItem).nomeProfissional;
                    ((Label)e.Item.FindControl("lblFonePr")).Text = ((PROFISSIONAL)e.Item.DataItem).foneProfissional;
                    ((Label)e.Item.FindControl("lblTipoProfi")).Text = ((PROFISSIONAL)e.Item.DataItem).TIPOPROFISSIONAL.descTipoProf;
                    ((Label)e.Item.FindControl("lblDesc")).Text = ((PROFISSIONAL)e.Item.DataItem).descProfissional;

                    
                    if (profissional.reputacaoProfissional <= 5)
                    {
                        ((Label)e.Item.FindControl("lblReputacao")).Text = "Ruim";
                    }
                    if (profissional.reputacaoProfissional <= 50)
                    {
                        ((Label)e.Item.FindControl("lblReputacao")).Text = "Bom";
                    }
                    if (profissional.reputacaoProfissional <= 100)
                    {
                        ((Label)e.Item.FindControl("lblReputacao")).Text = "Exelente";
            }
        }


Bem joel esta dessa forma que eu sei fazer e sei tambem que tem o dataBind mas assim acho mlehor, porem nao sei fazer a paginao cara e preciso pois se nao minha pagina nao vai ter fim quando mais profissionais for se cadastrando no site mais ele vai crescendo porque ele esta mostrando tudo em uma unica pagina, quero colocar um limite e paginar tem como da uma ajudinha.

Grato Miller.
Responder Citar

15/09/2014

Delivery-ti

Galera estou tentando seguir um post aqui que o Fabio me indicou porem percebi que varios post os caras utilizam o datalist porem com uma tabela no meio eu como podem ver no codigo nao trabalho dessa forma e sim com ItemTemplate e AlternateItemTemplate, e estou tentando fazer a paginação mais uma vez e esta dando um erro.

Aqui esta o codigo:
   protected void Page_Load(object sender, EventArgs e)
        {
            lblValSearch.Visible = false;

            if (!IsPostBack)
            {
                txtSearch.Attributes.Add("data-marcadagua", "Cidade, nome ou tipo de Profissional...");

                if (Request.QueryString["profissional"] != null)
                {
                    idProfissional = int.Parse(Request.QueryString["profissional"].ToString());
                }
                BuscarProfissionais();
            }

            //criando a paginacao dos profissionais
            if (!IsPostBack)
            {
                this.ViewState["vs"] = 0;
            }
            pos = (int)this.ViewState["vs"];
            databind();
            
        }

    public void databind()
        {
            datadapter = new SqlDataAdapter("SELECT * FROM PROFISSIONAL", constring);
            dset = new DataSet();
            adsource = new PagedDataSource();
            datadapter.Fill(dset);
            adsource.DataSource = dset.Tables[0].DefaultView;
            adsource.PageSize = 3;
            adsource.AllowPaging = true;
            adsource.CurrentPageIndex = pos;
            btnFirst.Enabled = !adsource.IsFirstPage;
            btnNext.Enabled = !adsource.IsLastPage;
            dtlProfissionais.DataSource = adsource;
            dtlProfissionais.DataBind();
        }

        protected void btnPrev_Click(object sender, EventArgs e)
        {
            pos = (int)this.ViewState["vs"];
            pos -= 1;
            this.ViewState["vs"] = pos;
            databind();
        }

        protected void btnNext_Click(object sender, EventArgs e)
        {
            pos = (int)this.ViewState["vs"];
            pos += 1;
            this.ViewState["vs"] = pos;
        }


bem galera esta dessa maneira meu codigo segui o post e ele da erro nessa linha (datadapter.Fill(dset);)
com esta mensagem no erro:

Erro de rede ou específico à instância ao estabelecer conexão com o SQL Server. O servidor não foi encontrado ou não estava acessível. Verifique se o nome da instância está correto e se o SQL Server está configurado para permitir conexões remotas. (provider: Named Pipes Provider, error: 40 - Não foi possível abrir uma conexão com o SQL Server)


Grato Miller.
Responder Citar

23/09/2014

Delivery-ti

Galera estou fazendo aqui a paginação e estou quase conseguindo porem quando eu clico no proximo ele nao esta trazendo as outras informações Alguem pode dar uma olhada no meu codigo e ajudar por favor.
Outra coisa reparem que nos dois primeiros dados que pego eles vem de tabelas que estao ligadas por FK, porem eu nao sei como trazer ele eu coloquei como podem ver no codigo abaixo mas sai ficou dando erro falando que esses objetos nao existem na minha tabela que consulto, ai peguei e comentei so pra testar se esta trazendo os dados.

Aqui é meu DataList galera:
   <asp:DataList ID="dtlServicos" runat="server" CssClass="dataServ" 
            RepeatColumns="2" >
            <ItemTemplate>
                <fieldset class="filServ">
                    <p class="text_serv1">
                      <div class="txtServ">
                        <asp:Image ID="imgServ" runat="server" ImageUrl="#" Height="171px" Width="120px" class="ftServ" Border="0" />
                        
                        <%--<%#Eval("codTipoProfissional")%>--%>     // aqui que nao sei como pegar a descricao pois ele vem de outra tabela 
                        <asp:Label ID="lblCodC" CssClass="codCli" runat="server" Text="Cod:" />
                        <%--<%#Eval("codCliente")%>--%><br/>         // aqui tambem galera o dado esta em outra tabela nao sei como pegar
                        
                        <div class="rpServ">
                          <asp:Label ID="Label1" runat="server" CssClass="labels" Text="Resp.:" />
                          <%#Eval("responsavel") %>
                        </div>
                        <div class="cddServ">
                           <asp:Label ID="Label7" runat="server" CssClass="labels" Text="Cidade:" />
                           <%#Eval("cidade") %>
                       </div><br/>
                        <div class="contS">
                            <asp:Label ID="lblFone" runat="server" CssClass="labels" Text="Fone:" />
                            <%#Eval("foneContato") %>
                        </div><br/>
                        <div class="emServ">
                        <asp:Label ID="lblMail" runat="server" CssClass="labels" Text="Email:" />
                        <%#Eval("email") %>
                        </div><br />
                        <div class="divTrab">
                           <asp:Label ID="lbl3" runat="server" CssClass="labels" Text="Trabalho:" />
                           <%#Eval("tipoServico") %>
                        </div>
                        <div class="divDes">
                           <asp:Label ID="Label3" runat="server" CssClass="labels" Text="Descrição:" />
                           <%#Eval("descricao") %>
                        </div>
                        <div class="dataC">
                           <asp:Label ID="Label5" runat="server" CssClass="labels" Text="Data Cadastro:" />
                           <%#Eval("dataCadastro") %>
                        </div>
                     </div>
                  </p>
                </fieldset>
            </ItemTemplate>
            <FooterTemplate>
                <asp:LinkButton ID="lnkPrevious" runat="server" CssClass="anter"><< Anterior</asp:LinkButton>
                <asp:LinkButton ID="lnkNext" runat="server" CssClass="prox">Próximo >></asp:LinkButton>
            </FooterTemplate>
        </asp:DataList>


Bem galera agora para mostrar como esta minha paginação tenho o codigo do CodBehid:

  protected void ListarDados(string tipo)
        {
            int tamPagina = 4;
            int regInicio = 0;

            if (ViewState["regInicio"] != null)
            { regInicio = (int)ViewState["regInicio"]; }

            if (tipo == "proximo")
            { regInicio += tamPagina; }
            else if (tipo == "anterior")
            { regInicio -= tamPagina; }

            if (regInicio < 0)
            { regInicio = 0; }

            SqlConnection con = new SqlConnection(@"Data Source=DEVALDO-PC\SQLDELIVERY;Initial Catalog=maosObra;Integrated Security=True");
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandText = "SELECT TIPOPROFISSIONAL.descTipoProf, SERVICO.codServico, SERVICO.responsavel, SERVICO.cidade, SERVICO.tipoServico, SERVICO.foneContato, SERVICO.email, "
                + "SERVICO.descricao, SERVICO.dataCadastro FROM SERVICO INNER JOIN TIPOPROFISSIONAL ON SERVICO.codTipoprof = TIPOPROFISSIONAL.codTipoProf";

            con.Open();
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;
            DataTable dt = new DataTable();

            da.Fill(regInicio, tamPagina, dt);

            if (tipo == "proximo" && dt.Rows.Count == 0 && regInicio > 0)
            {
                regInicio -= tamPagina;
                da.Fill(regInicio, tamPagina, dt);
            }

            dtlServicos.DataSource = dt;
            dtlServicos.DataBind();
            con.Close();

            ViewState.Add("regInicio", regInicio);
        }

        protected void lnkPrevious_Click(object sender, EventArgs e)
        {
            ListarDados("anterior");
        }

        protected void lnkNext_Click(object sender, EventArgs e)
        {
            ListarDados("proximo");
        }
    }


Por favor alguem pode ar uma força?
Responder Citar

24/09/2014

Delivery-ti

Galera a parte de como pegar o codigo do cliente arrumei e o codiTipoProf tambem porem eu tenho que trazer na verdade a descricao do tipo de profissional e estou tentando ainda mas se alguem souber como faço, ate tentei colocar no meu select assim:

select TIPOPROFISSIONAL.descTipoProf porem tenho que converter ele deu um erro agora dizendo que minha fk e um int e minha consulta retorna uma string.
Responder Citar

25/09/2014

Delivery-ti

Galera grato a todos que ajudou e deu dicas mas consegui resolver este problema.

Grato Miller.
Responder Citar

25/09/2014

Delivery-ti

Ola olha so como sao as coisas voce arruma uma coisa e se depara com outro problema kkk.

Galera o problema que eu estou agora acho que é mais simples pra quem ja trabalha ou trabalhou com essa propriedade EVAL.

Tenho que pegar um valor que esta em outra tabela e mostrar onde chamo meu EVAL assim:

  <asp:Label id="lblCodTipoProf" runat="server" Text='<%#Eval("descTipoProf")%>' />


porem nao consigo mostrar essa descricao de maneira alguma so consigo mostra se for o codigo do tipo profissional que esta na minha tabela SERVICO como chave estrangeira ai ele traz certinho galera.

 <asp:Label id="lblCodTipoProf" runat="server" Text='<%#Eval("codTipoProf")%>' />

assim ele traz do outro jeito nao, e eu preciso da descricao alguem sabe como fazer isso?

Grato Miller.
Responder Citar

30/09/2014

Delivery-ti

Joel como você solicitou estou postando aqui a uma duvida que estou tendo, na verdade nao sei o que esta acontecendo pois fiz uma validação dentro do meu DataList e ele nao esta aplicando a todos os dados que ele exibe, esta assim:

Olha só aqui é onde eu atribuo esta validação do meu datalist na verdade é somente esse dois dados dados que eu estou tentando esconder caso o cara nao esteja logado, e essas imagens abaixo aparece de acordo com o tipo de profissional.
    protected void dtlServicos_ItemDataBound(object sender, DataListItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item)
            {
                if (Session["profissional"] == null)
                {
                    ((Label)e.Item.FindControl("lbFone")).Text = null;
                    ((Label)e.Item.FindControl("lbContato")).Text = null;

                    ((Label)e.Item.FindControl("lblMail")).Text = null;
                    ((Label)e.Item.FindControl("lblEmailS")).Text = null;
                }

                if (((Label)e.Item.FindControl("lblProfissional")).Text != null)
                { ((Image)e.Item.FindControl("imgServ")).ImageUrl = "~/images/pedreiro.jpg"; }
                    else
                    if (((Label)e.Item.FindControl("lblProfissional")).Text == "Encanador")
                    { ((Image)e.Item.FindControl("imgServ")).ImageUrl = "~/images/encanador.jpg"; }
                    else
                        if (((Label)e.Item.FindControl("lblProfissional")).Text == "Eletricista")
                        { ((Image)e.Item.FindControl("imgServ")).ImageUrl = "~/images/eletricista.jpg"; }
                        else
                            if (((Label)e.Item.FindControl("lblProfissional")).Text == "Pintor")
                            { ((Image)e.Item.FindControl("imgServ")).ImageUrl = "~/images/pintor.jpg"; }
                            else
                                if (((Label)e.Item.FindControl("lblProfissional")).Text == "Marceneiro")
                                { ((Image)e.Item.FindControl("imgServ")).ImageUrl = "~/images/marceneiro.jpg"; }
                                else
                                    if (((Label)e.Item.FindControl("lblProfissional")).Text == "Jardineiro")
                                    { ((Image)e.Item.FindControl("imgServ")).ImageUrl = "~/images/jardineiro.jpg"; }
                                    else
                                        if (((Label)e.Item.FindControl("lblProfissional")).Text == "Gesseiro")
                                        { ((Image)e.Item.FindControl("imgServ")).ImageUrl = "~/images/gesseiro.jpg"; }
                                        else
                                            if (((Label)e.Item.FindControl("lblProfissional")).Text == "Cerralheiro")
                                            { ((Image)e.Item.FindControl("imgServ")).ImageUrl = "~/images/cerralheiro.jpg"; }

                }
        }


Porem galera ele esta alternando essa validação e as imagens também, por exemplo se eu tiver 4 linhas, ele atribui a validação e imagem corretamente, já na segunda não traz a imagem e nem aplica a validação e na terceira aplica e assim por diante, ou seja na verdade ele esta alternando minha validação e a imagem.

Olha na imagem:
[img:descricao=imagem do problema descrito acima]http://arquivo.devmedia.com.br/forum/imagem/335183-20140930-235719.png[/img]

Olha ai galera na imagem esta visível o problema mas eu também fiz uma marcação para vocês verem.

Grato Miller.
Responder Citar

02/10/2014

Delivery-ti

E ai galera alguem sabe o que pode ser este problema?
Responder Citar

03/10/2014

Delivery-ti

Poxa galera o forum esta fora de operação?
Responder Citar

04/10/2014

Delivery-ti

Nossa ótima otimização Joel resolveu sim .

Grato.Miller.
Responder Citar

22/10/2014

Delivery-ti

Galera obrigado pela força eu consegui resolver este problema dele alternar onde aparece os dados agora esta tudo certo.

Grato Miller.
Responder Citar

22/11/2014

Delivery-ti

Topico finalizado galera problema resolvido
Responder Citar