Ejemplo práctico de ListView en C# Windows Forms: operaciones CRUD
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.
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 HTMLPreguntas 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
Preguntas generadas con IA a partir del documento: comprueba las respuestas con el texto.