C# MVC project launching Exception System.Invalidcastexecption

Asked

Viewed 52 times

0

Dear colleagues, I am trying to learn how to develop an MVC project. But I am having some difficulties. When running the program, it runs normally, but when I want to record a product input note throws this exception according to the image below:

Imagem do Erro

Below is the source code of 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();            
        }
     }
 }

Code of Supplier Controller

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 in the above code an object of the Repository class is instantiated. Below is the code of the class.

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;
        }
     }
 }

Code of Class Notainput:

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 releasing 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 populating values in Combobox:

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

        foreach (Fornecedor fornecedor in this.fornecedorController.GetAll())
        {
            cbxFornecedor.Items.Add(fornecedor.Nome);
        }
  }
  • 1

    SelectedItem is a string with what is written in the combobox at the time... The conversion makes no sense.

  • is because the ownership of your class is a kind of another class, ie Suppliersnote is of the Supplier type and you are wanting to make a cast Combox that is not of the same type.

  • Could you show me an example code so I can compare my error?

  • @Danillovicttor has nothing to show, little grasshopper. It would be good if you show the code you use to fill out the combo, then we can try to help you.

  • 1

    @Danillovicttor Ask the question, son

  • @LINQ already put the code... is at the end of the question

  • 1

    now you have to use: cbxFornecedor.DataSource = this.fornecedorController.GetAll(); cbxFornecedor.DisplayMember = "Nome";

Show 2 more comments

1 answer

3


You are just adding vendor names to Combobox. It makes no sense to want to convert the SelectedItem for the guy Fornecedor because combo items are only strings.

There are several ways you can fill in the Combo.

One way is to define the property DataSource (the data source) as the list of suppliers and set the property DisplayName as 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 Combobox are instances of Fornecedor and not strings.


I created an example project. See working below.

The code is available on Github.

Exemplo de execução do código abaixo

Code of form

private void Form1_Load(object sender, EventArgs e)
{
    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" }
        };
    }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.