none
Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control. RRS feed

  • 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.
    quarta-feira, 18 de setembro de 2013 13:59

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
    quinta-feira, 19 de setembro de 2013 17:47

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>
               

    quarta-feira, 18 de setembro de 2013 14:02
  • O meu code behind está padrão.
    Já recebi informações que teria que tratar os nulos, outros disseram que teria que povoar o DDl no DataBound do FormView.
    A questão é que não sei o que fazer e nem como fazer.
    Por favor, me ajudem.
    quarta-feira, 18 de setembro de 2013 14:08
  • 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

    quarta-feira, 18 de setembro de 2013 14:21
  • Obrigado Jr por tentar me ajudar.
    Nesse caso, vc esta passando valores fixos para o TextField e para o ValueField.
    Como eu devo proceder?
    Eu adiciono  o EntityDataSource ?
    Obrigado.
    quarta-feira, 18 de setembro de 2013 14:29
  • 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

    quarta-feira, 18 de setembro de 2013 14:50
  • 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  ?

    quarta-feira, 18 de setembro de 2013 15:09
  • Entendeu Jr.
    Peço que por favor, não deixe de me ajudar.
    Obrigado.

    quarta-feira, 18 de setembro de 2013 15:41
  • 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

    quarta-feira, 18 de setembro de 2013 16:45
  • Isso mesmo.
    Ao alterar o DropDownlist do 1º ou do 2º Atendimento da erro.
    O 3º não da erro porque não tem nenhuma subcategoria para o 3º atendimento.
    O erro é exatamente esse do titulo.
    quarta-feira, 18 de setembro de 2013 17:13
  • 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

    quarta-feira, 18 de setembro de 2013 17:58
  • É isso mesmo Jr. Luiz.
    Vc me entendeu.
    Eu devo fazer isso no SelectChange do primeiro Ddl, certo?
    Como eu devo fazer?
    Obrigado.

    quarta-feira, 18 de setembro de 2013 18:32
  • Vc fará isso no evento ontextchanged do dropdownlist

    no c# vc faz assim :

    string selecao = "";

    selecao = dropdownlist.selecteditem.value;

    faz a sua consulta com a opção selecao e carrega o prox dropdownlist.

    A lógica é essa.


    Junior

    quarta-feira, 18 de setembro de 2013 18:45
  • 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.



    quarta-feira, 18 de setembro de 2013 19:13
  • 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

    quinta-feira, 19 de setembro de 2013 12:51
  • 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.
    quinta-feira, 19 de setembro de 2013 13:05
  • 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

    quinta-feira, 19 de setembro de 2013 13:38
  • Certo Júnior.
    A lógica eu entendi e agora, ficou mais claro ainda.
    A questão é que o Dropdownlist aparece sublinhado (algo de errado).
    Fiz isso no SelectedIndexChanged e ele vai disparar o bind para o outro ddl, certo?
    Obrigado.

    quinta-feira, 19 de setembro de 2013 14:41
  • 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
    quinta-feira, 19 de setembro de 2013 17:47
  • 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.

    quinta-feira, 19 de setembro de 2013 18:50
  • <asp:DropDownList ID="Ddl1Atend" runat="server" OnTextChanged="Ddl1Atend_TextChanged" AutoPostBack="True" ></asp:DropDownList>

    a declaração no seu aspx está como acima ?


    Junior

    quinta-feira, 19 de setembro de 2013 19:16
  • 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.

    quinta-feira, 19 de setembro de 2013 19:20
  • Fabricio se o seu banco de dados for sql tem que colocar outra referencia a biblioteca

    using System.Dada.SqlClient;


    Junior

    sexta-feira, 20 de setembro de 2013 11:53
  • Obrigado Júnior, por toda a sua ajuda e empenho.
    Eu acho que um grande problema é a falta recurso do Formview.
    Estou criando um form html na mão vamos ver no que qe dá.
    Obrigado.
    sexta-feira, 20 de setembro de 2013 12:07
  • 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.

    sexta-feira, 20 de setembro de 2013 14:54
  • 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

    sexta-feira, 20 de setembro de 2013 17:02
  • 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.

    sexta-feira, 20 de setembro de 2013 18:30
  • PArticularmente não gosto de sqldatasource pq fica exposto no aspx, melhor fazer no c#ou então usando o entity framework

    Junior

    sexta-feira, 20 de setembro de 2013 18:34
  • Ok.
    Muito Obrigado.
    sexta-feira, 20 de setembro de 2013 19:22