2011-01-10 24 views
14

¿Cómo puedo suspender que un .NET DataGridView muestre algo mientras actualizo sus Columnas?Cómo suspender un DataGridView mientras actualiza sus columnas

Aquí está mi código actual. Funciona bien, pero es muy lento en el ciclo foreach; puede ver que la barra de desplazamiento horiz crece lentamente a medida que se agrega cada columna. Estoy construyendo las columnas de la interfaz de usuario yo mismo, ya que no quiero usar dataGridView1.AutoGenerateColumns por varias razones.

// Disconnect and reset DataGridView 
dataGridView1.DataSource = null; 
dataGridView1.SuspendLayout(); 
dataGridView1.Columns.Clear(); 

// Get data from SQL 
DataTable dt = new DataTable(); 
SqlDataAdapter adapter = new SqlDataAdapter("select * from employeehist", conn); 
adapter.Fill(dt); 

// Build DataGridView columns 
foreach (DataColumn c in dt.Columns) 
{ 
    DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn(); 
    col.SortMode = DataGridViewColumnSortMode.NotSortable; 
    col.DataPropertyName = c.ColumnName; 
    col.HeaderText = c.Caption; 
    dataGridView1.Columns.Add(col); 
} 

// Reconnect DataGridView 
dataGridView1.DataSource = dt; 
dataGridView1.ResumeLayout(true); 
+0

Hmm. Eso debería hacerlo ... Intenta colocar 'dataGridView1.DataSource = null' después de la llamada SuspendLayout? ¿Esperas que las columnas cambien entre dos solicitudes? De lo contrario, es posible que desee eliminar por completo la creación de columna de este método. –

+0

Sí, el recuento de columnas puede cambiar. El conjunto de resultados consultados puede variar según el rango de fechas que el usuario seleccione. Además, traté de mover el '= null' y no ayudó. Sin embargo, gracias, – Lane

+0

@Lane, tengo el mismo problema, pero no la vista de la cuadrícula de datos. Estoy usando GridView para enlazar datos, y durante el ciclo, es extremadamente lento, y GridView no tiene la función Columns.AddRange ... ¿se pregunta por qué y cómo lo solucionó para su caso? Gracias. – Princa

Respuesta

3

Puede usar VirtualMode con DataGridView para actualizar la cuadrícula de manera muy eficiente. Ver este artículo: http://msdn.microsoft.com/en-us/library/ms171622.aspx

Por lo que recuerdo, parece actualizar toda la colección antes de actualizar cualquier cosa en la interfaz de usuario, en lugar de agregar a la interfaz de usuario para cada nueva fila agregada/etc.

+0

Aquí hay un tutorial: http://msdn.microsoft.com/en-us/library/15a31akc.aspx Se necesita un poco más de trabajo para configurarlo, pero debería ser mucho más rápido una vez implementado. – ferr

2

Es posible que desee considerar el uso del método AddRange en lugar de Agregar. La cuadrícula de datos se comporta un poco mejor cuando los agrega todos a la vez.

DataGridViewColumn[] columns = new DataGridViewColumn[dt.Columns.Count]; 

for (int i = 0; i < dt.Columns.Count; i++) 
{ 
    DataColumn c = dt.Columns[i]; 
    DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn(); 
    col.SortMode = DataGridViewColumnSortMode.NotSortable; 
    col.DataPropertyName = c.ColumnName; 
    col.HeaderText = c.Caption; 

    columns[i] = col; 
} 


dataGridView1.Columns.AddRange(columns); 
+1

Buena idea, pero todavía tengo el mismo retraso exacto. Se retrasa en una línea: dataGridView1.Columns.AddRange (columnas); – Lane

+1

También asegúrese de utilizar insertar al principio: 'dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;' ya que de lo contrario, esto realmente ralentiza las cosas. –

1

Se podría tratar de evitar que se vuelva a dibujar completamente utilizando el código en this puesto. El parent sería el padre del dataGridView1.

+1

wow nunca pensó en usar SendMessage. –

+2

Intenté esto pero no me ayudó de manera extraña. El dibujo estaba claramente suspendido, pero cronometré al mismo tiempo. Parece que DataGridView sigue dibujando en segundo plano si el dibujo se ha suspendido o no. – Lane

2

En mi caso, suspender y reanudar el diseño no funcionó. Resolví deshabilitar dataGridView (dgv.Enabled = false) antes de actualizar y volver a habilitarlo (dgv.Enabled = true) al final del proceso de actualización.

+0

Otro enfoque útil se puede encontrar aquí: http://stackoverflow.com/questions/1550293/stopping-textbox-flicker-during-update Busque LockWindowUpdate ... – mike

0

Si está utilizando el temporizador, utilice SynchronizingObject. Esto elimina el parpadeo completamente para mí.

var dgv = new DataGridView(); 
System.Timers.Timer timer = new System.Timers.Timer(); 
timer.Interval = 1000; 
timer.SynchronizingObject = dgv; // syncronise 
timer.Start(); 
timer.Elapsed += Timer_Elapsed; 
void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    refreshDGV(); // in here I refresh the DataGridView 
} 
0

aumento de rendimiento significativo:

var dgv = new DataGridView(); 
dgv.SuspendLayout(); 
// Do update, change values 
dgv.ResumeLayout(); 

No puede ser última de alto rendimiento.

Cuestiones relacionadas