Usuário com melhor resposta
Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.

Pergunta
-
Bom dia Senhores.
Peço ajuda de todos que puderem me ajudar.
Estou com esse problema a mais de 1 semana e infelizmente ainda não consegui.
Tenho três tabelas relacionado (sql) e quando altero o dropdownlist, da o erro do título.
Estou usando FormView para inserção.
Obrigado.
Respostas
-
vou te passar um exemplo
//primeiro dropdonwlist <asp:DropDownList ID="ddl1" runat="server" OnTextChanged="ddlcargo_TextChanged" AutoPostBack="True" ></asp:DropDownList> //segundo dropdonwlist <asp:DropDownList ID="ddl2" runat="server" OnTextChanged="ddlcargo_TextChanged" AutoPostBack="True" ></asp:DropDownList> //terceiro dropdownlist <asp:DropDownList ID="ddl3" runat="server"></dropdownlist>
Então aqui os 2 primeiros eu vou tratar o evento de seleção
no c#
protected void ddl1_TextChanged(object sender, EventArgs e) { string opcao = ""; opcao = ddl1.SelectedItem.Value; string sql = "select * from tabela where id = opcao"; ddl2.datasource = result da consulta; ddl2.databind(); } protected void ddl2_TextChanged(object sender, EventArgs e) { string opcao = ""; opcao = ddl2.SelectedItem.Value; string sql = "select * from tabela where id = opcao"; ddl3.datasource = result da consulta; ddl3.databind(); }
A lógica é essa ai não coloquei tudo pq não sei como vc acessa o banco. Mais aco que a lógica ai vai te ajudar.
Junior
- Editado Junior_luiz quinta-feira, 19 de setembro de 2013 17:48 erro
- Marcado como Resposta Fabrício MD sexta-feira, 20 de setembro de 2013 19:22
Todas as Respostas
-
3º ATENDIMENTO: <asp:DropDownList ID="Ddl3Atend" runat="server" Height="25px" Width="150px" AutoPostBack="True" SelectedValue='<%# Bind(Container.DataItem,"CODVISITA3") %>' DataSourceID="SqlDs3Atendimento" DataTextField="descricao_visita3" DataValueField="codvisita3"> </asp:DropDownList> <asp:SqlDataSource ID="SqlDs3Atendimento" runat="server" ConnectionString="<%$ ConnectionStrings:fireman3ConnectionString1 %>" SelectCommand="SELECT DISTINCT [codvisita1], [codvisita2], [codvisita3], [descricao_visita3], [visita3] FROM [SKTICC_CadVisita3] WHERE (([codvisita1] = @codvisita1) AND ([codvisita2] = @codvisita2)) ORDER BY [descricao_visita3]"> <SelectParameters> <asp:ControlParameter ControlID="Ddl1Atend" Name="codvisita1" PropertyName="SelectedValue" Type="Int32" /> <asp:ControlParameter ControlID="Ddl2Atend" Name="codvisita2" PropertyName="SelectedValue" Type="Int32" /> </SelectParameters> </asp:SqlDataSource>
-
-
O dropdownlist recebe somente 2 parametros que são o codigo(id) e a descrição, assim vc tem como saber qual elemento foi selecionado pegando o value dele ou o text, então veja o que vc está passando como parametro para o load dele, um exemplo bem simples usando entity framework, que acho que dará para vc entender
Ddl_Funcao.DataSource = from f in entity.Tb_Base_Funcao select new { f.Cdfunc, f.Nmfunc }; Ddl_Funcao.DataTextField = "Nmfunc"; Ddl_Funcao.DataValueField = "Cdfunc"; Ddl_Funcao.DataBind();
eu faço a consulta e carrego os dois campos "nmfunc" e cdfunc" é isso que vc está fazendo ?Junior
-
-
Não estou passando valores fixos, estou passando os valores que estão na tabela, assim no bind ele vai preencher com os registros que ele encontrar na tabela, o que estou passando são os parametros que o dropdownlist necessita para ser carregado que é um id e uma descrição, que são textvalue e textfield.
O que vc tem que verificar é como vc está fazendo sua consulta, vc tem que trazer no result dois campos id e descrição
Junior
-
Entendi.
Eu tenho um FormView e uso um ObjectDataSource para conectar ao DataSet e fazer o insert.
Cada DropDownlist tem um sqlDatasource e cada um pega as informações de uma tabela distinta (1atend, 2atend, 3atend) mas que possui relacionamento FK.
Eu edito o Bind de cada Ddl passando o valor da tabela principal.
Ao alterar os dados de um Ddl da o erro.
Todos os Ddl estão com Autopostback = true.
Essa função que criou, é no DataBound ? -
-
não entendi o "Ao alterar os dados de um Ddl da o erro." o que vc quis dizer com isso ?
Ele carrega os dropdownlist ?
Dá erro qdo vc seleciona um ? o erro dá no gravar ou dá erro no evento da mudança da seleção de algum dropdownlist ?
Junior
-
-
então pelo que entendi o que vc quer e o seguinte :
Clica no primeiro dropdownlist e pega o que foi selecionado e assim vc executa o select para carregar o segundo dropdonwlist .
Sendo assim o ideal é no segundo ou terceiro dropdonwlist colocar o item 0(zero) como texto "--selecione--"
no evento do primeiro dropdonwlist vc pega o id escolhido e carrega o segundo dropdonwlist passando o id escolhido que deve ser a chave estrangeira para a outra tabela.
Um exemplo tipo é um dropdownlist com os estados(UF), qdo ele escolhe um estado o dropdownlist da cidade é mostrada só com as cidades do estado selecionado.
Junior
-
-
-
Obrigado Júnior.
Esse código eu devo colocar no SelectedIndexChanged ou no em outro evento?
Desculpe-me pela minha ignorância.
Eu olhei todos os eventos do formview e do DropDownlist e não localizei onde eu posso colocar o código acima.
Seria algo tipo isso:protected void Ddl1Atend_SelectedIndexChanged(object sender, EventArgs e) { string selecao = ""; selecao = Dd2Atend.selecteditem.value; }
Muito Obrigado.
-
Vai no aspx no design e clica no dropdownlist no lado direito vai em propriedades e no event onde tem o desenho de um raio vc procura o evento e dá um duplo clique nele, que ele cria o evento no codebehind(c#) é lá que vc faz a rotina
Junior
-
Oi Júnior.
Muito obrigado por continuar tentando me ajudar.
O código acima foi gerado dessa forma que vc me indicou.
A dúvida é em qual evento, eu devo fazer isso?
O Código acima esta no SelectedIndexChanged.
Ddl1Atend, Ddl2Atend e Ddl3Atend são os meus DropDownlist.
Muito obrigado. -
Fabricio, vc deve usar nos dropdonwlist que para serem carregados precisam que o usuário faça uma escolha em outro dropdownlist, no exemplo que te passei, vc faz o evento no dropdownlist dos estados, vc trás os estados e ai o usuário seleciona um, ai qdo ele seleciona o valor inicial mudou ai ele dispara o evento, então vc pega o id do estado que o usuário selecionou e vai no banco buscar todos as cidades daquele estado e dá um bind com esse resultado no dropdownlist das cidades.
Se no dropdownlist das cidades que precisa selecionar algo e carregar outro dropdownlist é só repetir a mesma lógica usada anteriormente sendo que no evento do dropdonwlist "Cidades".
Deu para entender ?
Junior
-
-
vou te passar um exemplo
//primeiro dropdonwlist <asp:DropDownList ID="ddl1" runat="server" OnTextChanged="ddlcargo_TextChanged" AutoPostBack="True" ></asp:DropDownList> //segundo dropdonwlist <asp:DropDownList ID="ddl2" runat="server" OnTextChanged="ddlcargo_TextChanged" AutoPostBack="True" ></asp:DropDownList> //terceiro dropdownlist <asp:DropDownList ID="ddl3" runat="server"></dropdownlist>
Então aqui os 2 primeiros eu vou tratar o evento de seleção
no c#
protected void ddl1_TextChanged(object sender, EventArgs e) { string opcao = ""; opcao = ddl1.SelectedItem.Value; string sql = "select * from tabela where id = opcao"; ddl2.datasource = result da consulta; ddl2.databind(); } protected void ddl2_TextChanged(object sender, EventArgs e) { string opcao = ""; opcao = ddl2.SelectedItem.Value; string sql = "select * from tabela where id = opcao"; ddl3.datasource = result da consulta; ddl3.databind(); }
A lógica é essa ai não coloquei tudo pq não sei como vc acessa o banco. Mais aco que a lógica ai vai te ajudar.
Junior
- Editado Junior_luiz quinta-feira, 19 de setembro de 2013 17:48 erro
- Marcado como Resposta Fabrício MD sexta-feira, 20 de setembro de 2013 19:22
-
Oi Júnior.
Acho que você não entedeu um ponto importe.
Quando eu te perguntei em qual evento que eu tenho que fazer a programação é porque esta dando a mensagem que a Ddl1Atend não existe no contexto atual.
Olha o print em anexo.
Obrigado, mais uma vez.
-
-
Exatamente dessa forma.
Eu tinha até reparado que o primeiro esta diferente mas eu acertei do jeito que vc colocou agora.
Será que não é nenuma namespace que esta faltando?
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data;
Obrigado. -
-
-
Oi Jr.
Fiz da forma que eu fiz acima e o Ddl aparece no meu code behind e parecia que tudo iria funcionar.
Ele criou os eventos td direitinho.
Ao executar, deu erro porque eu não posso ter dois forms na mesma página e nesse primeiro teste eu estava usando MasterPage.A page can have only one server-side Form tag.
Achei um link que da essa informação que eu passei acima.
http://social.msdn.microsoft.com/Forums/aspnet/pt-BR/82b35908-ac17-4cde-92fc-4e0e683cccec/a-page-can-have-only-one-serverside-form-tag
Criei outra página, sem o uso da MasterPage e deu o erro:Estamos no caminho certo.
Obrigado.
-
Fabricio esse erro é pq no aspx tem o evento OnTextChanged="DdlAtend_TextChanged" e ele não achou esse evento no codebehind como te falei vc cria o dropdownlist no aspx clica no design e clica no dropdownlist no lado direito clica no botão properties e em cima no desenho de um relampago amarelo tem os eventos do componente e no evento textchanged vc dá um duplo clique que automaticamente ele cria o evento no codebehind ou seja no C#.
O evento no codebehind vc criou na mão ou criou como te expliquei acima ?
Junior
-
Isso.
Já é tanta coisa que acabei me confundindo.
Agora eu fiz assim e funcionou.
Agora eu só preciso povoar os ddl no page load e fazer o insert no botão.
Vc acha que eu povoar de inicio usando sqlDataSource ou faço tudo na mão?
Obrigado. -
-