none
Form com três dropdown RRS feed

  • Pergunta

  • Boa tarde pessoal,

    No form que estou montando tem três dropdown, eu preciso ligar esses três componentes ao banco de dados, como é feito esse ligação?

    Quando o form tem apenas um dropdown eu faço a ligação dessa forma:

    @model IEnumerable<MvcRM.GCOLIGADA>
    ...
    <div class="control-group">
       <label>Coligada</label>
       <select id="optColigada" name="optColigada" class="form-control">
          @foreach (var item in Model)
             {
                <option value="@item.CODCOLIGADA">@item.CODCOLIGADA - @item.NOME</option>
             }
       </select>
    </div>

    Att,

    Leandro.

    quarta-feira, 13 de abril de 2016 20:08

Respostas

  • Leandro

    Verifica se te ajuda, não sei o relacionamento de suas tabelas. Mas fiz o exemplo para testes:
    View:

    @model IEnumerable<MvcApplication.Controllers.FCFO>
    @{
        ViewBag.Title = "Index";
    }

    <h2>Index</h2>
    <select id="optCliForIni" name="optCliForIni" class="form-control">
    @foreach (var item in Model)
    {
        <option value="@item.cod">@item.nome</option>
    }
    </select>

    -----------------------------------------------------------------------------------------
    Controller:

    public class AdiantamentoCFController : Controller
    {
        public ActionResult Index()
        {
            List<FCFO> fornecedores = new List<FCFO>();
            fornecedores.Add(new FCFO() { cod = 1, nome = "Fornecedor 1" });
            fornecedores.Add(new FCFO() { cod = 2, nome = "Fornecedor 2" });
            fornecedores.Add(new FCFO() { cod = 3, nome = "Fornecedor 3" });

            return View(fornecedores);
        }
    }

    ----------------------------------------------------------------------------------------
    Classe (Tabela)

    public class FCFO
    {
        public int cod { get; set; }
        public string nome { get; set; }
    }

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    • Sugerido como Resposta Fepus sexta-feira, 15 de abril de 2016 12:40
    • Marcado como Resposta Marcos SJ segunda-feira, 18 de abril de 2016 12:45
    quinta-feira, 14 de abril de 2016 20:43
  • Bom dia Silvaney,

    Eu fiz da seguinte forma e deu certo.

    No Controller:

    public ActionResult AdiantamentoCF()
            {
                var listaColigada = db.GCOLIGADA.Where(x => x.CODCOLIGADA > 0).ToList();
                ViewBag.CliFor = db.FCFO.OrderBy(x => x.CODCFO).Where(x => x.CODCFO != null).ToList();
                return View(listaColigada);
            }

    Na View:

    @model IEnumerable<MvcRM.GCOLIGADA>

    ...

    <div class="control-group">
                            <label>Coligada</label>
                            <select id="optColigada" name="optColigada" class="form-control">
                                @foreach (var item in Model)
                                {
                                    <option value="@item.CODCOLIGADA">@item.CODCOLIGADA - @item.NOME</option>
                                }
                            </select>
                        </div>
                        @*Faixa de seleção dos clientes ou fornecedores (Inicial)*@
                        <div class="control-group">
                            <label>Fornecedor inicial</label>
                            <div class="controls">
                                <select id="optCliForIni" name="optCliForIni" class="form-control">
                                    @foreach (var clifor in @ViewBag.CliFor)
                                    {
                                        <option value="@clifor.CODCFO">@clifor.CODCFO - @clifor.NOME</option>
                                    }
                                </select>
                            </div>
                        </div>

    • Sugerido como Resposta Fepus sexta-feira, 15 de abril de 2016 12:40
    • Marcado como Resposta Marcos SJ segunda-feira, 18 de abril de 2016 12:45
    sexta-feira, 15 de abril de 2016 12:19
  • Leandro,

    Você pode popular os drops usando viewBags , fica bem mais pratico, segue a ideia:

    quando vc for retornar a view , você pode criar 3 viewbags com as informações vindas da sua fonte de dados, , chegando na view , você utiliza o HTML Helpers para tipar seus dados Vindo do binder, e cria os dropdownlist com os dados da viewbag !!!!!!!



    Diego Almeida Barreto
    System Analyst / Software Developer

    • Marcado como Resposta Marcos SJ segunda-feira, 18 de abril de 2016 12:45
    sexta-feira, 15 de abril de 2016 15:28

Todas as Respostas

  • Tente criar outro select, do mesmo jeito que voce fez nesse, com os dados corretos para popular os novos drop down
    quarta-feira, 13 de abril de 2016 20:37
  • Leandro

    O primeiro passo é você saber a ordem dos dropdown.

    Depois, ao selecionar um, você manda preencher o outro.

    E para preencher o último, você utiliza os dois valores selecionados anteriormente para preencher o dropdown.

    Eu estou imaginando que você quer fazer dessa maneira, um dropdown vinculado ao outro.

    Lembre-se que o valor selecionado deve ser passado para fazer o select no banco de dados, buscando a lista que deseja mostrar.



    Espero ter ajudado. Se ajudei, favor marcar no fórum falando que foi útil.

    Mauricio Junior - Comunidade www.ecode10.com

    quarta-feira, 13 de abril de 2016 21:15
  • Boa noite,

    Leandro, as respostas dos colegas estão corretas. Se você for preencher os três ao mesmo tempo, basta copiar e colar na ordem desejada renomeando o "ID".

    Mas se tiver dependências, ou seja, para preencher o "dropdown 2" você depende do que for selecionado no "dropdown 1" e assim por diante, fica um pouco diferente.
    Quando preciso fazer isso, eu trabalho com requisições Ajax. Quando seleciona o "dropdown 1" eu pego o id selecionado e faço uma requisição passando esse id, e carrego a "dropdown 2" com o retorno.

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    quarta-feira, 13 de abril de 2016 22:36
  • Bom dia a todos,

    Eu fiz da seguinte maneira, mas não deu certo.

    <div class="control-group">
                            <label>Fornecedor inicial</label>
                            <div class="controls">                            
                                <select id="optCliForIni" name="optCliForIni" class="form-control">
                                    @foreach(var item in Model)
                                    {
                                        <option value="@item.FCFO.Select(x => x.CODCFO)">@item.FCFO.Select(x => x.NOME)</option>
                                    }
                                </select>
                            </div>
                        </div>

    Att,

    Leandro.

    quinta-feira, 14 de abril de 2016 13:22
  • Bom dia,

    Leandro, não sei como é a estrutura de seu registros, mas "FCFO" é uma lista?
    Se "FCFO", for uma lista você precisa alterar o "foreach" deixando assim:  

    @foreach(var item in Model.FCFO)
    {
        <option value="@item.CODCFO)">@item.NOME)</option>
    }

    Espero ter ajudado.

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    quinta-feira, 14 de abril de 2016 13:36
  • Leandro ,

    Vms por parte blxxx ,  você quer fazer um carregamento em cascata ????????



    Diego Almeida Barreto
    System Analyst / Software Developer

    quinta-feira, 14 de abril de 2016 13:38
  • Bom dia,

    FCFO é uma tabela do banco de dados que está no Models.

    quinta-feira, 14 de abril de 2016 14:11
  • Bom dia,

    Não, eu não quero um carregando por cascata.

    Cada dropdown é independente.

    quinta-feira, 14 de abril de 2016 14:12
  • Deu certo a solução proposta ?

    @foreach(var item in Model.FCFO)
    {
        <option value="@item.CODCFO)">@item.NOME)</option>
    }
    ou

    @foreach(var item in Model)
    {
        <option value="@item.CODCFO)">@item.NOME)</option>
    }


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    quinta-feira, 14 de abril de 2016 14:16
  • Não deu certo.

    Na primeira linha da View tem a seguinte instrução @model IEnumerable<MvcRM.GCOLIGADA>, será que pode ser por isso que não está dando certo?


    quinta-feira, 14 de abril de 2016 14:52
  • crie outro foreach no outro select que vc quer popular
    quinta-feira, 14 de abril de 2016 14:59
  • Leandro,

    Estou começando a entender... rsrs
    FCFO é um lista que está dentro da classe GCOLIGADA ?

    Se for e houver necessidade que sua classe GCOLIGADA seja uma lista, você deve entender que você está percorrendo um lista "@foreach(var item in Model)" que dentro de cada objeto desta lista possui outra lista. Isso irá resolver.
    @foreach (var item in Model)
    {
        foreach (var item2 in item.FCFO)
        {
            <option value="@item2.CODCFO)">@item2.NOME)</option>
        }
    }

    Tem necessidade que sua calsse "GCOLIGADA " seje uma lista?, Se não tiver você pode resolver tirando o "IEnumerable<" deixando so a classe e alterando o for para "@foreach(var item in Model.FCFO.ToList())"

    Troque por:
    @model MvcRM.GCOLIGADA

    @foreach (var item in Model.FCFO.ToList())
    {
        <option value="@item.CODCFO)">@item.NOME)</option>
    }
    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    quinta-feira, 14 de abril de 2016 15:29
  • Boa tarde Silvaney,

    Eu fiz das duas formas e não deu certo.

    Segue um trecho do arquivo ModeloRM.Context.cs

    namespace MvcRM

    {
        using System;
        using System.Data.Entity;
        using System.Data.Entity.Infrastructure;

        public partial class RMEntities : DbContext
        {
            public RMEntities()
                : base("name=RMEntities")
            {
            }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                throw new UnintentionalCodeFirstException();
            }

            public DbSet<FCFO> FCFO { get; set; }
            public DbSet<GCOLIGADA> GCOLIGADA { get; set; }
            public DbSet<XCOMPRADOR> XCOMPRADOR { get; set; }
            public DbSet<XEMPREENDIMENTO> XEMPREENDIMENTO { get; set; }
            public DbSet<XITEMVENDA> XITEMVENDA { get; set; }

    Nesse arquivo ficam todas as tabelas do banco.

    quinta-feira, 14 de abril de 2016 16:26
  • Leandro,

    Entendi sobre as tabelas, mas aqui não mostra os relacionamentos.
    Se sua tabela "FCFO " não tem relacionamento com "GCOLIGADA " você precisa alterar o "IEnumerable para: 

    @model IEnumerable<MvcRM.FCFO >

    Ou seja, na sua "Action" na "Controller" você precisa retornar uma lista de "FCFO ".

    Att, 

     

    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    quinta-feira, 14 de abril de 2016 17:27
  • Boa tarde Silvaney,

    Eu fiz essa alteração que você me passou.

    Acontece que o dropdown "Coligada" veio com vários zeros e essa tabela possui apenas 6 registros.

    O dropdown "Fornecedores" funcionou corretamente.


    quinta-feira, 14 de abril de 2016 20:14
  • Leandro

    Verifica se te ajuda, não sei o relacionamento de suas tabelas. Mas fiz o exemplo para testes:
    View:

    @model IEnumerable<MvcApplication.Controllers.FCFO>
    @{
        ViewBag.Title = "Index";
    }

    <h2>Index</h2>
    <select id="optCliForIni" name="optCliForIni" class="form-control">
    @foreach (var item in Model)
    {
        <option value="@item.cod">@item.nome</option>
    }
    </select>

    -----------------------------------------------------------------------------------------
    Controller:

    public class AdiantamentoCFController : Controller
    {
        public ActionResult Index()
        {
            List<FCFO> fornecedores = new List<FCFO>();
            fornecedores.Add(new FCFO() { cod = 1, nome = "Fornecedor 1" });
            fornecedores.Add(new FCFO() { cod = 2, nome = "Fornecedor 2" });
            fornecedores.Add(new FCFO() { cod = 3, nome = "Fornecedor 3" });

            return View(fornecedores);
        }
    }

    ----------------------------------------------------------------------------------------
    Classe (Tabela)

    public class FCFO
    {
        public int cod { get; set; }
        public string nome { get; set; }
    }

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    • Sugerido como Resposta Fepus sexta-feira, 15 de abril de 2016 12:40
    • Marcado como Resposta Marcos SJ segunda-feira, 18 de abril de 2016 12:45
    quinta-feira, 14 de abril de 2016 20:43
  • Bom dia Silvaney,

    Eu fiz da seguinte forma e deu certo.

    No Controller:

    public ActionResult AdiantamentoCF()
            {
                var listaColigada = db.GCOLIGADA.Where(x => x.CODCOLIGADA > 0).ToList();
                ViewBag.CliFor = db.FCFO.OrderBy(x => x.CODCFO).Where(x => x.CODCFO != null).ToList();
                return View(listaColigada);
            }

    Na View:

    @model IEnumerable<MvcRM.GCOLIGADA>

    ...

    <div class="control-group">
                            <label>Coligada</label>
                            <select id="optColigada" name="optColigada" class="form-control">
                                @foreach (var item in Model)
                                {
                                    <option value="@item.CODCOLIGADA">@item.CODCOLIGADA - @item.NOME</option>
                                }
                            </select>
                        </div>
                        @*Faixa de seleção dos clientes ou fornecedores (Inicial)*@
                        <div class="control-group">
                            <label>Fornecedor inicial</label>
                            <div class="controls">
                                <select id="optCliForIni" name="optCliForIni" class="form-control">
                                    @foreach (var clifor in @ViewBag.CliFor)
                                    {
                                        <option value="@clifor.CODCFO">@clifor.CODCFO - @clifor.NOME</option>
                                    }
                                </select>
                            </div>
                        </div>

    • Sugerido como Resposta Fepus sexta-feira, 15 de abril de 2016 12:40
    • Marcado como Resposta Marcos SJ segunda-feira, 18 de abril de 2016 12:45
    sexta-feira, 15 de abril de 2016 12:19
  • Bom dia,

    Que bom que deu certo Leandro, parabéns.

    Desculpe não conseguir ajudar mais, pois sem tem o código torna difícil o entendimento e consequentemente a ajuda.

    Peço por gentileza, que se alguma das respostas foi útil, que marque por favor.

    Sucesso

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    • Sugerido como Resposta Fepus sexta-feira, 15 de abril de 2016 12:40
    sexta-feira, 15 de abril de 2016 12:36
  • Leandro,

    Você pode popular os drops usando viewBags , fica bem mais pratico, segue a ideia:

    quando vc for retornar a view , você pode criar 3 viewbags com as informações vindas da sua fonte de dados, , chegando na view , você utiliza o HTML Helpers para tipar seus dados Vindo do binder, e cria os dropdownlist com os dados da viewbag !!!!!!!



    Diego Almeida Barreto
    System Analyst / Software Developer

    • Marcado como Resposta Marcos SJ segunda-feira, 18 de abril de 2016 12:45
    sexta-feira, 15 de abril de 2016 15:28