2012-05-07 11 views
7

Voglio mantenere sia l'ID sia il tipo di oggetto nel mio ListView. Sto cercando di fare questo:Come inserire il tipo di oggetto in ListView?

lstView.Items.Insert(MyObject); 
// can't do this, because it takes only Int and String 

Nel mio caso, l'ID è int, quindi quella parte è ok. Ma come inserire un tipo di oggetto e recuperarlo nell'evento modificato Item_Selection?

+0

Se non riesci a farlo, non puoi farlo. Forse c'è una soluzione: qual è il tuo obiettivo qui? – McGarnagle

+0

Si prega di non anteporre le vostre domande a "C#" e così via. Ecco a cosa servono i tag. –

risposta

22

Un ListView non possono aggiungere o inserire un oggetto direttamente come un ListBox o ComboBox, ma invece è necessario creare un ListViewItem e impostarne la proprietà Tag.

La proprietà Tag da MSDN

Un oggetto che contiene i dati relativi al controllo. Il valore predefinito è null.

Qualsiasi tipo derivato dalla classe Object può essere assegnato a questa proprietà . Se la proprietà Tag è impostata tramite il designer di Windows Form , è possibile assegnare solo il testo. Un uso comune per la proprietà Tag consiste nel memorizzare dati strettamente associati al controllo. Ad esempio, se si dispone di un controllo che visualizza le informazioni su un cliente , è possibile archiviare un DataSet che contiene la cronologia dell'ordine del cliente nella proprietà Tag di quel controllo in modo che sia possibile accedere rapidamente ai dati .

codice Esempio:

MyObject myObj = new MyObject(); 

ListViewItem item = new ListViewItem(); 
item.Text = myObj.ToString(); // Or whatever display text you need 
item.Tag = myObj; 

// Setup other things like SubItems, Font, ... 

listView.Items.Add(item); 

Quando è necessario per ottenere il vostro oggetto di ritorno dal ListView, si può lanciare la proprietà Tag.

private void OnListViewItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { 
    MyObject myObj = (MyObject)e.Item.Tag; 
    int id = myObj.Id; 

    // Can access other MyObject Members 
} 

Di solito è più semplice avvolgere la funzionalità in un metodo di supporto.

public static void CreateListViewItem(ListView listView, MyObject obj) { 
    ListViewItem item = new ListViewItem(); 
    item.Tag = obj; 

    // Other requirements as needed 

    listView.Items.Add(item); 
} 

E si può fare:

CreateListViewItem(listView, obj); 

Un ListView non supporta una proprietà DataSource come un sacco di controlli, quindi se si desidera i dati legano dovrai implementare qualcosa di un po 'più personalizzato.

+0

Questa è un'ottima risposta. Super utile. – Paperwaste

0

modo più veloce intorno a questo è quello di mantenere una lista del vostro oggetto sul lato:

List<MyObject> list = ... ; // my list 

generare un dizionario dalla lista con una stringa come ID, oppure è possibile utilizzare l'indice per recuperare dal lista originale:

Dictionary<int,string> listBinder = new Dictionary<int,string>(
    list.Select(i => new KeyValuePair<int,string>(i.ID, i.Name)) 
); 

Bind o codebehind fissaggio del listview al dizionario, quindi utilizzare l'elemento selezionato per recuperare l'oggetto dalla lista privata.

2

Crea un nuovo oggetto listviewitem. usa la proprietà Tag.

Problemi correlati