2011-04-21 33 views
8

¿Puede alguien explicar esto:ToString Anulación() y añadiendo a ListBox C#

public class Test : List<int> 
{ 
    public override string ToString() 
    { 
     return "My ToString"; 
    } 
} 

Si ejecutar este y añadirlo a un control ListBox en un Windows Form, se muestra "Colección" en lugar de "Mi ToString ".

Test test = new Test(); 
listBox1.Items.Add(test); 

me pareció que el complemento a Items acaba de llamar a mi clase de ToString(). Los siguientes trabajos como se esperaba, por supuesto

MessageBox.Show(test.ToString()); 

Respuesta

7

Para que esto funcione hay que desactivar el formato:

listBox1.FormattingEnabled = false; 

Parece que si se habilita el formato, su hacer algunos trucos de magia y el resultado no siempre es lo que debería ser ...

+0

eso es todo. Gracias –

+0

Hizo mi día :-) – itsho

+0

Gracias ... estúpida magia – RustyH

0

lo hace no tiene que ser así:

listBox1.Items.Add(test.ToString()); 

Asumo que quiere que su cuadro de lista para contener un tipo de cadena?

No estoy seguro si eso es correcto, sin embargo, no lo he probado.

+0

Por supuesto que funciona, pero Add() recibe un objeto y no solo llama a Object.ToString() que es virtual? Si cambio mi clase para heredar de Object, funciona ... –

0

Los elementos en un ListBox son una colección de objetos, no de cadenas.

Ver MSDN: ListBox.ObjectCollection.Add Method

Por lo tanto, tampoco hay que añadir el de la instancia como una cadena (por ejemplo: listBox1.Items.Add(test.ToString());) en el extremo frontal o en el back-end cuando se mira en el cuadro de lista que tiene que llamar a ToString (ex: listBox1.Items[0].ToString();) .

+0

No, si estaba en lo cierto, ¿por qué funciona agregar un int a un listbox? Llama al método virtual ToString() en Object. Si canjeo mi clase para heredar de Object también funciona ... –

4

Establezca el DisplayMember en el ListBox en la propiedad del tipo de prueba.

listBox1.DisplayMember = "Name"; 

para resolver su problema, agregue una propiedad llamada "Nombre" para escribir y en el ToString llamada captador.

public class Test : List<Int32> 
{ 
    public String Name { get { return this.ToString(); } } 

    public override string ToString() 
    { 
     return "Test"; 
    } 
} 
+0

Sí, lo sé también ... la pregunta es ¿por qué no es Listbox.items.add callign anulado toString()? –

0

Me encontré con esto también (¡y otra gracias Manji!). que tenían algo como esto:

public override string ToString() 
    { 
     return MessageText; 
    } 

Dónde MessageText era un campo de texto, entre varios otros, y funcionó bien. Más tarde lo cambié a este

public override string ToString() 
    { 
     return string.Concat("[", MessageTime.ToString("yyyy-MM-dd HH:mm:ss.fffff"), "] ", MessageText); 
    } 

Y todavía devolvería solo el contenido del campo MessageText (tiempo de extracción de pelo). Lo interesante es que un menú contextual en el ListBox que había configurado para copiar los elementos seleccionados en el Portapapeles, utilizó la anulación completa de ToString.

Personalmente, creo que la propiedad FormattingEnabled debería ser falsa en lugar de verdadera, me parece que a menudo me atrapa el IDE (o la configuración de control) tratando de ser inteligente.

/// Edición: Typo (debe recordar no escribir con los codos!

Cuestiones relacionadas