Ejemplo práctico de ListView en C# Windows Forms: operaciones CRUD

InformáticaActualizado el 4,99 KB

Resumen

El documento presenta código en C# para un formulario de Windows Forms que gestiona un control ListView. Muestra cómo insertar, modificar y borrar elementos, borrar toda la lista, contar los registros y exportar los datos a un archivo de texto. Sirve como referencia práctica para entender la gestión básica de listas en interfaces gráficas.

Puntos clave

  • Se configura el ListView con MultiSelect y FullRowSelect para permitir selección múltiple de filas completas.
  • Insertar crea un ListViewItem a partir del texto del campo y actualiza el contador de elementos.
  • Borrar elimina los elementos seleccionados recorriendo la colección de atrás hacia adelante para evitar errores de índice.
  • Modificar actualiza el texto de la primera columna y de los subelementos a partir de los campos de texto.
  • Guardar exporta el texto de la primera columna de cada elemento a un archivo .txt mediante StreamWriter.

Ponte a prueba

Implementación de ListView en C# Windows Forms

A continuación, se presenta la estructura de código en C# para gestionar un control ListView en una aplicación de Windows Forms, permitiendo realizar operaciones como insertar, modificar, borrar elementos y exportar datos a un archivo de texto.

Código Fuente del Formulario


public partial class Form1 : Form {
    private List<Accion> listaAcciones = new List<Accion>();

    public Form1()
    {
        InitializeComponent();
        listView.MultiSelect = true;
        listView.FullRowSelect = true;
        ActualizarContador();
    }

    private void ActualizarContador()
    {
        lblContador.Text = $"Total: {listView.Items.Count}";
    }

    private void LimpiarCampos()
    {
        txtCampo1.Text = ""; // <- Cambiar por tu TextBox
        listView.SelectedItems.Clear();
    }

    private void btnInsertar_Click(object sender, EventArgs e)
    {
        try
        {
            string c1 = txtCampo1.Text.Trim(); // <- Cambiar txtCampo1
            if (string.IsNullOrEmpty(c1))
            {
                MessageBox.Show("Rellena el campo.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            ListViewItem item = new ListViewItem(c1);
            // Si usas más columnas, añadirías: item.SubItems.Add(txtCampo2.Text);
            listView.Items.Add(item);
            LimpiarCampos();
            ActualizarContador();
            RegistrarAccion("Insertar");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
        }
    }

    private void btnBorrar_Click(object sender, EventArgs e)
    {
        try
        {
            if (listView.SelectedItems.Count == 0)
            {
                MessageBox.Show("Selecciona elemento.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            DialogResult res = MessageBox.Show("¿Borrar?", "Confirma", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (res == DialogResult.Yes)
            {
                // Eliminamos de atrás hacia adelante para evitar errores de índice al borrar múltiples
                for (int i = listView.SelectedItems.Count - 1; i >= 0; i--)
                {
                    listView.Items.Remove(listView.SelectedItems[i]);
                }
                LimpiarCampos();
                ActualizarContador();
                RegistrarAccion("Borrar");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
        }
    }

    private void btnBorrartodo_Click(object sender, EventArgs e)
    {
        try
        {
            if (listView.Items.Count == 0)
            {
                MessageBox.Show("Lista vacía.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            DialogResult res = MessageBox.Show("¿Todo?", "Confirma", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (res == DialogResult.Yes)
            {
                listView.Items.Clear();
                LimpiarCampos();
                ActualizarContador();
                RegistrarAccion("Borrar todo");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
        }
    }

    private void btnCerrar_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void btnModificar_Click(object sender, EventArgs e)
    {
        try
        {
            if (listView.SelectedItems.Count > 0)
            {
                ListViewItem fila = listView.SelectedItems[0];
                fila.Text = txtDni.Text;
                fila.SubItems[1].Text = txtNombre.Text;
                fila.SubItems[2].Text = txtApellido.Text;
                fila.SubItems[3].Text = txtDireccion.Text;

                LimpiarCampos();
                RegistrarAccion("Modificar");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
        }
    }

    private void btnGuardar_Click(object sender, EventArgs e)
    {
        try
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "TXT|*.txt";
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                using (StreamWriter sw = new StreamWriter(sfd.FileName, false))
                {
                    foreach (ListViewItem item in listView.Items)
                    {
                        // item.Text guarda el valor de la primera columna
                        sw.WriteLine($"{item.Text}");
                    }
                }
                RegistrarAccion("Guardar");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
        }
    }

    private void RegistrarAccion(string desc)
    {
        listaAcciones.Add(new Accion(desc));
    }
}

Descargar

PDF Word HTML

Preguntas frecuentes

¿Por qué se recorre la selección de atrás hacia adelante al borrar elementos en un ListView?

El documento indica que se elimina de atrás hacia adelante para evitar errores de índice al borrar múltiples elementos. Al quitar un elemento, los índices de los siguientes cambian, así que recorrer en sentido inverso evita saltarse o acceder mal a registros.

¿Cómo se exporta el contenido de un ListView a un archivo de texto?

Se usa un SaveFileDialog para elegir la ruta y un StreamWriter que escribe, línea a línea, el valor de la propiedad Text de cada ListViewItem. Solo se guarda la primera columna.

Ponte a prueba

Tarjetas de repaso

Pulsa una tarjeta para ver la respuesta.

Test

1. ¿Qué propiedad del ListView permite seleccionar la fila completa al hacer clic?
2. ¿Qué hace el método RegistrarAccion en el código?
3. ¿Qué valor se escribe en el archivo al pulsar Guardar?
4. ¿Por qué el código usa un bucle for descendente al borrar elementos seleccionados?
5. ¿Qué hace la función ActualizarContador?

Preguntas generadas con IA a partir del documento: comprueba las respuestas con el texto.