Si estás utilizando el método
DataGridView.Rows.Add que toma cómo argumento el número de filas a crear, entonces el thread de la UI no se podrá actualizar hasta que finalice dicha operación de inserción de filas, por ende, la UI se congelará.
Habría que ver el código para poder comprobar el qué y cómo lo estás haciendo, ya que quizás haya otros problemas que estén derivando en esa congelación del thread, así que si no das más datos no se te puede ayudar a buscar la solución más eficiente para el problema que sea en cuestión.
De todas formas, puedes añadir las filas de manera asíncrona para solventar el problema de congelación, pero esto tomará bastante más tiempo en añadir todas las filas:
Public Class Form1
Private WithEvents bgw As New BackgroundWorker
Private Sub Button1_Click(sender As Object, e As EventArgs) _
Handles Button1.Click
DataGridView1.ColumnCount = 1
bgw.RunWorkerAsync()
End Sub
Sub DoRowAdd(ByVal dgv As DataGridView, ByVal row As DataGridViewRow)
If dgv.InvokeRequired Then
dgv.Invoke(Sub() dgv.Rows.Add(row))
Else
dgv.Rows.Add(row)
End If
End Sub
Sub Work(ByVal sender As Object, ByVal e As EventArgs) _
Handles bgw.DoWork
For rowIndex As Integer = 0 To Short.MaxValue
Dim row As New DataGridViewRow
row.Cells.Add(New DataGridViewTextBoxCell With {.Value = rowIndex})
Me.DoRowAdd(Me.DataGridView1, row)
Next rowIndex
End Sub
End Class
Otra alternativa sería añadir las filas una a una cómo en el ejemplo anterior, pero utilizando el método
Application.DoEvents para que tras cada inserción se procese el resto de mensajes (eventos) en cola para actualizar la UI;
el tiempo que se toma en crear las filas es practicamente el mismo que en el ejemplo de arriba.
DataGridView1.Columns.Add(String.Empty, String.Empty)
For rowIndex As Integer = 0 To Short.MaxValue
DataGridView1.Rows.Add({rowIndex})
Application.DoEvents()
Next rowIndex
También lo que puedes hacer al utilizar el método
DataGridView.Rows.Add que toma cómo argumento el número de filas a crear, es suspender la lógica del layout del control, esto aceleraría bastante el tiempo que tarda en agregar todas las filas, pero obviamente no se desbloquearía la UI.
DataGridView1.Columns.Add(String.Empty, String.Empty)
DataGridView1.SuspendLayout()
DataGridView1.Rows.Add(Short.MaxValue)
DataGridView1.ResumeLayout()
EDITO: Ups, perdón, no me di cuenta que lo preguntaste en C#, aquí tienes una conversión online:
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public class Form1
{
private BackgroundWorker withEventsField_bgw
= new BackgroundWorker
(); private BackgroundWorker bgw {
get { return withEventsField_bgw; }
set {
if (withEventsField_bgw != null) {
withEventsField_bgw.DoWork -= Work;
}
withEventsField_bgw = value;
if (withEventsField_bgw != null) {
withEventsField_bgw.DoWork += Work;
}
}
}
private void Button1_Click(object sender, EventArgs e)
{
DataGridView1.ColumnCount = 1;
bgw.RunWorkerAsync();
}
public void DoRowAdd(DataGridView dgv, DataGridViewRow row)
{
if (dgv.InvokeRequired) {
dgv.Invoke(() => dgv.Rows.Add(row));
} else {
dgv.Rows.Add(row);
}
}
public void Work(object sender, EventArgs e)
{
for (int rowIndex = 0; rowIndex <= short.MaxValue; rowIndex++) {
DataGridViewRow row
= new DataGridViewRow
(); row
.Cells.Add(new DataGridViewTextBoxCell
{ Value
= rowIndex
}); this.DoRowAdd(this.DataGridView1, row);
}
}
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================
Considero que los otros dos ejemplos no necesitan una conversión a C# para entenderlos.
Saludos!