C#

10 jul, 2018

C# – Dica – Sobrescrevendo ToString()

Publicidade

Hoje veremos uma dica bem simples sobre a sobrescrita do método ToString().

O método ToString é um método Virtual do tipo object e retorna uma representação de string.

O método ToString retorna, por padrão, o nome qualificado do tipo.

Como cada tipo herda o object, praticamente todos os objetos podem sobrescrever o método ToString. Mas quando isso vale a pena? Bem, vai depender muito da situação. Mas hoje veremos um caso onde sobrescrever o método ToString() em um tipo que vale a pena.

Suponha que temos uma aplicação Windows Forms onde estamos tratando com informações de clientes.

Temos, assim, uma classe Cliente com o seguinte código:

    public class Cliente
    {
        public int Id { get; set; }
        public string Nome { get; set; }
        public string Endereco { get; set; }
        public string Telefone { get; set; }
        public string Email { get; set; }       
    }

Temos também uma classe chamada ClienteService que vamos usar para fornecer uma lista de clientes:

    public class ClientesService
    {
        public static List<Cliente> GetClientes()
        {
            var listaClientes = new List<Cliente>()
            {
                new Cliente { Id=1, Nome="Macoratti", Endereco="Rua Projetada, 100", Email= "macoratti@yahoo.com", Telefone="11-9985-2311"},
                new Cliente { Id=2, Nome="Miriam", Endereco="Rua Equador, 34", Email= "mimi@hotmail.com", Telefone="21-8875-0011"},
            };
            return listaClientes;
        }
    }

Exibindo clientes

Na nossa aplicação temos um formulário onde vamos exibir uma lista de clientes em um controle ListBox.

No controle do listbox, vamos exibir apenas os nomes dos clientes e, quando selecionarmos um cliente da lista, os detalhes do cliente deverão ser exibidos em controles TextBox no formulário. Abaixo, temos a figura que representa esse funcionamento:

Vejamos como implementar essa funcionalidade…

Primeiro, vamos exibir os clientes. Para isso, vamos definir no construtor do formulário uma chamada ao método ExibirClientes() que tem o seguinte código:

       private void ExibirClientes()
       {
            lbClientes.Items.Clear();
            var clientes = ClientesService.GetClientes();
            foreach (var cliente in clientes)
                 lbClientes.Items.Add(cliente.Nome);
        }

Temos aqui um código bem simples que limpa a ListBox e, a seguir, obtém a lista de clientes e percorre a lista exibindo o nome do cliente na ListBox.

Executando o projeto, iremos obter:

Vemos os nomes dos clientes exibidos na listbox. Agora, precisamos selecionar um cliente e exibir os detalhes nos controles TextBox.

Exibindo detalhes do cliente

Para isso, podemos usar o evento SelectedIndexChanged e verificar quando um cliente foi selecionado. Neste caso, faremos o seguinte:

  • Obtemos o cliente selecionado usando o método SelectedItem, que retorna um item atual selecionado no listbox e armazenamos em uma variável;
  • A seguir ,exibirmos esse item nos controles TextBox.

O código a implementar seria o seguinte:

        private void lbClientes_SelectedIndexChanged(object sender, EventArgs e)
        {
            var clienteSelecionado = (Cliente)lbClientes.SelectedItem;
            txtID.Text = clienteSelecionado.Id.ToString();
            txtNome.Text = clienteSelecionado.Nome;
            txtEndereco.Text = clienteSelecionado.Endereco;
            txtTelefone.Text = clienteSelecionado.Telefone;
            txtEmail.Text = clienteSelecionado.Email;
        }

Observe que estamos dando um cast no item selecionado para obter um objeto Cliente.

Se você executar o projeto e selecionar um item da lista vai obter o seguinte resultado:

O que esta acontecendo aqui?

Ocorreu um erro do tipo InvalidCastException indicando que não foi possível converter um objeto do tipo System.String no tipo Cliente.

A explicação é bem simples: quando exibimos os clientes no ListBox usamos o seguinte código:

lbClientes.Items.Add(cliente.Nome);

E assim estamos exibindo a propriedade Nome do objeto cliente que é do tipo String. Temos assim no listbox uma lista de strings e não de objetos Cliente.

E como resolver isso? Simples, sobrescrevendo o método ToString() na classe Cliente:

    public class Cliente
    {
        public int Id { get; set; }
        public string Nome { get; set; }
        public string Endereco { get; set; }
        public string Telefone { get; set; }
        public string Email { get; set; }       
        public override string ToString() => quot;{Nome}".Trim();
    }

A seguir, alteremos o código do método ExibirClientes() para exibir objetos Cliente e não a propriedade Nome do objeto Cliente:

       private void ExibirClientes()
       {
            lbClientes.Items.Clear();
            var clientes = ClientesService.GetClientes();
            foreach (var cliente in clientes)
                 lbClientes.Items.Add(cliente);
        }

Agora, executando a aplicação, ao selecionar um item da ListBox vamos selecionar um objeto Cliente e exibir as propriedades nas caixas de texto TextBox:

Maravilha! Parece simples, mas vale a pena sobrescrever o método ToString() na classe Cliente. Isto é um detalhe que faz toda a diferença.

E estamos conversados!

Pegue o projeto aqui: WF_ClassControl.zip