2010-09-22 24 views
8

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 :)

+0

¿Qué error te va? – svick

+1

Hola Gracias por responder. Edité la pregunta para incluir también el error –

Respuesta

2

usted debe tratar

this.Invoke(del, new object[] { dt }); //Should Work 

en lugar de

dgvResult.Invoke(del, new object[] { dt }); //Error 

en bind_DataTable_to_GridView()

+0

¡Hey regexhacks! Gracias por la ayuda .... pero sigo recibiendo el mismo error .... this.Invoke (del, new object [] {dt}); didnt resuelto el problema –

Cuestiones relacionadas