//-----------------------------------------------------------------------------
// Ejemplo de buscar datos de una tabla conforme se escribe (13/Abr/06)
//
// ©ROLANDO ANTONIO ARRIAZA MARROQUIN
//-----------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// Para evitar re-entradas en el código
private bool iniciando = true;
// El DataTable lo necesitamos a nivel del formulario
private DataTable dt;
// El resto de variables no son necesarias a nivel de formulario
// y pueden estar definidas en el evento Form_Load
// La cadena de conexión
private string conexion =
@"Data Source = (local)SQLEXPRESS; " +
"Initial Catalog=PruebasGuille; " +
"Integrated Security=true";
// La cadena de selección
// los datos que traeremos de la base de datos.
private string seleccion =
"SELECT Nombre, Apellidos FROM Clientes";
// El adapatador para obtener los datos
private SqlDataAdapter da;
private void Form1_Load(object sender, EventArgs e)
{
this.txtApellidos.Text = "";
da = new SqlDataAdapter(seleccion, conexion);
dt = new DataTable();
da.Fill(dt);
this.datosClientes.DataSource = dt;
iniciando = false;
}
private void txtApellidos_TextChanged(object sender, EventArgs e)
{
if (iniciando) return;
// Buscar en el DataTable usando el método Select
// que es como un filtro WHERE en una cadena de selección.
// El resultado se devuelve como un array de tipo DataRow
DataRow[] filas;
// Aquí es donde hay que hacer el filtro de cómo buscar
// Usando % ... % no se tiene en cuenta dónde está el apellido escrito
// (puede ser el primero o el segundo)
// Si escribes "s" se buscarán todos los que contengan esa letra.
filas = dt.Select("Apellidos LIKE '%" + txtApellidos.Text + "%'");
// Borrar los elementos anteriores
this.listaApellidos.Items.Clear();
// Si hay datos, mostrar los apellidos
if (filas.Length > 0)
{
// Recorrer cada fila y mostrar los apellidos
foreach (DataRow dr in filas)
{
// También puedes mostrar cualquier otro campo,
// pero siempre que esté en la cadena de selección
// usada al cargar los datos
this.listaApellidos.Items.Add(dr["Apellidos"].ToString() + ", " +
dr["Nombre"].ToString());
}
}
}
private void listaApellidos_SelectedIndexChanged(object sender, EventArgs e)
{
if (iniciando) return;
// Al hacer clic, mostrar el dato
this.txtApellidos.Text = this.listaApellidos.SelectedItem.ToString();
// Buscarlo en el DataGridView (de forma manual, no conozco otra forma...)
// Eliminar las selecciones anteriores
this.datosClientes.ClearSelection();
// Recorrer las filas para buscar el Apellido indicado
foreach (DataGridViewRow fila in this.datosClientes.Rows)
{
// Si es el mismo apellido del textBox
// Curiosamente si no son los mismos datos
// se produce un error de que d.Cells(...) es Nothing
// En realidad de "curioso" no tiene nada,
// es que es la última fila, que está vacía...
if (fila.Cells["Apellidos"].Value == null || fila.Cells == null)
{
break;
}
// Si se quiere tener en cuenta el nombre y los apellidos
int i = this.txtApellidos.Text.IndexOf(",");
if (i > -1)
{
// En este ejemplo, el formato es Apellidos, Nombre
string nombre, apellidos;
apellidos = this.txtApellidos.Text.Substring(0, i).TrimEnd();
nombre = this.txtApellidos.Text.Substring(i + 1).TrimStart();
if (nombre == fila.Cells["Nombre"].Value.ToString()
&& apellidos == fila.Cells["Apellidos"].Value.ToString())
{
// Seleccionamos la fila
this.datosClientes.Rows[fila.Index].Selected = true;
// nos aseguramos de que sea visible
this.datosClientes.FirstDisplayedScrollingRowIndex = fila.Index;
break;
}
}
else
{
if (this.txtApellidos.Text == fila.Cells["Apellidos"].Value.ToString())
{
// Seleccionamos la fila
this.datosClientes.Rows[fila.Index].Selected = true;
// nos aseguramos de que sea visible
this.datosClientes.FirstDisplayedScrollingRowIndex = fila.Index;
break;
}
}
}
}
}