CSharp – ListView Eventos, Funciones y otros

Written by lopezatienza on 18/03/2009 – 10:46 -

Voy a ir añadiendo en esta entrada funcionalidad de este componente cuando vaya investigandolo a fondo.

De momento decir que este componente proviene de System.Windows.Forms.ListView

La creación de este en el Designer sería algo así con 3 columnas:


//
// ListaTagsCont
//
this.Lista.AllowColumnReorder = true;
this.Lista.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1,
this.columnHeader2,
this.columnHeader3});
this.Lista.FullRowSelect = true;
this.Lista.GridLines = true;
this.Lista.Location = new System.Drawing.Point(19, 29);
this.Lista.MultiSelect = false;
this.Lista.Name = "ListaTagsCont";
this.Lista.Size = new System.Drawing.Size(483, 321);
this.Lista.Sorting = System.Windows.Forms.SortOrder.Ascending;
this.Lista.TabIndex = 45;
this.Lista.UseCompatibleStateImageBehavior = false;
this.Lista.View = System.Windows.Forms.View.Details;
//
// columnHeader1
//
this.columnHeader1.Text = "Columna 1";
this.columnHeader1.Width = 230;
//
// columnHeader2
//
this.columnHeader2.Text = "Columna 2";
this.columnHeader2.Width = 150;
//
// columnHeader3
//
this.columnHeader3.Text = "Columna 3";
this.columnHeader3.Width = 100;

Ahora voy a mostrar el código para saber que ListViewItem está seleccionado, cuando se produce el evento SelectedIndexChanged:

Obtenemos con la variable sender el ListView completo y la propiedad FocusedItem nos devolverá el ListViewItem seleccionado.

El tipo ListViewItem.ListViewSubItemCollection nos devolverá el valor de sus correspondientes columnas.


private void Lista_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
ListView lvSeleccionados = (ListView)sender;
ListViewItem lviSeleccionado = lvSeleccionados.FocusedItem;
if (lviSeleccionado != null)
{
ListViewItem.ListViewSubItemCollection Subelementos = lviSeleccionado.SubItems;
MessageBox.Show("Subelemento1: " + Subelementos[0].Text + " Subelemento2: " + Subelementos[1].Text);
}
}
catch (Exception ex)
{
MessageBox.Show("Excepcion controlada: " + ex.Message);

}
}

Para insertar nuevos registros a nuestro ListView deberemos hacerlo de la siguiente manera.

Hay que tener en cuenta que que nuestro nuevo ListViewItem tenga las mismas columnas que nuestro ListView.

Hay que acostumbrarse a darle un valor a la propiedad Name de nuestro ListViewItem para hacerle referencia en búsquedas, borrados y demás.


try
{
string[] Campos = new string[3];
Campos[0] = "CampoColumna1";
Campos[1] = "CampoColumna2";
Campos[2] = "CampoColumna3";

ListViewItem li = new ListViewItem(Campos);
li.Name = "NombreListViewItem";
Lista.Items.Add(li);
Lista.Refresh();
}
catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); }

Para hacer inserciones en el ListView en orden descendente, es decir, ir introduciendo los ListViewItems de arriba a abajo por orden de inserción, la forma que he encontrado es la siguiente, aunque es posible que haya alguna forma mejor, pero a mi me funciona bien.

Hay que tener en cuenta que la propiedad Sorting de nuestro ListView, que se encarga de la ordenación, esté a None, ya que sino, los elementos se irán ordenando por orden alfabético.


Lista.Items.Insert(0, li);

En el ejemplo de a continuación, vamos insertando ListViewItems a nuestro ListView, de manera descendente como en el ejemplo anterior, pero buscamos si el ListViewItem que vamos a insertar, ya existe en nuestro ListView, y si es así, lo ponemos el primero en la lista, y si no es así lo insertamos en la primera línea.

Para ello utilizaremos el método Find de Lista.Items.Find(string key, bool SearchAllSubItems)

Donde key será el nombre que le hemos asignado en el momento de la inserción, y le podemos pasar como parámetro un booleano que si está a true buscará por los subelementos, de lo contrario false.

En este ejemplo también controlo en la columna2, que se incremente el valor en 1, para saber cuantas veces se ha insertado.


try
{
ListView ListadoLecturas = Lista;
ListViewItem[] ListadoActual = ListadoLecturas.Items.Find("KeyABuscar", false);
if (ListadoActual.Length > 0)
{
ListViewItem ElementoEncontrado = (ListViewItem)ListadoActual.GetValue(0);
ListViewItem.ListViewSubItemCollection SubElementos = ElementoEncontrado.SubItems;
int lecturas = Convert.ToInt32(SubElementos[2].Text) + 1;
SubElementos[2].Text = lecturas.ToString();
MessageBox.Show("Registro insertado: " + lecturas.ToString() + " veces");
Lista.Items.Remove(ElementoEncontrado);
Lista.Items.Insert(0, ElementoEncontrado);
Lista.Refresh();
}
else
{
string[] Campos = new string[3];
Campos[0] = "Columna1";
Campos[1] = "Columna2";
Campos[2] = "1";

ListViewItem li = new ListViewItem(Campos);
li.Name = "NombreListViewItem";
MessageBox.Show("Registro insertado 1 vez");
Lista.Items.Insert(0,li);
Lista.Refresh();
}
}
catch (Exception ex)
{
MessageBox.Show("Excepción controlada: " + ex.Message);
}


Autor: Antonio Lopez Atienza


Tags: ,
Posted in CSharp | No Comments »

Leave a Comment

 

RSS
MCC D5E