none
filtrar un datagridview que ya esta cargado sin conectarse a la base de datos de nuevo RRS feed

  • Pregunta

  • tengo un datagridview cargado mediante: datagridview.Rows.Add, como hago para filtrar los datos ya cargados, usando ckeckbox;

    es decir tengo una columna llamada estado, y 3 checkbox estado1, estado2 y estado3, quiero que solo muestre los estados que yo seleccione,

    pero sin tener que hacer conexiones, solo haciendo uso de lo que ya esta cargado


    _________________________________________________ ciberastro visitanos en www.compudiz.com

    jueves, 11 de abril de 2013 3:32

Respuestas

  • si creas un datatable con los campos aunque este vacio y lo asignas al datasource del grid, los datos que ingreses en el grid se impactaran en ese datatable por lo que podrias usarlo para filtrar la informacion

    pero manteniendo en memoria una copia de estos de los datos originales previo al filtro

    o sea crearias

    DataTable dt = new DataTable();

    dt.Columns.Add("estado1");

    dt.Columns.Add("estado2");

    .

    .

    datagridview1.DataSource = dt;

    entonces para filtrar harias

    DataTable dt = datagridview1.DataSource  as DataTable;

    //aqui filtras sobre el dt y el resultado lo vuelves asignar al grid

    pero recuerda mentener la instancia de ese dt, asi al anular el filtro lo vuelves a cargar y sigues teniendo los datos originales

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta ciberastro jueves, 11 de abril de 2013 4:41
    jueves, 11 de abril de 2013 4:36
  • Tal vez con un Buton "Filtrar" que recorra la grilla y revise si la columna estado coincide con el checkbox seleccionado, si no, pone esa fila en visible = false

    foreach (DataGridViewRow r in dataGridView1.Rows)
    {
          r.Visible = true; <<<--- Reemplazar poniendo el condicional correspondiente
    }
    

    En el ejemplo anterior es si pusieras un botón que borre el filtro, entonces vuelve a poner todas las filas visibles, pero agregando el condicional que compruebe si el campo estado es igual al seleccionado en el checbox, debería funcionar.

    Robbie Bozzacchi ----------------

    • Marcado como respuesta ciberastro jueves, 11 de abril de 2013 4:41
    jueves, 11 de abril de 2013 3:50

Todas las respuestas

  • Tal vez con un Buton "Filtrar" que recorra la grilla y revise si la columna estado coincide con el checkbox seleccionado, si no, pone esa fila en visible = false

    foreach (DataGridViewRow r in dataGridView1.Rows)
    {
          r.Visible = true; <<<--- Reemplazar poniendo el condicional correspondiente
    }
    

    En el ejemplo anterior es si pusieras un botón que borre el filtro, entonces vuelve a poner todas las filas visibles, pero agregando el condicional que compruebe si el campo estado es igual al seleccionado en el checbox, debería funcionar.

    Robbie Bozzacchi ----------------

    • Marcado como respuesta ciberastro jueves, 11 de abril de 2013 4:41
    jueves, 11 de abril de 2013 3:50
  • hola

    podrias ayudarte con linq

    pero ojo que si filtras los datos sin tener previamente un respaldo de los original info perderias estos datos, o sea que vas a necesitar minimanente dos datagridview para mostrar los datos filtrados, porque si usas solo uno al filtrar perderas los oroginales

    si tendrias algun otro medio como ser un datatable con los datos que cargas podrias filtras cuanto quieras porque siemrpe cuantas con los datos originanles

    si te animas con linq seria

    var result = from row in DataGridView1.Rows.Cast<DataGridViewRow>()
                        where Convert.ToBoolean(row.Cells["estado1"].Value) || Convert.ToBoolean(row.Cells["estado2"].Value) || Convert.ToBoolean(row.Cells["estado3"].Value)
                       select row;


    o sea devuelve la lista de row donde algun de los check este marcado

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 11 de abril de 2013 4:17
  • hola

    podrias ayudarte con linq

    pero ojo que si filtras los datos sin tener previamente un respaldo de los original info perderias estos datos, o sea que vas a necesitar minimanente dos datagridview para mostrar los datos filtrados, porque si usas solo uno al filtrar perderas los oroginales

    si tendrias algun otro medio como ser un datatable con los datos que cargas podrias filtras cuanto quieras porque siemrpe cuantas con los datos originanles

    si te animas con linq seria

    var result = from row in DataGridView1.Rows.Cast<DataGridViewRow>()
                        where Convert.ToBoolean(row.Cells["estado1"].Value) || Convert.ToBoolean(row.Cells["estado2"].Value) || Convert.ToBoolean(row.Cells["estado3"].Value)
                       select row;


    o sea devuelve la lista de row donde algun de los check este marcado

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    y existe una manera de crear un datable a partir de los datos creados en un datagridview, de ser asi como seria entonces el proceso de filtrado

    _________________________________________________ ciberastro visitanos en www.compudiz.com

    jueves, 11 de abril de 2013 4:24
  • si creas un datatable con los campos aunque este vacio y lo asignas al datasource del grid, los datos que ingreses en el grid se impactaran en ese datatable por lo que podrias usarlo para filtrar la informacion

    pero manteniendo en memoria una copia de estos de los datos originales previo al filtro

    o sea crearias

    DataTable dt = new DataTable();

    dt.Columns.Add("estado1");

    dt.Columns.Add("estado2");

    .

    .

    datagridview1.DataSource = dt;

    entonces para filtrar harias

    DataTable dt = datagridview1.DataSource  as DataTable;

    //aqui filtras sobre el dt y el resultado lo vuelves asignar al grid

    pero recuerda mentener la instancia de ese dt, asi al anular el filtro lo vuelves a cargar y sigues teniendo los datos originales

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta ciberastro jueves, 11 de abril de 2013 4:41
    jueves, 11 de abril de 2013 4:36
  • he probado como dijo RLBozzacchi

    y me ha funcionado

    tambien he probado como dijo Leandro Tuttini

    y tambien me funciono


    _________________________________________________ ciberastro visitanos en www.compudiz.com

    jueves, 11 de abril de 2013 4:43
  • Hola vea, ya tengo el datagrid cargado mediante un procedimiento almacenado, LA BUSQUEDA LAS HAGO POR LIKE INCREMENTABLE

    tengo un sistema 3 capas, en el evento textchange agrego este codigo si es por INTEGER

    DataTable dte = (DataTable)dgvConceptos.DataSource;
                if (dte == null)
                {
                }
                else
                {
                    dte.Clear();
                }
                MostrarConceptos();
                if (Txt_Idconcepto.Text == "")
                {
                }
                else
                {
                    ((DataTable)dgvConceptos.DataSource).DefaultView
                                                 .RowFilter = "CIDCONCEPTODOCUMENTO=" + Txt_Idconcepto.Text;

                     }

    si es por STRING uso este

    string filterField = "Nombre";
                ((DataTable)dgvSubProcesos.DataSource).DefaultView.RowFilter = string.Format("[{0}] LIKE '%{1}%'", filterField, Txt_Nombresubproceso.Text);

    martes, 22 de septiembre de 2020 22:14