none
Ordenar un DataGridView por una columna con Sort, ¿como desactivar? RRS feed

  • Pregunta

  • Hola.

    Tengo un datagridview ordenado por una columna "sec" a través del método Sort. Solamente tengo que ejecutar un dgv1.Sort para que se ejecute siempre y ese es mi problema una vez puesto no hay forma de desactivarlo.

    Resulta que tengo que cambiar valores de "sec" a través de código y como el Sort está activo, el poner los valores es una pesadilla, hay veces que lo hace bien y otras no (se adelanta el Sort a establecer los valores restantes). Por ello la idea sería desactivarlo, poner los valores que me interesan y volverlo a activar. ¿Alguien conoce como parar la ejecución Sort?.

    Os paso un ejemplo por si queréis ver el efecto (tengo VS 2010) en donde una vez que se le da al On ya no hay forma de pararlo.

    ¿Alguna sugerencia?

    Gracias por la ayuda, la verdad es que estoy un poco desesperado.

    public partial class Form1 : Form
    {
            public Form1(){ InitializeComponent(); }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                DataTable dt = new DataTable("sdata");
                dt.Columns.Add("sec", typeof(Int32));
                dt.Columns.Add("name", typeof(String));
                dt.Columns.Add("other", typeof(String));
                dt.Columns.Add("aux", typeof(int));
                for (int f = 10; f > 0; f--) dt.Rows.Add(f, "n"+f, "o"+f, 1);
    
                this.dgv1.Refresh();
                this.dgv1.DataSource = dt;
    
                //this.SortOn();
            }
    
            private void bSortOn_Click(object sender, EventArgs e) { this.SortOn(); }
            private void SortOn() { this.dgv1.Sort(this.dgv1.Columns["sec"], ListSortDirection.Ascending); }
    
            private void bSortOff_Click(object sender, EventArgs e)
            { this.dgv1.Columns["sec"].SortMode = DataGridViewColumnSortMode.NotSortable; } // no funciona
    
            private void bTest_Click(object sender, EventArgs e)
            {
                if (this.dgv1.SortedColumn != null)
                    this.tbInfo.Text = "Column=" + this.dgv1.SortedColumn.Name + " Order=" + this.dgv1.SortOrder.ToString();
                else
                    this.tbInfo.Text = "-";
            }
    }
    


    jueves, 12 de septiembre de 2013 16:06

Todas las respuestas

  • Ninguna idea?

    Voy a intentar otra cosa ... a ver si tengo suerte. Sacaré los valores de "sec" a un array externo, establecer el orden que deben tener y aplicarlos al DGV.

    Debo solucionar si hay alguna forma de impedir que se lancen eventos en un trozo de código y que se acumulen para ejecutarse una vez ejecutado ese trozo. Ya contaré.

    Saludos.

    viernes, 13 de septiembre de 2013 8:23
  • Hola.

    Las columnas de los datagridview tienen una propiedad llamada "Sort", si mal no recuerdo, es un booleano, puedes jugar con esa propiedad activando y desactivando el ordenado.

    Saludos

    viernes, 13 de septiembre de 2013 20:38
  • Hola Miguel en este enlace hay un ejemplo que plantea nuestro compañero Leandro Tuttini

    espero sea de tu ayuda.

    Uso del CheckBox - DataGridViewCheckBoxColumn


    Alex_87

    sábado, 14 de septiembre de 2013 20:45
  • Hola.

    Gracias Vicente por tu respuesta y perdona la tardanza en responder (llevo de viaje el finde+lunes y hoy tenía cosas urgentes que gestionar).

    Lo que comentas del Sort de la columna es el "SortMode" y si miras en el código ... no me funciona, sigue aplicando la ordenación de forma automática ... es darle una vez al bSortOn y luego no hay forma de pararlo. Lo ideal es algo sencillo, pero por lo que he mirado no lo he encontrado.

    Saludos.



    • Editado Miguel_Po martes, 17 de septiembre de 2013 15:16
    martes, 17 de septiembre de 2013 15:15
  • Hola, gracias por la respuesta Javier (siento responder tan tarde pero he estado unos días alejados de las TIC) ... voy a mirarlo.

    Luego cuento como me va el asusto.

    ...

    Creo que no se aplica a lo que yo pretendo (aunque es interesante para uso futuro). En mi caso me encuentro con la situación de que una vez ejecutado un Sort(columna, orden) ya no hay forma de desactivarlo ...

    El problema es que si quiero modificar valores de la celda se lanza la ordenación antes de terminar (algunas veces) y monta un lio con los datos.

    Se me ocurrió la solución de hacer la ordenación en una array a parte y luego ponerlos en la columna correspondiente, pero es casi el mismo caso.

    Por ello procedí a poner Enabled=flase al datagridview, aplicar los datos y volver a activar el control ... tengo que revisarlo mejor pero también daba problemas (el Sort de autoejecutaba aunque el datagridview estuviese desactivado) ???. Lo único que me cuadra es que el Sort no es del datagridview, pero entonces de donde ???????

    No se, esto me tiene muy descolocado.

    Saludos.


    • Editado Miguel_Po martes, 17 de septiembre de 2013 16:06
    martes, 17 de septiembre de 2013 15:17
  • Hola.

    Al final encontré una solución que parece funcionar razonablemente (al menos no da problemas), todo gracias a una idea de Eason_H.

    En resumen la solución no es eficiente, pero es lo único que he logrado y pruebas he hecho para aburrir:

    - saco el DataTable del dataGridView a una DataView y la ordeno

    - la DataView la llevo a un DataTable auxiliar

    - reseteo el dataGridView

    - copio al DataTable original el auxiliar

    - asigno el DataTable original al dataGridView de nuevo.

    Vamos esto no es eficiente y para una cosa que debería ser sencilla !!!!!!!!

    Saludos.


    • Editado Miguel_Po miércoles, 18 de septiembre de 2013 15:23
    miércoles, 18 de septiembre de 2013 15:22