2010-09-22 29 views
8

Tôi đang mắc kẹt với vấn đề này của tôi và nó sẽ được giúp đỡ rất nhiều nếu ai đó giải quyết vấn đềĐang cập nhật DataGridView qua một sợi khi di chuyển

này cho tôi

Những gì tôi đang cố gắng làm là:

1) Intialize một DataTable DataTable trong trường hợp hình thức tải và gán defaultview của mình cho một dataGridView

dgvresult

2) trên bấm vào một nhưng tấn bắt đầu một chủ đề STA (Tôi đang thực sự làm việc với WatiN IE vì vậy cần phải

để làm các STA thread) trong đó kêu gọi một phương pháp mà tạo ra một giống DataTable

dt như DataTable tạo ở bước 1 và sau đó thêm 300 các hàng này có thể định dạng được.

3) gọi một đại biểu mà kết hợp dt này với DataTable và do đó cập nhật các dgvresult Vâng đây là vấn đề của tôi:

Dưới đây là một số câu liên mã cho bước tôi vừa mô tả:

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()); 
    } 
} 

/// frmmain code

/// <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(); 
      } 
     } 
    } 

Bây giờ vấn đề phát sinh khi tôi có nhiều hàng trong datagridview (giả sử 1000)

Bây giờ nếu trong UI Tôi không làm bất cứ điều gì với DataGridView mã này hoạt động tốt mà không có lỗi

Nhưng nếu tôi tiếp tục di chuyển các datgridview khi các phương pháp ràng buộc được gọi là ứng dụng cho lỗi và chỉ chấm dứt do sự thất bại của mình để cập nhật các datgridview tôi cho rằng (hoặc có thể do thất bại trong cách gọi các datagridview)

Dưới đây là các lỗi: - Khi tôi chạy exe tôi có được điều này: -

Unhandled ngoại lệ đã xảy ra trong ứng dụng của bạn.

Tham chiếu đối tượng không được đặt thành đối tượng.

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) 

Tôi đã kiểm tra thông qua VS, Lỗi này đưa ra trong Program.cs trong dòng này: - Application.Run(new frmMain());

Cách khắc phục sự cố này?

Mọi trợ giúp sẽ được đánh giá cao. cảm ơn :)

+0

lỗi gì là bạn nhận được? – svick

+1

Hey Cảm ơn bạn đã trả lời. Tôi đã chỉnh sửa câu hỏi để bao gồm lỗi quá –

Trả lời

2

bạn nên thử

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

thay vì

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

trong bind_DataTable_to_GridView()

+0

Xin chào các bạn! Cảm ơn bạn đã giúp đỡ .... nhưng tôi vẫn nhận được cùng một lỗi .... this.Invoke (del, new object [] {dt}); didnt giải quyết được vấn đề –

Các vấn đề liên quan