es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo filtrar DataGridView utilizando TextBox

No tengo mucha experiencia aún. Estoy tratando de filtrar las filas que contienen el texto de entrada.
En orden..
Utilizo MailKit para recibir mensajes entrantes y colocar los datos de ellos en un Grid.

public void ShowMessages(ImapClient client)
{
    var inbox = client.Inbox;
    inbox.Open(FolderAccess.ReadOnly);
    var query = SearchQuery.All;                                                                             
    var uids = inbox.Search(query);
    var items = inbox.Fetch(uids, MessageSummaryItems.Full | MessageSummaryItems.BodyStructure).Reverse();
    foreach (var item in items)
    {
       ...                                 
       dataGridMessages.Rows.Add(read, item.Envelope.Subject, item.Envelope.From, item.Envelope.Date, attach, item.Size, false, item.UniqueId);
    }
}

Luego intento filtrar las filas.

private void searchTxb_TextChanged(object sender, EventArgs e)
{
    BindingSource bs = new BindingSource();
    bs.DataSource = dataGridMessages.DataSource;
    bs.Filter = string.Format("Subject LIKE '%{0}%'", searchTxb.Text);
    dataGridMessages.DataSource = bs;
}

Pero luego de escribir el texto, el grid está vacío, no encuentra nada.
Por favor, dime qué estoy haciendo mal.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando filtrar el DataGridView utilizando un BindingSource y el operador LIKE en la columna Subject con el texto de búsqueda searchTxb como entrada.

    Sin embargo, el problema puede ser que no estás configurando correctamente el DataSource del BindingSource. En lugar de establecerlo directamente en DataGridView.DataSource, debes establecerlo en un DataTable que contenga los mismos datos que el DataGridView.

    Aquí tienes un ejemplo de cómo podrías modificar tu código:

    public void MostrarMensajes(ImapClient client)
    {
        var bandejaEntrada = client.Inbox;
        bandejaEntrada.Open(FolderAccess.ReadOnly);
        var consulta = SearchQuery.All;
        var uids = bandejaEntrada.Search(consulta);
        var elementos = bandejaEntrada.Fetch(uids, MessageSummaryItems.Full | MessageSummaryItems.BodyStructure).Reverse();
    
        DataTable dt = new DataTable();
    
        dt.Columns.Add("Leído", typeof(bool));
        dt.Columns.Add("Asunto", typeof(string));
        dt.Columns.Add("Desde", typeof(string));
        dt.Columns.Add("Fecha", typeof(DateTime));
        dt.Columns.Add("Adjuntos", typeof(bool));
        dt.Columns.Add("Tamaño", typeof(int));
        dt.Columns.Add("Seleccionado", typeof(bool));
        dt.Columns.Add("IdÚnico", typeof(uint));
    
        foreach (var elemento in elementos)
        {
           dt.Rows.Add(leido, elemento.Envelope.Subject, elemento.Envelope.From, elemento.Envelope.Date, adjunto, elemento.Size, false, elemento.UniqueId);
        }
    
        dataGridMensajes.DataSource = dt;
    }
    
    private void searchTxb_TextChanged(object sender, EventArgs e)
    {
        BindingSource bs = new BindingSource();
        bs.DataSource = dataGridMensajes.DataSource;
        bs.Filter = string.Format("Asunto LIKE '%{0}%'", searchTxb.Text);
        dataGridMensajes.DataSource = bs;
    }
    

    Los cambios clave son:

    • Crear un DataTable y llenarlo con los mismos datos que el DataGridView.
    • Establecer el DataSource del BindingSource en el DataTable.
    • Utilizar el filtro en el BindingSource.
    • Establecer el DataSource del DataGridView en el BindingSource.

    Esto debería permitir que el filtro funcione correctamente.

Comments are closed.