2012-05-07 17 views
7

Quiero mantener ID y Tipo de objeto en mi ListView. Estoy tratando de hacer esto:Cómo insertar tipo de objeto en ListView?

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

En mi caso, el ID es de tipo int, por lo que una parte está bien. ¿Pero cómo insertar un tipo de objeto y recuperarlo en el evento cambiado Item_Selection?

+0

Si no puede hacerlo, no puede hacerlo. Tal vez haya una solución: ¿cuál es tu objetivo aquí? – McGarnagle

+0

Por favor, no escriba sus preguntas con "C#" y cosas por el estilo. Para eso son las etiquetas. –

Respuesta

22

Un ListView no se puede añadir o insertar un objeto directamente como un ListBox o ComboBox, sino que se necesita para crear un ListViewItem y establezca su propiedad Tag.

La propiedad Tag de Msdn

un objeto que contiene datos sobre el control. El valor predeterminado es nulo.

Cualquier tipo derivado de la clase Object se puede asignar a esta propiedad . Si la propiedad Tag se establece a través del diseñador de Windows Forms , solo se puede asignar texto. Un uso común para la propiedad Tag es almacenar datos estrechamente asociados con el control. Por ejemplo, si tiene un control que muestra información sobre un cliente , puede almacenar un DataSet que contenga el pedido del cliente en la propiedad Tag de ese control para que se pueda acceder a los datos rápidamente.

código Ejemplo:

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); 

Cuando se necesita para conseguir su objetivo detrás de la ListView, se puede echar la propiedad Tag.

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

    // Can access other MyObject Members 
} 

Normalmente es más fácil ajustar la funcionalidad a un método de ayuda.

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

    // Other requirements as needed 

    listView.Items.Add(item); 
} 

Y puede hacerlo:

CreateListViewItem(listView, obj); 

Un ListView no admite una propiedad DataSource como un montón de controles, por lo que si se desea se unen los datos que tendrá que implementar algo un poco más personalizado.

+0

Esta es una gran respuesta. Super útil. – Paperwaste

0

La manera más rápida de evitar esto es mantener una lista de su objeto en el lado:

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

generar un diccionario de la lista con una cadena como la identificación, o se puede utilizar el índice para recuperar de la lista original:

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

atar o fijar la vista de lista de código subyacente para el diccionario, a continuación, utilizar el elemento seleccionado para recuperar su objeto a partir de su lista privada.

2

Crear nuevo objeto listviewitem. use la propiedad Tag.

Cuestiones relacionadas