none
Problemas con DatagridView RRS feed

  • Pregunta

  • Cordial saludo, estoy desarrollando un proyecto en C# y SQL Server, esta desarrollado en 3 capas y en la capa presentación tengo un datagridview que utilizo para mostrar un listado de clientes que se encuentran guardados en la base de datos, cargo el datagridview y todo funciona excelente lo hago a través de un procedimiento almacenado que me alimenta un datatable y el datatable me llena el datagridview el inconveniente se me presenta al momento de moverme por el datagridview bajando hasta las ultimas filas o subiendo a las primeras con el teclado o ya sea con el ScrollBars y en ese momento es como si el refresco de la pantalla se congelara se mueve pero muy lentamente.

    Espero me puedan ayudar, de antemano muchísimas gracias.

    martes, 21 de noviembre de 2017 6:31

Respuestas

  • al crear el control o la nueva clase y compilar el proyecto este debería aparecer automáticamente en la barra de controles y desde allí arrastrar a tu formulario.

    otra cosa que puedes hacer es entrar al archivo Form?.Designer.cs y cambiar la propiedad del DataGridView al nuevo control ejemplo:


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    martes, 21 de noviembre de 2017 15:51
  • Cordial saludo, estoy desarrollando un proyecto en C# y SQL Server, esta desarrollado en 3 capas y en la capa presentación tengo un datagridview que utilizo para mostrar un listado de clientes que se encuentran guardados en la base de datos, cargo el datagridview y todo funciona excelente lo hago a través de un procedimiento almacenado que me alimenta un datatable y el datatable me llena el datagridview el inconveniente se me presenta al momento de moverme por el datagridview bajando hasta las ultimas filas o subiendo a las primeras con el teclado o ya sea con el ScrollBars y en ese momento es como si el refresco de la pantalla se congelara se mueve pero muy lentamente.

    Espero me puedan ayudar, de antemano muchísimas gracias.

    Hola Oscar,

    ya he tenido este tipo de problemas y lo he resuelto creando un control que herede del DataGridView y en el constructor cambio algunos estilos, prueba a ver si es tu caso tambien

    ejemplo:

    public class MyDataGridView : DataGridView {
        public MyDataGridView() {
            base.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            base.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            base.SetStyle(ControlStyles.ResizeRedraw, true);
            base.UpdateStyles();
        }
    }

    y en lugar de usar el DataGridView usaras este nuevo control MyDataGridView, prueba y nos comentas.

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    martes, 21 de noviembre de 2017 14:40

Todas las respuestas

  • Buenas,

    La sensación de lentitud es siempre que te mueves, o solo cuando estas cargando el datagridview y te mueves?

    Podrías ponernos el código con el que llenas el datagridview? 

    El problema se puede deber a que haces mucho trabajo en el hilo de la interfaz gráfica, y por eso da la sensación de frenarse o incluso congelarse (aunque realmente no lo esta haciendo). Viendo tu codigo podremos ponerte un ejemplo más concreto sobre como puedes hacerlo.

    Quedo a la espera de tu respuesta

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:


    martes, 21 de noviembre de 2017 8:52
  • Nro de registros? 

    Eventos que usas en tu datagridview? 

    Manejas otros controles que interactuan con el Datagridview? 

    Falta mucha información .


    Si necesitas ayuda sube tu avance de otro modo no puedo ayudarte , Suerte!

    martes, 21 de noviembre de 2017 13:47
  • Cordial saludo, estoy desarrollando un proyecto en C# y SQL Server, esta desarrollado en 3 capas y en la capa presentación tengo un datagridview que utilizo para mostrar un listado de clientes que se encuentran guardados en la base de datos, cargo el datagridview y todo funciona excelente lo hago a través de un procedimiento almacenado que me alimenta un datatable y el datatable me llena el datagridview el inconveniente se me presenta al momento de moverme por el datagridview bajando hasta las ultimas filas o subiendo a las primeras con el teclado o ya sea con el ScrollBars y en ese momento es como si el refresco de la pantalla se congelara se mueve pero muy lentamente.

    Espero me puedan ayudar, de antemano muchísimas gracias.

    Hola Oscar,

    ya he tenido este tipo de problemas y lo he resuelto creando un control que herede del DataGridView y en el constructor cambio algunos estilos, prueba a ver si es tu caso tambien

    ejemplo:

    public class MyDataGridView : DataGridView {
        public MyDataGridView() {
            base.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            base.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            base.SetStyle(ControlStyles.ResizeRedraw, true);
            base.UpdateStyles();
        }
    }

    y en lugar de usar el DataGridView usaras este nuevo control MyDataGridView, prueba y nos comentas.

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    martes, 21 de noviembre de 2017 14:40
  • Ponle paginación

    catalina bernal

    martes, 21 de noviembre de 2017 14:41
  • Ok, Muchas gracias por la pronta respuesta

    Aquí el procedure que utilizo para la consulta

    @Nit varchar (15)
    as
    select T.Id,T.Nit,T.Dv,T.CodeTipoDoc,T.Cliente,T.Fiador,T.Proveedor,T.Empleado,T.Otro,T.CodeContribuyente,T.CodeRegimen,
    T.PrimerNombre,T.SegundoNombre,T.PrimerApellido,T.SegundoApellido,T.Name,T.IdentificacionAlterna,
    T.Precios,T.AutorizaCredito,T.LimiteCredito,
    T.CodeCountry,P.Country,T.CodeDepartment,D.Department,T.CodeCity,C.City,T.Address,T.Mail,
    T.Mobile,T.Phone,T.Fax,T.Observation,T.State
    from Terceros T
    inner join Countries P on P.CodeCountry=T.CodeCountry
    inner join Departments D on D.CodeDepartment=T.CodeDepartment
    inner join Cityes C on C.CodeCity=T.CodeCity
    where T.Nit like @Nit + '%'
    order by Nit asc

    Capa.Data Visual Studio

    public DataTable ListNit(cdTerceros Terceros)
            {
                DataTable DtResultado = new DataTable("Terceros");
                SqlConnection sqlCon = new SqlConnection();
                try
                {
                    sqlCon.ConnectionString = ConfigConex.CnSql;
                    SqlCommand SqlCmd = new SqlCommand();
                    SqlCmd.Connection = sqlCon;
                    SqlCmd.CommandText = "TercerosListNit";
                    SqlCmd.CommandType = CommandType.StoredProcedure;
    
                    SqlParameter ParNit = new SqlParameter();
                    ParNit.ParameterName = "@Nit";
                    ParNit.SqlDbType = SqlDbType.VarChar;
                    ParNit.Size = 15;
                    ParNit.Value = Terceros.Nit;
                    SqlCmd.Parameters.Add(ParNit);
    
                    SqlDataAdapter SqlDat = new SqlDataAdapter(SqlCmd);
                    SqlDat.Fill(DtResultado);
                }
                catch (Exception ex)
                {
                    DtResultado = null;
                    MessageBox.Show(ex.Message + ex.StackTrace);
                }
                finally
                {
                    if (sqlCon.State == ConnectionState.Open) { sqlCon.Dispose(); sqlCon.Close(); }
                }
                return DtResultado;
            }

    Capa.Negocio Visual Studio

    public static DataTable ListNit(string nit)
            {
                cdTerceros Obj = new cdTerceros();
                Obj.Nit = nit;
                return Obj.ListNit(Obj);
            }

    Capa.Present Visual Studio

    Lleno el DatagridView

    void ListTerceros()
            {
                if (rbNit.Checked == true)
                {
                    dgvListTerceros.DataSource = cnTerceros.ListNit(txtSearch.Text.Trim());
                }
                else if (rbName.Checked == true)
                {
                    dgvListTerceros.DataSource = cnTerceros.ListName(txtSearch.Text.Trim());
                }
    
                ArregloListTerceros();
            }

    Arreglo la interfaz del DatagridView

    void ArregloListTerceros()
            {
                dgvListTerceros.Columns["Id"].Visible = false;
                dgvListTerceros.Columns["Nit"].HeaderText = "NIT";
                dgvListTerceros.Columns["Nit"].Width = 100;
                dgvListTerceros.Columns["Nit"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                dgvListTerceros.Columns["Dv"].HeaderText = "D.V";
                dgvListTerceros.Columns["Dv"].Width = 40;
                dgvListTerceros.Columns["Dv"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                dgvListTerceros.Columns["Dv"].DefaultCellStyle.BackColor = Color.Bisque;
                dgvListTerceros.Columns["CodeTipoDoc"].Visible = false;
                dgvListTerceros.Columns["Cliente"].HeaderText = "C";
                dgvListTerceros.Columns["Cliente"].Width = 30;
                dgvListTerceros.Columns["Fiador"].HeaderText = "F";
                dgvListTerceros.Columns["Fiador"].Width = 30;
                dgvListTerceros.Columns["Proveedor"].HeaderText = "P";
                dgvListTerceros.Columns["Proveedor"].Width = 30;
                dgvListTerceros.Columns["Empleado"].HeaderText = "E";
                dgvListTerceros.Columns["Empleado"].Width = 30;
                dgvListTerceros.Columns["Otro"].HeaderText = "O";
                dgvListTerceros.Columns["Otro"].Width = 30;
                dgvListTerceros.Columns["CodeContribuyente"].Visible = false;
                dgvListTerceros.Columns["CodeRegimen"].Visible = false;
                dgvListTerceros.Columns["PrimerNombre"].Visible = false;
                dgvListTerceros.Columns["SegundoNombre"].Visible = false;
                dgvListTerceros.Columns["PrimerApellido"].Visible = false;
                dgvListTerceros.Columns["SegundoApellido"].Visible = false;
                dgvListTerceros.Columns["Name"].HeaderText = "NOMBRE / NOMBRE COMERCIAL";
                dgvListTerceros.Columns["Name"].Width = 350;
                dgvListTerceros.Columns["IdentificacionAlterna"].HeaderText = "I. ALTERNA";
                dgvListTerceros.Columns["IdentificacionAlterna"].Width = 120;
                dgvListTerceros.Columns["IdentificacionAlterna"].DefaultCellStyle.BackColor = Color.Gainsboro;
                dgvListTerceros.Columns["Precios"].Visible = false;
                dgvListTerceros.Columns["AutorizaCredito"].Visible = false;
                dgvListTerceros.Columns["LimiteCredito"].Visible = false;
                dgvListTerceros.Columns["CodeCountry"].Visible = false;
                dgvListTerceros.Columns["Country"].HeaderText = "PAÍS";
                dgvListTerceros.Columns["Country"].Width = 130;
                dgvListTerceros.Columns["CodeDepartment"].Visible = false;
                dgvListTerceros.Columns["Department"].HeaderText = "DEPARTAMENTO";
                dgvListTerceros.Columns["Department"].Width = 130;
                dgvListTerceros.Columns["CodeCity"].Visible = false;
                dgvListTerceros.Columns["City"].HeaderText = "CIUDAD";
                dgvListTerceros.Columns["City"].Width = 130;
                dgvListTerceros.Columns["Address"].Visible = false;
                dgvListTerceros.Columns["Mail"].Visible = false;
                dgvListTerceros.Columns["Mobile"].HeaderText = "MÓVIL";
                dgvListTerceros.Columns["Mobile"].Width = 100;
                dgvListTerceros.Columns["Mobile"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                dgvListTerceros.Columns["Phone"].HeaderText = "TELÉFONO";
                dgvListTerceros.Columns["Phone"].Width = 100;
                dgvListTerceros.Columns["Phone"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                dgvListTerceros.Columns["Fax"].HeaderText = "FAX";
                dgvListTerceros.Columns["Fax"].Width = 100;
                dgvListTerceros.Columns["Fax"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                dgvListTerceros.Columns["Observation"].Visible = false;
                dgvListTerceros.Columns["State"].HeaderText = "ESTADO";
                dgvListTerceros.Columns["State"].Width = 100;
            }

    He realizado muchas pruebas con varias cantidades de registro (1-500-5000) y un datagridview sin modificaciones 100% default y mi experiencia sigue siendo la misma.

    Manejo un ContextMenuStrip pero sin el me pasa igual, como evento uso CellDobleClick para abrir un formulario de edición de ese registro seleccionado.

    Muchas gracias, quedo atento

    martes, 21 de noviembre de 2017 15:03
  • Hola, muchas gracias.

    He subido mas información.

    martes, 21 de noviembre de 2017 15:06
  • Hola, muchas gracias.

    He subido mas información.

    martes, 21 de noviembre de 2017 15:06
  • Hola Marvin E. Pineda, muchas gracias.

    Voy a probar y te comento.

    martes, 21 de noviembre de 2017 15:07
  • Buenas,

    Si que haces cosas en el hilo principal si... normal que te vaya a tirones... lo suyo seria que la obtencion de datos la hagas en un hilo aparte, y en el main simplemente muestres los datos, ya que el main es el unico hilo que puede gestionar los eventos del formulario.

    Una chapucilla que puedes hacer para salir del paso, es cambiar tu ListTerceros por

    void ListTerceros()
    {
        dgvListTerceros.BeginInvoke(new MethodInvoker(()=>
        {
            if (rbNit.Checked == true)
            {
                dgvListTerceros.DataSource = cnTerceros.ListNit(txtSearch.Text.Trim());
            }
            else if (rbName.Checked == true)
            {
                dgvListTerceros.DataSource = cnTerceros.ListName(txtSearch.Text.Trim());
            }
    
            ArregloListTerceros();
        }));
    }

    Con eso, vas a ejecutar el proceso de manera asíncrona, lo cual no va a freezear el formulario. 

    De todos modos, evalúa urgentemente utilizar otro hilo para gestionar la obtención y modificación de datos, dejando el hilo principal solo para la interfaz gráfica y sus eventos

    Nos comentas si tienes dudas

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:


    martes, 21 de noviembre de 2017 15:09
  • Hola Jorge Turrano

    He realizado la prueba pero sigue igual.

    void ListTerceros()
    {
        dgvListTerceros.BeginInvoke(new MethodInvoker(()=>
        {
            if (rbNit.Checked == true)
            {
                dgvListTerceros.DataSource = cnTerceros.ListNit(txtSearch.Text.Trim());
            }
            else if (rbName.Checked == true)
            {
                dgvListTerceros.DataSource = cnTerceros.ListName(txtSearch.Text.Trim());
            }
    
            ArregloListTerceros();
        }));
    }

    Gracias, quedo atento

    martes, 21 de noviembre de 2017 15:19
  • También probé quitando el arreglo y nada

    dgvListTerceros.BeginInvoke(new MethodInvoker(() =>
                {
                    if (rbNit.Checked == true)
                    {
                        dgvListTerceros.DataSource = cnTerceros.ListNit(txtSearch.Text.Trim());
                    }
                    else if (rbName.Checked == true)
                    {
                        dgvListTerceros.DataSource = cnTerceros.ListName(txtSearch.Text.Trim());
                    }
    
                }));

    martes, 21 de noviembre de 2017 15:21
  • De que volumen de datos estamos hablando? 500 rows? 15 mil rows?

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    martes, 21 de noviembre de 2017 15:24
  • He realizado pruebas con varias cantidades de rows el problemas pasa cuando el rows obliga a usar el Scroll del DatagridView osea cuando pasa de 15 o 20 rows que alcancen el la pantalla de PC.
    martes, 21 de noviembre de 2017 15:28
  • He realizado pruebas con varias cantidades de rows el problemas pasa cuando el rows obliga a usar el Scroll del DatagridView osea cuando pasa de 15 o 20 rows que alcancen el la pantalla de PC.
    probastes con la solución que te propuse?

    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    martes, 21 de noviembre de 2017 15:29
  • Intento subir una imagen pero no permite.

    https://www.dropbox.com/s/viw4podfp6t5ti1/datagridview%20error.jpg?dl=0

    Disculpa

    martes, 21 de noviembre de 2017 15:31
  • Okey,

    tu problema es con el scroll entonces? entendí mal el problema... lo siento

    Prueba la opción de Marvin E. Pineda , en lo que ha comportamiento y modificación de controles, es una persona que ha demostrado solido conocimiento (sin querer decir con esto que en el resto no lo tenga eh xD)

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:




    martes, 21 de noviembre de 2017 15:35
  • Hola acabo de probar me sale un mensaje

    No se puede cargar el elemento del cuadro de herramientas "MyDataGridView", se quitara del cuadro de herramientas.

    martes, 21 de noviembre de 2017 15:41
  • public class MyDataGridView: DataGridView
        {
            public MyDataGridView()
            {
                base.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
                base.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
                base.SetStyle(ControlStyles.ResizeRedraw, true);
                base.UpdateStyles();
            }
        }

    martes, 21 de noviembre de 2017 15:49
  • al crear el control o la nueva clase y compilar el proyecto este debería aparecer automáticamente en la barra de controles y desde allí arrastrar a tu formulario.

    otra cosa que puedes hacer es entrar al archivo Form?.Designer.cs y cambiar la propiedad del DataGridView al nuevo control ejemplo:


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    martes, 21 de noviembre de 2017 15:51
  • Hola, ya me funciono y mejoro al 200% aunque solo bajando a los últimos registros osea moviéndome de bajada pero de subida no mejoro mucho pero si mejoro algo.

    Que puedo hacer para mejorar d subida.

    Gracias

    martes, 21 de noviembre de 2017 16:05
  • A lo que voy subiendo es como que se mira 2 veces el mismo registro.
    martes, 21 de noviembre de 2017 16:06
  • A lo que voy subiendo es como que se mira 2 veces el mismo registro.

    si, ya he notado ese tipo de comportamiento, revise mis controles y una app donde muestro bastante información y no veo tal problema, pueda que sea también problema de la tarjeta gráfica no le podemos hechar toda la culpa a los controles, no digo que sea la tarjeta pero pueda que este molestando porque en algunas PC he visto tal comportamiento y en otras no.

    entonces, ponerle cabeza a algo que pueda estar siendo perjudicado por el hardware!!!... o que la PC no tenga suficientes recursos, deberías de ver el rendimiento de la PC mientras provocas el problema en la cuadricula para ver que recursos esta consumiendo más en ese momento.

    no te aseguro que sea, pero me he fijado.

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    martes, 21 de noviembre de 2017 16:27