2009-11-13 12 views
19

Non riesco a capire come aggiungere elementi a ListBox in WinForms.Come posso aggiungere un oggetto a un ListBox?

Sto cercando:

list.DisplayMember = "clan"; 
list.ValueMember = sifOsoba; 

Come posso aggiungere elementi alla lista con un valore int (ValueMember) e del testo (per la DisplayMember)?

list.Items.add(?) 

Non riesco a utilizzare ListBoxItem. Perché?

+0

@jmein: Grazie; Ho perso il tag csharp nel mio sforzo di ripulire il post originale. –

+3

Si prega di non utilizzare il codice fornito nella risposta accettata. È sbagliato. La classe (ListBoxItem) suggerita da monksy è una classe WPF che vive in uno spazio dei nomi WPF (System.Windows.Controls) in un assembly WPF (PresentationFramework.dll). Gli sviluppatori di Windows Form NON DEVONO fare riferimento a assembly e classi da WPF nelle loro applicazioni. Il codice può essere compilato ed eseguito, ma NON CORRETTO. – MichaelFStarke

risposta

10
list.Items.add(new ListBoxItem("name", "value")); 

La struttura di dati interna (predefinita) di ListBox è ListBoxItem.

+6

listBoxItem? perché non ho questo? – Ante

+0

C'è stato un errore? Ho aggiunto un collegamento alla classe doc – monksy

+4

Puoi semplicemente aggiungere un oggetto - non deve essere un ListBoxItem. –

1

è necessario creare un oggetto di tipo ListBoxItem e aggiungere che, per l'insieme di elementi:

list.Items.add(new ListBoxItem("clan", "sifOsoba")); 
+2

Il metodo ListBox.Items.Add() prende un oggetto http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.objectcollection.add(v=vs.100).aspx ListBoxItem sembra esistere solo come controllo wpf http://msdn.microsoft.com/en-us/library/system.windows.controls.listboxitem.aspx Poiché la domanda riguardava winforms (http://msdn.microsoft. it/it/us/library/system.windows.forms.listbox (v = vs.100) .aspx) presumo che il tuo metodo sopra sia valido solo per un ListBox wpf. – surfmuggle

9

In WinForms, ValueMember e DisplayMember vengono utilizzati quando i dati vincolante lista. Se non si utilizza l'associazione dati, è possibile aggiungere qualsiasi oggetto arbitrario come ListItem.

Il problema è che, per visualizzare l'articolo, verrà chiamato ToString(). Pertanto, si consiglia vivamente di aggiungere solo oggetti a ListBox dove chiamare ToString() genererà un output significativo.

+0

+1 per ToString() deve essere chiamato, mi ha aiutato un sacco! (colpa mia per non aver scavalcato toString in primo luogo, provo a farlo per ogni classe) – Spooks

5

DisplayMember e ValueMember sono principalmente utili solo se si esegue il collegamento a oggetti con proprietà definite. Dovresti quindi aggiungere un'istanza di quell'oggetto.

esempio:

public class MyObject 
{ 
    public string clan { get; set; } 
    public int sifOsoba { get; set; } 
    public MyObject(string aClan, int aSif0soba) 
    { 
     this.clan = aClan; 
     this.sif0soba = aSif0soba; 
    } 

    public override string ToString() { return this.clan; } 
} 

.... 

list.Items.Add(new MyObject("hello", 5)); 

Se stai vincolante manualmente, è possibile utilizzare l'esempio fornito da occhiali

7

Si potrebbe desiderare di checkout questo SO domanda:

C# - WinForms - What is the proper way to load up a ListBox?

+0

Mentre questo link può rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – Trilarion

+1

@triIarion sarebbe d'accordo se questo non fosse collegato direttamente a StackOverflow. Anche questa risposta è stata postata quando non c'erano molte "buone pratiche" per i post come SO era relativamente nuovo (oltre 5 anni fa) :) – Kelsey

1

Se si aggiungono numeri interi, come dici nella tua domanda, questo aggiungerà 50 (da 1 a 50):

for (int x = 1; x <= 50; x++) 
{ 
    list.Items.Add(x); 
} 

Non è necessario impostare DisplayMember e ValueMember a meno che non si aggiungano oggetti con proprietà specifiche che si desidera visualizzare all'utente. Nel tuo esempio:

listbox1.Items.Add(new { clan = "Foo", sifOsoba = 1234 }); 
+0

Per qualche motivo quando aggiungo una stringa alla mia raccolta di elementi della lista, la lista rimane vuota . C'è qualcos'altro che devo fare per far apparire il testo? – James

2

Il mio modo di fare questo - utilizzando il formato di evento

MyClass c = new MyClass(); 
    listBox1.Items.Add(c); 

    private void listBox1_Format(object sender, ListControlConvertEventArgs e) 
    { 
     if(e.ListItem is MyClass) 
     { 
      e.Value = ((MyClass)e.ListItem).ToString(); 
     } 
     else 
     { 
      e.Value = "Unknown item added"; 
     } 
    } 

e.Value essere la visualizzazione di testo

Poi si può tentare di lanciare il SelectedItem a MyClass per accedere a tutto ciò che avevi lì dentro.
Inoltre, è possibile utilizzare qualsiasi cosa (che eredita comunque dall'oggetto (che è praticamente tutto)) nella Raccolta articoli.

24

ListBoxItem è una classe WPF, NON una classe WinForms.

Per WPF, utilizzare ListBoxItem.

Per WinForms, l'elemento è un tipo di oggetto, quindi utilizzare uno di questi:
1. Fornire il proprio metodo ToString() per il tipo di oggetto.
2. Usare associazione dati con DisplayMemeber e ValueMember (see Kelsey's answer)

+0

Non è corretto: http://msdn.microsoft.com/en-us/library/system.windows.controls.listboxitem.aspx – monksy

+4

@monksy, come è corretto? Il collegamento fornito dice 'Assembly: PresentationFramework (in PresentationFramework.dll)', il che significa che la classe è definita in WPF. Una normale applicazione WinForms non farà nemmeno riferimento alla dll WPF. –

+0

Sono d'accordo con @AZ.In realtà la lettura della documentazione lo rende abbastanza chiaro. – MichaelFStarke

1

Se si desidera aggiungere una stringa ad esso, la risposta è semplice:

ListBox.Items.Add("some text"); 
Problemi correlati