none
Ayuda C# mantener fila seleccionada en datagridview despues de cambiar el indice RRS feed

  • Pregunta

  • Hola estoy tratando que despues de editar una fila de un datagridview o de ordenar alguna columna(sort) recupere la fila seleccionada, asi que he usadao las siguientes lines de codigo

    int sel=0; //variableglobal

    y en el boton que mando a modificar un dato

    sel=Convert.ToInt32(dgvProductos.CurrentRow.Index)

    despues de volver a cargar el datagridview

    dgvProductos.Rows[sel].Selected=true;

    hasta aqui funciona bien, pero que sucede que en mi formulario tengo un textbox para filtrar los datos(usando dataview.rowfilter) entonces cuando yo hago una busqueda el indice es por ejemplo 1 porque el filtro me devuelve unicamente la fila que busque, edito la fila, pero cuando vuelvo a cargar el datagridview el indice ya no es el mismo dado que estoy mostrando todos los datos del datagrid y no el dato filtrado, entonces el codigo anterior no me es util. 

    Se me ocurre capturar el dato de la llave primaria, ya que lleno mi datagridview de una tabla, el punto es que no se como hacer la comparacion de ese dato para de esta forma recuperar la seleccion de la fila, asi que me gustaria que me ayuden en esto


    • Editado Leonidas 7 lunes, 7 de octubre de 2013 15:46 error de ortografia
    lunes, 7 de octubre de 2013 15:44

Respuestas

  • Gracias Leandro y ElTavo por sus respuestas, aunque ya habia dado con una solucion voy a probar con lo que dice ElTavo a ver que tal me anda, asi pues tengo difrentes opciones, pero de igual manero publico el codigo con el que habia dado.

    Cuando doy click al boton Modificar capturo la clave primaria

    sel = Convert.ToInt32(dgvProductos.CurrentRow.Cells["IdProducto"].Value);

    y en el frmModificarProductos_FormClosed hago lo siguiente

    cargarproductos();
                foreach (DataGridViewRow Row in dgvProductos.Rows)
                {
                    int Fila = Row.Index;
                    int Valor = Convert.ToInt32(Row.Cells["IdProducto"].Value);

                    if (Valor == sel)
                    {
                        Row.Selected = true;
                        dgvProductos.FirstDisplayedScrollingRowIndex = Fila;
                    }
                }

    No se si esta manera este mal, pero hasta el momento ne ma ha dado problemas.

    • Marcado como respuesta Leonidas 7 martes, 8 de octubre de 2013 15:25
    martes, 8 de octubre de 2013 15:06

Todas las respuestas

  • pero que sucede que en mi formulario tengo un textbox para filtrar los datos(usando dataview.rowfilter) entonces cuando yo hago una busqueda el indice es por ejemplo 1 porque el filtro me devuelve unicamente la fila que busque,

    podrias justo antes deaplciar el RowFilter de conservar en una variable cual es el index que se selecciono, entonces despues de filtrar vuelves aplicarlo

    private int index;

    private void button1_Click(...){

       index = datagridview.Currentrow.RowIndex;

       //aqui aplcias el filtro

       datagridview.Rows[index].Selected = true;

    }

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 7 de octubre de 2013 19:08
  • Hola Leonidas, debes buscar la fila que te devolvió tu rowfilter en el DataTable para obtener su indice y de esta manera seleccionar en el grid la misma fila que filtraste y editaste, lo puedes lograr de la siguiente forma:

    DataTable dt = new DataTable();
    
    DataRow row = dt.Select("clavePrimaria = 1").First();
    int indice = dt.Rows.IndexOf(row);

    Donde dt es tu DataTable con todos los registros, clavePrimaria es el campo único que diferencia los registros y =1 es el filtro que aplicaste en el textBox, luego teniendo la fila en cuestión obtienes su indice a través de IndexOf y este indice lo asignas como seleccionado en tu DataGridView.

    Espero te sirva, saludos!!


    El Tavo http://eltavodev.blogspot.com/

    lunes, 7 de octubre de 2013 20:28
  • Creo que me exprese mal, el filtro lo aplico para buscar un registro, supongamos que tengo muchos registros se me haria dificil saber cual es la posicion inicial antes de aplicar la busqueda(filtro), entonces el filtro se va aplicando mientras escribo y me devolviendo los valores que se asemejan a lo que escribo, luego cuando ya esta visible el dato que estoy buscando lo selecciono y doy click a un boton editar el que me abre un formulario para modificar los datos, asi que en este boton obtengo la fila seleccionada despues de aplicar el filtro, ya que este es el que me permitio obtner el registo luego cuando guardo los cambios se cierra el formulario editar y se vuelve a cargar el datagridview, pero al volver a cargar el datagridview ya la posicion ya no es la misma puesto que me esta mostrando todos los datos y el indice seria el numero que tenia una vez filtrado

    esto es mas o menos lo que tengo

    int sel=0;

    private void btnModificar_Click(object sender, EventArgs e){

    sel=Convert.ToInt32(dgvProductos.CurrentRow.Index)

    frmModificarProductos ob = new frmModificarProductos();

    //En esta parte envio los datos de la fila seleccionada al form Editar y declaro esta linea de codigo

    ob.FormClosed += new System.Windows.Forms.FormClosedEventHandler(frmModificarProductos_FormClosed);

    ob.ShowDialog();

    }

    y luego esto donde vuelvo a cargar el metodo de llenar el datagridview al cerrar el form Editar

    private void frmModificarProductos_FormClosed(object sender, FormClosedEventArgs e)
    {
                cargarproductos();
                dgvProductos.Rows[sel].Selected = true;

    }

    pero como mencione me devuelve el indice que tenia cuando aplique el filtro y no podria saber el indice antes de aplicar el filtro pues el filtro lo estoy usando para encontrar el dato dentro de supongamos muchas filas en mi dgv


    • Editado Leonidas 7 lunes, 7 de octubre de 2013 21:33 faltaba una palabra
    lunes, 7 de octubre de 2013 21:32
  • Hola Leonidas, en el evento clic del botón editar debes recuperar la primaryKey de la fila seleccionada para editar y guardarla en una variable, y en el evento frmModificarProductos_FormClosed debes buscar en tu dataTable dicha fila para luego recuperar el index de esta con respecto a todos tus registros sin filtrar, sería así:

    DataRow row = dtProductos.Select("clavePrimaria = variableTemporal").First(); int indice = dtProductos.Rows.IndexOf(row);

    dgvProductos.Rows[indice].Selected = true;

    En el caso que uses un DataTable si usas un list lo haces con linq to objects o con lambda expresión.

    espero te sirva, saludos!!


    El Tavo http://eltavodev.blogspot.com/

    martes, 8 de octubre de 2013 3:20
  • Gracias Leandro y ElTavo por sus respuestas, aunque ya habia dado con una solucion voy a probar con lo que dice ElTavo a ver que tal me anda, asi pues tengo difrentes opciones, pero de igual manero publico el codigo con el que habia dado.

    Cuando doy click al boton Modificar capturo la clave primaria

    sel = Convert.ToInt32(dgvProductos.CurrentRow.Cells["IdProducto"].Value);

    y en el frmModificarProductos_FormClosed hago lo siguiente

    cargarproductos();
                foreach (DataGridViewRow Row in dgvProductos.Rows)
                {
                    int Fila = Row.Index;
                    int Valor = Convert.ToInt32(Row.Cells["IdProducto"].Value);

                    if (Valor == sel)
                    {
                        Row.Selected = true;
                        dgvProductos.FirstDisplayedScrollingRowIndex = Fila;
                    }
                }

    No se si esta manera este mal, pero hasta el momento ne ma ha dado problemas.

    • Marcado como respuesta Leonidas 7 martes, 8 de octubre de 2013 15:25
    martes, 8 de octubre de 2013 15:06
  • Realmente despues de investigar y con ayuda de los muchachos del foro esta es la solucion que a mi me funciona perfectamente despues de modificar (yo lo hago con el cellendedit escribo esta instruccion

    SendKeys.Send("{UP}");

    Asi obligo a que si se modifica suba una fila y el puntero me queda en la celda que modifique

    Espero que les Sirva saludos

    • Propuesto como respuesta AlvaroMontalva lunes, 10 de noviembre de 2014 14:53
    lunes, 10 de noviembre de 2014 14:53