MVC project in C # throwing Exception System.InvalidCastExecption

0

Dear colleagues, I am trying to learn to develop a project in MVC. But I'm having some difficulties. When executing the program, it executes normally, however when I want to record a product entry note it throws this exception according to the image below:

Here is the source code for the Vendor Class:

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

 namespace ModelProject
 {
    public class Fornecedor
    {
        public Guid Id { get; set; }
        public string Nome { get; set; }
        public string CNPJ { get; set; }

        protected bool Equals(Fornecedor other)
        {
            return Id.Equals(other.Id);
        }

        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj))
                return false;
            if (ReferenceEquals(null, obj))
                return true;
            if (obj.GetType() != typeof(Fornecedor))
                return false;
            return Equals((Fornecedor)obj);
        }

        public override int GetHashCode()
        {
            return Id.GetHashCode();            
        }
     }
 }

Supplier Controller Code

using ModelProject;
using PersistenceProject;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ControllerProject
{
    public class FornecedorController
    {
        private Repository repository = new Repository();

        public Fornecedor Insert(Fornecedor fornecedor)
        {
            return this.repository.InsertFornecedor(fornecedor);
        }

        public void Remove(Fornecedor fornecedor)
        {
            this.repository.RemoveFornecedor(fornecedor);
        }

        public IList<Fornecedor> GetAll()
        {
            return this.repository.GetAllFornecedores();
        }

        public Fornecedor Update(Fornecedor fornecedor)
        {
            return this.repository.UpdateFornecedor(fornecedor);
        }
    }
}

Note that an object of the Repository class is instantiated in the code above. Below is the class code.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ModelProject;

namespace PersistenceProject
{
    public class Repository
    {
        private IList<Fornecedor> fornecedores = new List<Fornecedor>();

        public Fornecedor InsertFornecedor(Fornecedor fornecedor)
        {
            this.fornecedores.Add(fornecedor);
            return fornecedor;
        }

        public void RemoveFornecedor(Fornecedor fornecedor)
        {
            this.fornecedores.Remove(fornecedor);
        }

        public IList<Fornecedor> GetAllFornecedores()
        {
             return this.fornecedores;
        }

        public Fornecedor UpdateFornecedor(Fornecedor fornecedor)
        {
             this.fornecedores[this.fornecedores.IndexOf(fornecedor)] = fornecedor;
             return fornecedor;
        }
     }
 }

Class Code Entry Enter:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ModelProject
{
    public class NotaEntrada
    {
         public Guid Id { get; set; }
         public string Numero { get; set; }
         public Fornecedor FornecedorNota { get; set; }
         public DateTime DataEmissao { get; set; }
         public DateTime DataEntrada { get; set; }
         public IList<ProdutoNotaEntrada> Produtos { get; set; }

         public NotaEntrada()
         {
             this.Produtos = new List<ProdutoNotaEntrada>();
         }

         public void RegistrarProduto(ProdutoNotaEntrada produto)
         {
              if (!this.Produtos.Contains(produto))
                  this.Produtos.Add(produto);
         }

         public void RemoverProduto(ProdutoNotaEntrada produto)
         {
               this.Produtos.Remove(produto);
         }

         public void RemoverTodosProdutos()
         {
              this.Produtos.Clear();
         }
    }
}

Finally, the code that is throwing the exception:

private void btnGravar_Click(object sender, EventArgs e)
{
    var notaEntrada = new NotaEntrada()
    {
        Id = (txtIDNotaEntrada.Text == string.Empty ? Guid.NewGuid() : new Guid(txtIDNotaEntrada.Text)),
        DataEmissao = dtpEmissao.Value,
        DataEntrada = dtpEntrada.Value,
        FornecedorNota = (Fornecedor)cbxFornecedor.SelectedItem, // Acredito que aqui seja a linha do erro, pois quando eu removo essa linha, o código executa normalmente, porém não apresenta o valor do fornecedor escolhido no GRID
        Numero = txtNumero.Text
     };

        notaEntrada = (txtIDNotaEntrada.Text == string.Empty ? this.controller.Insert(notaEntrada) : this.controller.Update(notaEntrada));
        dgvNotasEntrada.DataSource = null;
        dgvNotasEntrada.DataSource = this.controller.GetAllNotaEntrada();
        ClearControlsNota();
 }

Code that populates the values in the ComboBox:

  private void InicializaComboBoxs()
  {
        cbxFornecedor.Items.Clear();

        foreach (Fornecedor fornecedor in this.fornecedorController.GetAll())
        {
            cbxFornecedor.Items.Add(fornecedor.Nome);
        }
  }
    
asked by anonymous 17.07.2018 / 15:35

1 answer

3

You're just adding vendor names in the ComboBox. It does not make sense to want to convert SelectedItem to type Fornecedor because the combo items are just strings .

There are several ways you can fill out the Combo.

One way is to set the DataSource property (the data source) as the vendor list and set the DisplayName property to the property you want to display (the name, in this case ).

cbxFornecedor.DataSource = fornecedorController.GetAll(); 
cbxFornecedor.DisplayName = "Nome"; 

Now your code should work normally because the items in the ComboBox are instances of Fornecedor and not strings .

I've created a sample project. See working below.

The code is available in the GitHub .

formcode

privatevoidForm1_Load(objectsender,EventArgse){cbxFornecedor.DataSource=Fornecedor.GetAll();cbxFornecedor.DisplayMember="Nome";
}

private void btSelecionar_Click(object sender, EventArgs e)
{
    var fornecedor = (Fornecedor) cbxFornecedor.SelectedItem;
    txtId.Text = fornecedor.Id.ToString();
    txtNome.Text = fornecedor.Nome;
    txtObservacao.Text = fornecedor.Observacao;
}

Class code Fornecedor

public class Fornecedor
{
    public int Id { get; set; }
    public string Nome { get; set; }
    public string Observacao { get; set; }

    public static List<Fornecedor> GetAll()
    {
        return new List<Fornecedor>
        {
            new Fornecedor { Id = 1, Nome = "Joaquim Pedro Soares", Observacao = "Início em fevereiro" },
            new Fornecedor { Id = 2, Nome = "Marcos Borba da Silva", Observacao = "Sem descrição" },
            new Fornecedor { Id = 3, Nome = "Martina dos Anjos", Observacao = "Lorem observação" },
            new Fornecedor { Id = 4, Nome = "Mário Roberto do Amaral", Observacao = "Fornecedor de bolachas" },
            new Fornecedor { Id = 5, Nome = "Jonathan da Silva Sauro", Observacao = "Nada a declarar" },
            new Fornecedor { Id = 6, Nome = "Maria Francisca Parker", Observacao = "Pagar adiantado" },
            new Fornecedor { Id = 7, Nome = "Roberta de Leão Moraes", Observacao = "Sem observação" }
        };
    }
}
    
17.07.2018 / 16:05