AYUDA - FILTRO CON GRIDVIEW (pintar filas).

Iniciado por [Black Vomit], 25 Noviembre 2011, 14:12 PM

0 Miembros y 2 Visitantes están viendo este tema.

[Black Vomit]

Saludos estimados, intenté buscar ayuda en el foro MSDN pero fue poco fructífero, tengo lo siguiente:
Quiero realizar un filtro en mi website que, según lo ingresado me pinte las filas de mi gridview, sean los caracteres que sean.  Por ejemplo, ingreso "adm", le doy al botón BUSCAR y debería seleccionarme y pintarme las filas que contenga esas letras en cualquiera de sus campos.

Lo ideal es que se ejecute en el evento CLICK de mi botón buscar.  Tengo un texbox en dónde se ingresa la búsqueda, el botoón y el gridview en dónde se pintarian las filas y me carga los datos de mi base de datos.

Cualquier ayuda sería bienvenida, estoy hace días con esto.!!

Lo estoy realizando en c# + sqlserver.
Acá el código de mi evento click del botoón BUSCAR.

        protected void btn_IngFormSearch_Click(object sender, EventArgs e)
        {
            foreach (GridViewRow row in gv_ListarCalibres.Rows)
            {

                for (int i = 1; i <= 11; i++)
                {
                    TextBox txt = row.FindControl(string.Format("TextBox{0}", i)) as TextBox;
                    //if ((txt != null) && (txt.Text == txt_IngFormBuscador.Text))
                        //e.row.BackColor = System.Drawing.Color.Red;
                }

            }
        }

PD: Soy novato en c#, pero algo le aplico.   :¬¬

Novlucker

Se me ocurren dos posibilidades;

1) Almacenar el source de tu consulta en una SESSION (o VIEWSTATE mejor) para no ir contra la DB cada vez, para luego hacer la búsqueda desde tu textbox, recuperar los valores desde el SESSION, y volver a realizar el bind. Al realizar el bind se dispara el evento RowDataBound, y ahí puedes realizar la búsqueda y pintar.

2) Realizar los cambios desde javascript, para lo cual deberías de registrar tu script y llamarlo desde el click.

La primera opción es la más sencilla :)

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

[Black Vomit]

#2
Cita de: Novlucker en 25 Noviembre 2011, 14:45 PM
Se me ocurren dos posibilidades;

1) Almacenar el source de tu consulta en una SESSION (o VIEWSTATE mejor) para no ir contra la DB cada vez, para luego hacer la búsqueda desde tu textbox, recuperar los valores desde el SESSION, y volver a realizar el bind. Al realizar el bind se dispara el evento RowDataBound, y ahí puedes realizar la búsqueda y pintar.

2) Realizar los cambios desde javascript, para lo cual deberías de registrar tu script y llamarlo desde el click.

La primera opción es la más sencilla :)

Saludos

Saludos viejo! mira, mejoré mi código, me gustaría seguir la lógica que estoy implementando.

   protected void btn_IngFormSearch_Click(object sender, EventArgs e)
       {
           foreach (GridViewRow row in gv_ListarCalibres.Rows)
           {

               for (int i = 1; i <= 11; i++)
               {
                   TextBox txt = row.FindControl(string.Format("TextBox{0}", i)) as TextBox;
                       if ((txt != null) && (txt.Text == txt_IngFormBuscador.Text))
                       {
                           row.BackColor = System.Drawing.Color.Red;
                       }
               }

           }
       }


Pero no me pinta las filas .... :(   :-\ :-\ :-\ :-\

¿Me podrías ayudar a clarificar la primera opción, en base al código que ya tengo?
PD: Soy noob  :(!!!!! y nunca he implementado un SESSION en c#  :(!!

Novlucker

Las session al igual que los viewstate son algo así ..
Código (csharp) [Seleccionar]
List<string> list = new List<string>(){"palabra1","palabra2","palabra3"};
//Guardo datos en session
Session["datos"] = list;

//Recupero datos de session. El session guarda objects, asi que se debe de castear
List<string> list2 = (List<string>)Session["datos"];


http://adeshoras.wordpress.com/2008/08/09/el-gridview-y-sus-eventos-el-evento-rowdatabound/
Al leer el link anterior, te darás cuenta de que debes de adaptar ese código ;)

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

[Black Vomit]

Precisamente lo estaba haciendo, ahora, desde ese evento, tengo lo siguiente:
//____________________________________________________________________
        //----------------- FUNCION BUSCADOR /FILTRO POR CARACTER------------
        protected void btn_IngFormSearch_Click(object sender, EventArgs e)
        {
            foreach (GridViewRow row in gv_ListarCalibres.Rows)
            {
                for (int i = 1; i <= 11; i++)
                {
                    TextBox txt = row.FindControl(string.Format("TextBox{0}", i)) as TextBox;
                        if ((txt != null) && (txt.Text == txt_IngFormBuscador.Text))
                        {
                            row.BackColor = System.Drawing.Color.Red;
                        }
                }

            }
        }

        //____________________________________________________________________
        //---------------- EVENTO ROWDATABOUND PINTAR FILAS ------------------
        protected void gv_ListarCalibres_RowDataBound(object sender, GridViewRowEventArgs e)
        {


            if (e.Row.RowType == DataControlRowType.DataRow && txt_IngFormBuscador.Text != "")
            {
                for (int x = 0; x < e.Row.Cells.Count; x++)
                {
                    string stock = e.Row.Cells
  • .Text;
                        if (stock.Contains(txt_IngFormBuscador.Text))
                        {
                            e.Row.Style.Add("background-color", "#C69D9D");
                        }
                    }

                }
            }


    Pero mi pregunta ahora es, ¿Cómo podría desde el evento click del botoón BUSCAR invocar al evento ROWDATABOUND que me pintaría mis filas?

Novlucker

Te lo dije más arriba ... desde el BUSCAR vuelves a invocar el DataBind de la grilla

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

[Black Vomit]

Quizás una solución más sencilla sería crear una variable booleana global llamada CLICK =false;
Luego en el evento click del buscar darle TRUE y preguntar sobre esa variable en el rowdatabound, así:

  protected void btn_IngFormSearch_Click(object sender, EventArgs e)
        {
            click = true;
            foreach (GridViewRow row in gv_ListarCalibres.Rows)
            {
                for (int i = 1; i <= 11; i++)
                {
                    TextBox txt = row.FindControl(string.Format("TextBox{0}", i)) as TextBox;
                        if ((txt != null) && (txt.Text == txt_IngFormBuscador.Text))
                        {
                            row.BackColor = System.Drawing.Color.Red;
                        }
                }

            }
        }

        //____________________________________________________________________
        //---------------- EVENTO ROWDATABOUND PINTAR FILAS ------------------
        protected void gv_ListarCalibres_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow && txt_IngFormBuscador.Text != "" && click == true )
            {
                for (int x = 0; x < e.Row.Cells.Count; x++)
                {
                    string stock = e.Row.Cells
  • .Text;
                        if (stock.Contains(txt_IngFormBuscador.Text))
                        {
                            e.Row.Style.Add("background-color", "#C69D9D");
                        }
                    }

                }
            }

    ¿Sigue tu misma lógica o no? pero no pinta nada.  Gracias por tus sugerencias  estimado.

Novlucker

Para darle estilos a una grilla debes de hacerlo durante la carga de las filas, luego de que esta creada no puedes hacerlo, a menos que sea desde javascript, así que debes de disparar el databind o no va a haber cambio alguno.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Novlucker

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein