estoy atascado con este problema de las minas y será de gran ayuda si alguien resuelve este problemaDataGridView actualización a través de un hilo cuando se desplaza
para mí
Lo que estoy tratando de hacer es:
1) inicializar una tabla de datos DataTable en el evento de carga del formulario y asignar su DefaultView a un DataGridView
dgvresult
2) el clic de un pero tonelada iniciar un subproceso STA (en realidad estoy trabajando con Watin IE de ahí la necesidad
para hacer la STA hilo), que llama a un método que crea una idéntica DataTable
dt como tabla de datos creada en el paso 1 y luego se agrega 300 filas a esta tabla de datos
3) llama a un delegado que se funde esta dt con tabla de datos y por lo tanto actualiza la dgvresult Bueno, aquí es mi problema:
Aquí está el fragmento de código para los pasos que acabo de describir:
static class Program
{
/// <summary>
/// The main entry point for the application.This method is made STAThread as I need to intialize WatIN IE in the form load of frmMain
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
}
/// código frmMain
/// <summary>
/// Delegate which Binds updated Datatable to gridview
/// </summary>
/// <param name="dt">The Datatable to be merged with main datatable</param>
delegate void Bind_DataTable_to_GridView_Delegate(DataTable dt);
private void bind_DataTable_to_GridView(DataTable dt)
{
if (dgvResult.InvokeRequired)
{
Bind_DataTable_to_GridView_Delegate del = new Bind_DataTable_to_GridView_Delegate(bind_DataTable_to_GridView);
dgvResult.Invoke(del, new object[] { dt });
}
else
{
datatable.Merge(dt);
dgvResult.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; //Autosizes the gridview
foreach (DataGridViewColumn dgvcol in dgvResult.Columns)
{
dgvcol.SortMode = DataGridViewColumnSortMode.NotSortable;
}
}
}
WatiN.Core.IE ie;
private void frmMain_Load(object sender, EventArgs e)
{
//intialize WatIN IE
ie = new IE(URLs.mainURL);
//initialization of columns in datatable
DataColumn datacolumn1 = new DataColumn("Words");
//Adding of columns in datatable
datatable.Columns.Add(datacolumn1);
//Making the datatable permanent
datatable.AcceptChanges();
//Assigning default view of datatble as dgvResult's datasource
dgvResult.DataSource = datatable.DefaultView;
foreach (DataGridViewColumn dgvcol in dgvResult.Columns)
{
dgvcol.SortMode = DataGridViewColumnSortMode.NotSortable;
}
}
private void btnGenerateWords_Click(object sender, EventArgs e)
{
try
{
if (datatable.Rows.Count > 0)
{
//Initializes the GenerateWords Thread
GenerateWords = new Thread(GenW);
//Sets the apartment state to Static
GenerateWords.SetApartmentState(ApartmentState.STA);
//Starts the GenerateWords Thread
GenerateWords.Start();
}
}
#endregion
#region function of GenerateWords thread
/// <summary>
/// function of GenerateWords thread
/// </summary>
void GenW()
{
DataColumn datacolumn1 = new DataColumn("Words");
//Adding of columns in datatable
DataTable dt = new DataTable();
dt.Columns.Add(datacolumn1);
//At this point datatable has say 20 rows
for (int dtindex = 0; dtindex < datatable.Rows.Count; dtindex++)
{
/*Code Which adds successfully 300 fresh rows to dt*/
//sends datasource of dgvresult as dt
bind_DataTable_to_GridView(dt);
dt.Clear();
}
}
}
Ahora surge el problema cuando tengo muchas filas en DataGridView (supongamos 1000)
Ahora bien, si en la interfaz de usuario no hago nada con DataGridView este código funciona bien y sin errores
Pero si sigo el desplazamiento de la datgridview cuando se llama al método de enlace de la aplicación da error y simplemente termina debido a su falta de actualización la datgridview supongo (o tal vez debido a un fallo en la invocación del DataGridView)
Aquí está el error: - Cuando ejecuto el exe me sale esto: -
excepción no controlada se ha producido en su aplicación.
Referencia del objeto no establecida en un objeto.
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Windows.Forms.DataGridViewTextBoxCell.PaintPrivate(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState, Object formattedValue, String errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts, Boolean computeContentBounds, Boolean computeErrorIconBounds, Boolean paint)
at System.Windows.Forms.DataGridViewTextBoxCell.Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState, Object value, Object formattedValue, String errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
at System.Windows.Forms.DataGridViewCell.PaintWork(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
at System.Windows.Forms.DataGridViewRow.PaintCells(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow, DataGridViewPaintParts paintParts)
at System.Windows.Forms.DataGridViewRow.Paint(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow)
at System.Windows.Forms.DataGridView.PaintRows(Graphics g, Rectangle boundingRect, Rectangle clipRect, Boolean singleHorizontalBorderAdded)
at System.Windows.Forms.DataGridView.PaintGrid(Graphics g, Rectangle gridBounds, Rectangle clipRect, Boolean singleVerticalBorderAdded, Boolean singleHorizontalBorderAdded) at System.Windows.Forms.DataGridView.OnPaint(PaintEventArgs e)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.DataGridView.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
he comprobado a través de la VS, da este error en Program.cs en esta línea: - Application.Run(new frmMain())
;
¿Cómo evitar este problema?
Cualquier ayuda será apreciada. Gracias :)
¿Qué error te va? – svick
Hola Gracias por responder. Edité la pregunta para incluir también el error –