none
ListView com DropDownlist RRS feed

  • Pergunta

  • Srs., boa noite


    Estou tentando fazer um exemplo de um ListView com um DropDownlist dentro, para que na hora de inserir o usuario possa selecionar um dos nomes dentro do drop


    mas estou tendo alguns problemas a associar o datasource ao dropdownlist

    o erro e esse: Os métodos de ligação de dados como Eval(), XPath() e Bind() só podem ser usados no contexto de um controle limitado por dados.

    estou fazendo a ligação dessa maneira

    <asp:DropDownList  ID="ddlPrestador"
                                           DataSourceID="sqldsPrestadores"
                                           DataTextField="nome_prestador"
                                           DataValueField="id_prestador"                         
                                           
                                           SelectedValue='<%# Bind("id_prestador") %>'
                                           runat="server" /> 

    tmb tinha pego um outro exemplo na net pra mudar a maneira de passar SelectedValue dessa maneira

    SelectedValue='<%# DataBinder.Eval(Container.DataItem,"id_prestador") %>'

    mas tmb não deu certo apresentou esse erro

    não contem um definição para DataItem e enenhum metodo de extenção DataItem aceita queum primeiro argumento de tipo... etc

    Alguém já fez algo desta maneira ou tem algum exemplo que possa me ajudar ?

    Obrigado

    terça-feira, 14 de fevereiro de 2012 01:24

Respostas

  • consegui resolver o problema acima foi só mecher nas propriedades do ListView -> InsertItemPosition

    Mas agora estou com outro problema 'Referência de objeto não definida para uma instância de um objeto.'

    o metodo esta assim

    protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            ListViewItem item = e.Item;
            if (item.ItemType == ListViewItemType.DataItem)
            {
                DropDownList ddl = (DropDownList)item.FindControl("ddlPrestadores");
                //ddl.DataSource = ds.Tables["Prestadores"];
                ddl.DataSource = dt; //----------------------->> ele apresenta aqui o erro <<---------------------------
                ddl.DataTextField = "nome_prestador";
                ddl.DataValueField = "id_prestador";
                ddl.DataBind();
            }
        }

    antes esta até funcionando mais o meu dropdownlist estava sendo carregado no ItemTemplate, mas depois fui tentar mudar ele de lugar e colocar no InsertItemTemplate esta apresentando esse erro.

    Sera precisa de um outro tipo de evento diferente para popular os componente nesse modo InsertItemTemplate?

    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:10
    quarta-feira, 15 de fevereiro de 2012 13:26
  • if (item.ItemType == ListViewItemType.InsertItem)

    Tentei fazer dessa forma mas não deu certo, ele nem entra nessa condição porque o item.itemType retorna DataItem.

    humm..acredito que porque o evento seja o ItemCreated ao invés de ItemDataBound. VocÊ ta inserindo um dado correto?

    Rodrigo Reis Ferreira
    Microsoft Certified

    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:10
    quarta-feira, 15 de fevereiro de 2012 16:47

Todas as Respostas

  • Isso e meio chato mesmo, vc vai ter que fazer o load da drop dentro do envento databound na mão mesmo

    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC

    terça-feira, 14 de fevereiro de 2012 11:20
    Moderador
  • É um Listview mesmo ou um FormView?

    o dropdown esta dentro do template do seu ListView? Acredito que não faça muito sentido setar o valor do SelectedValue dessa forma pois ele responde ao evento do usuário e não deve ser preechido automaticamente pelo banco, como você ja setou o id_prestador no DataValueField basta capturar no code-behind o ddlPrestador.SelectedValue que ele vai retornar o id_prestador. Veja um exemplo:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ListViewDropDown.aspx.cs" Inherits="JQTest.ListViewDropDown" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
             <asp:ListView ID="ListView1" runat="server" OnItemDataBound="ListView1_ItemDataBound" > 
                <LayoutTemplate>
                    <asp:PlaceHolder ID="itemPlaceHolder" runat="server"/>
                </LayoutTemplate>   
                <ItemTemplate>
                    <table>
                        <tr>
                            <td>
                                <asp:DropDownList  ID="ddlPrestador"
                                               DataTextField="nomeFilme"
                                               DataValueField="idFilme"
                                               runat="server" />  
                            </td>
                        </tr>
                    </table>                                
                </ItemTemplate>                     
            </asp:ListView>
        </div>
        </form>
    </body>
    </html>
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;
    
    namespace JQTest
    {
        public partial class ListViewDropDown : System.Web.UI.Page
        {
            private DataTable mDataTable;
    
            protected void Page_Load(object sender, EventArgs e)
            {
                //Cria uma tabela com dados para teste
                CriarTabela();
                ListView1.DataSource = mDataTable;
                ListView1.DataBind();
            }
    
            protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
            {
                if (e.Item.ItemType == ListViewItemType.DataItem)
                {
                    DropDownList ddl = (DropDownList)e.Item.FindControl("ddlPrestador");
                    ddl.DataSource = mDataTable;
                    ddl.DataBind();
                }
            }
    
            private void CriarTabela()
            {
                mDataTable = new DataTable();
    
                #region Colunas
                DataColumn mDataColumn;
                mDataColumn = new DataColumn();
                mDataColumn.DataType = Type.GetType("System.String");
                mDataColumn.ColumnName = "idFilme";
                mDataTable.Columns.Add(mDataColumn);
    
                mDataColumn = new DataColumn();
                mDataColumn.DataType = Type.GetType("System.String");
                mDataColumn.ColumnName = "capaFilme";
                mDataTable.Columns.Add(mDataColumn);
    
                mDataColumn = new DataColumn();
                mDataColumn.DataType = Type.GetType("System.String");
                mDataColumn.ColumnName = "nomeFilme";
                mDataTable.Columns.Add(mDataColumn);
    
                mDataTable.PrimaryKey = new DataColumn[] { mDataColumn };
    
                #endregion
    
                //==================================
    
                DataRow linha;
                linha = mDataTable.NewRow();
    
                linha["idFilme"] = "1";
                linha["nomeFilme"] = "Transformers";
                linha["capaFilme"] = "imagens/transformers.jpg";
    
                mDataTable.Rows.Add(linha);
    
                linha = mDataTable.NewRow();
    
                linha["idFilme"] = "2";
                linha["nomeFilme"] = "Lanterna Verde";
                linha["capaFilme"] = "imagens/lanterna.jpg";
    
                mDataTable.Rows.Add(linha);
    
                linha = mDataTable.NewRow();
    
                linha["idFilme"] = "3";
                linha["nomeFilme"] = "Guia dos Mochileiros da Galáxia";
                linha["capaFilme"] = "imagens/guia.jpg";
    
                mDataTable.Rows.Add(linha);
    
            }
    
    
        }
    }

    Talvez eu não tenha entendido onde você quer chegar, se puder explicar com mais detalhes o contexto do problema talvez possamos chegar a uma solução. :)


    Rodrigo Reis Ferreira
    Microsoft Certified

    terça-feira, 14 de fevereiro de 2012 11:37
  • Opa, então seria um dropdownlist dentro do Listview

    Não sei usar mto bem os eventos dos componentes,  mas para que serve esse private void CriarTabela()??

    Serve para popular o ListView ou só o DropDownlist??


    No Caso do evento ItemDataBound como eu faria para jogar direto o DataSource do drop?
    terça-feira, 14 de fevereiro de 2012 11:53
  • Usei o CriarTabela apenas para popular os drops ja que estou sem um banco aqui pra testar. Como assim "jogar direto o DataSource do drop"?? Não entendi... :)

    Rodrigo Reis Ferreira
    Microsoft Certified

    terça-feira, 14 de fevereiro de 2012 12:06
  • Eu fiz..

    protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            if (e.Item.ItemType == ListViewItemType.DataItem)
            {
                using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))
                {
                    conn.Open();
                    string sQuery = "SELECT * FROM prestadores";
                    using (SqlDataAdapter adapt = new SqlDataAdapter(sQuery, conn))
                    {
                        DataTable dt = new DataTable("Prestadores");
                        adapt.Fill(dt);
                        
                        DropDownList ddl = (DropDownList)e.Item.FindControl("ddlPrestadores");
                        ddl.DataSource = dt;
                        ddl.DataTextField = "nome_prestador";
                        ddl.DataValueField = "id_prestador";
                        ddl.DataBind();
                    }        
                }            
            }
        }

    e na página .aspx como ficaria para o meu dropdownlist

    nesse caso eu não precisaria mais utilizar 'DataSourceID="sqldsPrestadores" ' já que estou criando um metodo para popular o dropdownlist correto ?

    <asp:DropDownList  ID="ddlPrestador"
                                           DataSourceID="sqldsPrestadores"
                                           DataTextField="nome_prestador"
                                           DataValueField="id_prestador"                                       
                                           
                                           SelectedValue='<%# Bind("id_prestador") %>'
                                           runat="server" />  

    terça-feira, 14 de fevereiro de 2012 12:30
  • Exatamente, do jeito que você está fazendo no code-behind, o drop no seu aspx se resumiria a isso:

    <asp:DropDownList  ID="ddlPrestador" runat="server" />   

    Eu faria apenas uma alteração no DataBound ai, como você usa o mesmo DataTable em todos os drops(de cada linha do ListView) é melhor você fazer o acesso ao banco apenas uma vez e guardar o DataTable em uma variável da classe.

    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))
    {
                    conn.Open();
                    string sQuery = "SELECT * FROM prestadores";
                    using (SqlDataAdapter adapt = new SqlDataAdapter(sQuery, conn))
                    {
                        DataTable dt = new DataTable("Prestadores");
                        adapt.Fill(dt);
                     }
    }
    Coloca essa chamada no seu Page_Load para fazer apenas uma vez( lembra de testar se é postback ou não Page.isPostBack). Se puder criar uma classe de acesso a dados e negócio seria melhor para não precisar usar esse código do banco todas as vezes.


    Rodrigo Reis Ferreira
    Microsoft Certified

    terça-feira, 14 de fevereiro de 2012 12:43
  • Fiz as alterações mais o dropdownlist continua vindo vazio.

    o code ficou assim:

    public partial class _Default : System.Web.UI.Page
    {
        DataTable dt = new DataTable("Prestadores");
        protected void Page_Load(object sender, EventArgs e)
        {
            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))
            {
                conn.Open();
                string sQuery = "SELECT * FROM prestadores";
                using (SqlDataAdapter adapt = new SqlDataAdapter(sQuery, conn))
                {
    //                DataTable dt = new DataTable("Prestadores");
                    adapt.Fill(dt);                
                }
            }
        }
       
        protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            if (e.Item.ItemType == ListViewItemType.DataItem)
            {
                DropDownList ddl = (DropDownList)e.Item.FindControl("ddlPrestadores");
                ddl.DataSource = dt;
                ddl.DataTextField = "nome_prestador";
                ddl.DataValueField = "id_prestador";
                ddl.DataBind();          
            }
        }
    }

    terça-feira, 14 de fevereiro de 2012 13:46
  • Coloque um breakpoint aqui:

     ddl.DataSource = dt;

    para ver se o dt esta vazio ou não.


    Rodrigo Reis Ferreira
    Microsoft Certified

    terça-feira, 14 de fevereiro de 2012 14:04
  • Descrobri o problema o evento ItemDataBound não estava apontando para o ListView..rs

    vlw, estou tentando criar um CRUD com o ListView qqer dúvida posterior eu posto aqui ai se vc muder me dar ajuda eu agradeço.

    terça-feira, 14 de fevereiro de 2012 14:34
  • Ajudo sim sem problemas. :) Sucesso!

    Rodrigo Reis Ferreira
    Microsoft Certified

    terça-feira, 14 de fevereiro de 2012 15:22
  • Como que eu faço para deixar o modo de inserção ativo no  listview

    tenho dois metodos um que popula o list e outro que salva os dados, mas ao carregar a pagina os text box e os dropdownlist nem os botões para inserir, editar e deletar estão aparecendo,

    Antes eu estava fazendo com ObjectDataSource dai eu criava um metodo e setava para cada operação de inserção, edição e deletar ai ficava habilitado os textbox e os botões,

    mas depois resolvi fazer separado sem o uso do ObjectDataSource.

    terça-feira, 14 de fevereiro de 2012 17:09
  • consegui resolver o problema acima foi só mecher nas propriedades do ListView -> InsertItemPosition

    Mas agora estou com outro problema 'Referência de objeto não definida para uma instância de um objeto.'

    o metodo esta assim

    protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            ListViewItem item = e.Item;
            if (item.ItemType == ListViewItemType.DataItem)
            {
                DropDownList ddl = (DropDownList)item.FindControl("ddlPrestadores");
                //ddl.DataSource = ds.Tables["Prestadores"];
                ddl.DataSource = dt; //----------------------->> ele apresenta aqui o erro <<---------------------------
                ddl.DataTextField = "nome_prestador";
                ddl.DataValueField = "id_prestador";
                ddl.DataBind();
            }
        }

    antes esta até funcionando mais o meu dropdownlist estava sendo carregado no ItemTemplate, mas depois fui tentar mudar ele de lugar e colocar no InsertItemTemplate esta apresentando esse erro.

    Sera precisa de um outro tipo de evento diferente para popular os componente nesse modo InsertItemTemplate?

    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:10
    quarta-feira, 15 de fevereiro de 2012 13:26
  • Ola, tenta mudar o ListViewItemType.DataItem para ListViewItemType.InsertItem. :)

    Rodrigo Reis Ferreira
    Microsoft Certified

    quarta-feira, 15 de fevereiro de 2012 13:38
  • if (item.ItemType == ListViewItemType.InsertItem)

    Tentei fazer dessa forma mas não deu certo, ele nem entra nessa condição porque o item.itemType retorna DataItem.

    quarta-feira, 15 de fevereiro de 2012 14:10
  • if (item.ItemType == ListViewItemType.InsertItem)

    Tentei fazer dessa forma mas não deu certo, ele nem entra nessa condição porque o item.itemType retorna DataItem.

    humm..acredito que porque o evento seja o ItemCreated ao invés de ItemDataBound. VocÊ ta inserindo um dado correto?

    Rodrigo Reis Ferreira
    Microsoft Certified

    • Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:10
    quarta-feira, 15 de fevereiro de 2012 16:47
  • exatamente!!

    criei um evento ItemCreated e coloquei o codigo nele e funcionou vlw!!!

    quarta-feira, 15 de fevereiro de 2012 16:54
  • Sei que no seu caso você está fazendo via código, mas se alguém estiver interessado em fazer isso de outra forma, achei o artigo abaixo interessante:

    http://www.linhadecodigo.com.br/artigo/3437/utilizando-listview-para-fazer-um-crud.aspx

    quinta-feira, 24 de maio de 2012 21:08