Usuário com melhor resposta
ListView com DropDownlist

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
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
-
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.
Rodrigo Reis Ferreira
Microsoft Certified- Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:10
Todas as Respostas
-
-
É 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 -
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?
-
-
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" /> -
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 -
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();
}
}
} -
-
-
-
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.
-
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
-
-
-
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.
Rodrigo Reis Ferreira
Microsoft Certified- Marcado como Resposta Harley Araujo sexta-feira, 17 de fevereiro de 2012 10:10
-
-
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