none
Como filtrar datos de un datagridview sin perder el formato de las filas seleccionadas anteriormente C# Windows form. RRS feed

  • Pregunta

  • Hola a todos, tengo un pequeño formulario donde estoy haciendo unas pruebas, intento pasar de un datagridview1 a un datagridview2 los datos que voy seleccionando  en el primero, resalto que tengo un checkbox en la primer columna del primer datagridview, ademas de un textbox que uso como filtro. el problema viene al momento de filtrar, se deseleccionan los checkbox anteriormente seleccionados. si alguien sabe como solucionarlo y me pudiese explicar, se lo agradecería mucho.

    este es mi código con el que hago el filtrado

    private void FiltrarPorCodigo_KeyUp(object sender, KeyEventArgs e)
            {
                conexionLocal.Close();
                conexionLocal.Open();
                SqlCommand searchC = conexionLocal.CreateCommand();
                searchC.CommandType = CommandType.Text;
                searchC.CommandText = "SELECT * FROM ProductosInventario WHERE Codigo like ('" + FiltrarPorCodigo.Text + "%')";
                searchC.ExecuteNonQuery();
                DataTable dt = new DataTable();
                SqlDataAdapter da = new SqlDataAdapter(searchC);
                da.Fill(dt);
                dataGridView1Stock.DataSource = dt;
                conexionLocal.Close();         

            }

    Aqui les dejo un link que les lleva a una captura de mi programa de prueba.

    https://drive.google.com/file/d/1XlFz16vogSU8SN49xphh03qZMGbjEEGe/view?usp=sharing

    viernes, 12 de marzo de 2021 23:49

Respuestas

  • Gracias amigo por responder, pero no conseguí solucionar el problema de la forma que me resomendaste, al final opte por filtrar usando condicionales y posicionando mi fila en primer lugar, lo hice de la siguiente manera. Solo asi solucione el problema. 


    --Creé el siguiente método.--

     private void BuscarEnGrid(DataGridView datagrid, string nombre_columna, TextBox textbox)
            {
                foreach (DataGridViewRow row in dataGridView1Stock.Rows)
                {
                    int fila = row.Index;
                    string valor = Convert.ToString(row.Cells[3].Value);

                    if (valor.Contains(FiltrarPorCodigo.Text))
                    {
                        dataGridView1Stock.Rows[fila].DefaultCellStyle.BackColor = Color.Aquamarine;
                        dataGridView1Stock.CurrentCell = dataGridView1Stock.Rows[fila].Cells[0];

                    }
                    else
                    {
                        dataGridView1Stock.Rows[fila].DefaultCellStyle.BackColor = Color.White;
                    }
                       
                    //Si esta vacio el campo de busqueda quitar el sombreado
                    if (FiltrarPorCodigo.Text == string.Empty)
                        dataGridView1Stock.Rows[fila].DefaultCellStyle.BackColor = Color.White;
                }

    --Y esto lo puse en mi evento TextChanged de mi TextBox--

     private void FiltrarPorCodigo_TextChanged(object sender, EventArgs e)
            {
                BuscarEnGrid(dataGridView1Stock, "Codigo", FiltrarPorCodigo);
            }

    • Marcado como respuesta AdrianMeza domingo, 14 de marzo de 2021 23:54
    domingo, 14 de marzo de 2021 23:54

Todas las respuestas

  • Lo unico que se me ocurre es que guardes en una lista o array los códigos de las filas chequeadas, entonces, después de realizar el filtrado recorrés el DataGrid y vas controlando cada una de la filas si el código coincide con alguno de los que guardaste en la lista, si es así chequeas esa fila.
    sábado, 13 de marzo de 2021 11:43
  • Investigare sobre el tema, muchas gracias

    sábado, 13 de marzo de 2021 16:44
  • Hola Adrián:

     Lo que veo en tu código es que no estas filtrando sobre el control o los datos del control, si no sobre la fuente de datos, es decir, cada vez que tu tecleas un valor en el campo se dispara una consulta a tu base de datos y el control es refrescado con estos nuevos datos, provocando con esto que pierdas los valores que antes capturaste o modificaste.

     Para lo que quieres hacer es mejor que utilices algún control que ya cuente con esta funcionalidad, uno muy bueno es este:

    C# Tutorial - Advanced Filter DataGridView | FoxLearn

     Puedes descargarlo via Nuget o Github

     Espero te sea de utilidad


    Saludos desde Monterrey, Nuevo León, México!!!

    domingo, 14 de marzo de 2021 1:41
  • Gracias amigo por responder, pero no conseguí solucionar el problema de la forma que me resomendaste, al final opte por filtrar usando condicionales y posicionando mi fila en primer lugar, lo hice de la siguiente manera. Solo asi solucione el problema. 


    --Creé el siguiente método.--

     private void BuscarEnGrid(DataGridView datagrid, string nombre_columna, TextBox textbox)
            {
                foreach (DataGridViewRow row in dataGridView1Stock.Rows)
                {
                    int fila = row.Index;
                    string valor = Convert.ToString(row.Cells[3].Value);

                    if (valor.Contains(FiltrarPorCodigo.Text))
                    {
                        dataGridView1Stock.Rows[fila].DefaultCellStyle.BackColor = Color.Aquamarine;
                        dataGridView1Stock.CurrentCell = dataGridView1Stock.Rows[fila].Cells[0];

                    }
                    else
                    {
                        dataGridView1Stock.Rows[fila].DefaultCellStyle.BackColor = Color.White;
                    }
                       
                    //Si esta vacio el campo de busqueda quitar el sombreado
                    if (FiltrarPorCodigo.Text == string.Empty)
                        dataGridView1Stock.Rows[fila].DefaultCellStyle.BackColor = Color.White;
                }

    --Y esto lo puse en mi evento TextChanged de mi TextBox--

     private void FiltrarPorCodigo_TextChanged(object sender, EventArgs e)
            {
                BuscarEnGrid(dataGridView1Stock, "Codigo", FiltrarPorCodigo);
            }

    • Marcado como respuesta AdrianMeza domingo, 14 de marzo de 2021 23:54
    domingo, 14 de marzo de 2021 23:54
  • Hola Adrián,

    Gracias por confirmar que se ha encontrado una solución a la consulta realizada.

    Gracias por usar los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    lunes, 15 de marzo de 2021 13:58
    Moderador