El misterioso caso de la ListBox con un solo elemento

 ·  ☕ 2 min  ·  ✍️ eiximenis

    Nota: Este post ha sido importado de mi blog de geeks.ms. Es posible que algo no se vea del todo "correctamente". En cualquier caso puedes acceder a la versión original aquí

    Un post rapidito, para comentar algo que sucedió ayer…

    Ayer por la tarde puse el siguiente tweet: http://twitter.com/#!/eiximenis/status/202060274260389888. Básicamente mostraba una ListBox en la cual tras añadirle un único elemento soltaba una OutOfMemoryException indicando que había demasiados elementos en la dicha lista:

    As3cv7bCMAEOizK 

    Vale que winforms tiene sus limitaciones, pero eso parece un poco excesivo, ¿no?

    Mirando el valor de lstComandos.Count puedo ver que el elemento se ha añadido (antes de hacer el Add la lista estaba vacía) pero que después me lanza la excepción.

    La propiedad InnerException está vacía:

    image

    Bueno… tras una rápida investigación (basada en F9 y F5) pude elaborar una suposición de lo que ocurría. El objeto que añadía a la lista era de una clase tal como la siguiente:

    class Comando

    {

        private readonly Guid _id;

        public Comando()

        {

            _id = Guid.NewGuid();

        }

        public Guid Id { get { return _id; } }

        public string Name { get; set; }

        public override string ToString()

        {

            return Name;

        }

    }

    Y como lo añadia a la lista:

    lstComandos.Items.Add(new Comando());

    Este Add ya daba la excepción antes mencionada.

    ¿Cuál es el verdadero problema? Pues simple y llanamente que el método ToString() (que es el que llama la ListBox para convertir los objetos de la clase Comando en una cadena para mostrar) devuelve null.

    Basta con modificar el código del ToString:

    public override string ToString()

    {

        return Name ?? "Unnamed comamand";

    }

    Y todo pasa a funcionar a la perfección. 🙂

    ¿Moraleja final? Pues básicamente que si lanzas una excepción asegúrate de que es el tipo correcto de excepción. Porque de “demasiados elementos en la lista” y OutOfMemoryException nada de nada… 😉

    Saludos!

    Si quieres, puedes invitarme a un café xD

    eiximenis
    ESCRITO POR
    eiximenis
    Compulsive Developer