2010-03-08 4 views
5

Kịch bản:C# Trợ giúp với một ví dụ sư phạm cơ bản của một quá trình BackgroundWorker Populating một DataGridView

Tôi có một hình thức cửa sổ chứa một DataGridWiew với 3 cột được xác định trước. Tôi có 3 biến được khai báo bên ngoài hàm và được gán cho bên trong hàm. Tôi có một chức năng đó liệt kê các công cụ và đặt nó trong 3 cột, từng dòng:

string VARIABLE1; 
string VARIABLE2; 
string VARIABLE3; 

private void FunctionEnumerateStuff() 
{ 
    foreach (StuffObject STUFF in StuffCollection) 
    { 
     VARIABLE1 = STUFF.SubStuff1.ToString(); 
     VARIABLE2 = STUFF.SubStuff2.ToString(); 
     VARIABLE3 = STUFF.SubStuff3.ToString(); 
     DatagridWiew1.Rows.Add(VALUE1, VALUE2, VALUE3); 
    } 
} 

Những gì tôi muốn làm, là để thực hiện chức năng này từ một quá trình BackGroundWorker, do đó giao diện của ứng dụng sẽ được mịn màng và đáp ứng. Tôi đã đọc trên nền tảng nhưng tôi gặp rắc rối liên quan, bởi vì tất cả các ví dụ có vẻ là hoàn toàn khác nhau kịch bản và hầu hết trong số họ là áp đảo phức tạp.

Có thể một số linh hồn sư phạm hữu ích giúp tôi và những người khác có một ví dụ rất cơ bản về cách làm cho điều này hoạt động theo cách đơn giản nhất có thể. Cảm ơn.

+0

gì là điều đó là chiếm rất nhiều thời gian? Tại sao làm cho nó không đồng bộ? Bạn có hàng chục ngàn hàng không? Bạn có gặp sự cố BÂY GIỜ với sự xáo trộn trong giao diện người dùng không? Có lẽ bạn có thể hiển thị mã thực sự của bạn, nếu đó là trường hợp. Mã bạn hiển thị ở đây sẽ không biên dịch. – Cheeso

+3

Tôi đã chọn không cụ thể về mã và TẠI SAO tôi muốn sử dụng một giải pháp với một nền tảng. Tôi đã chọn một "mã giả" chỉ để minh họa vấn đề và hy vọng nhận được câu trả lời sư phạm, và không phải là cách giải quyết. Tôi chosed để xây dựng câu hỏi của tôi theo cách này bởi vì tôi thực sự muốn tìm hiểu bằng một ví dụ cơ bản, không có ai khác viết giải pháp trong mã cho tôi. Tôi đã chọn ví dụ không cụ thể này, để hy vọng nhiều người khác trên mạng dường như đang phải vật lộn với sự nhầm lẫn tương tự cũng có thể liên quan và học hỏi từ nó. – Roger

+1

Bạn nhầm lẫn chúng tôi với những từ lạ lùng của bạn! Sư phạm: của, liên quan đến, hoặc kết hợp một giáo viên hoặc giáo dục :) – VoidDweller

Trả lời

1

Tôi sẽ sử dụng một cái gì đó như thế này (rất sơ sài và chưa được kiểm tra):

private void bgw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     var list = new List<SomeRowType>(); 

     foreach (StuffObject STUFF in StuffCollection) 
     { 
      VARIABLE1 = STUFF.SubStuff1.ToString(); 
      VARIABLE2 = STUFF.SubStuff2.ToString(); 
      VARIABLE3 = STUFF.SubStuff3.ToString(); 
      //DatagridWiew1.Rows.Add(VALUE1, VALUE2, VALUE3); 
      list.Add(new SomeRowType(VALUE1, VALUE2, VALUE3)); //probably meant: VARIABLEn 
     } 
     e.Result = list; 
    } 

    private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if (e.Error != null) 
     { 
     } 
     else 
     { 
      var list = (List<SomeRowType>)e.Result; 
      DatagridWiew1.DataSource = list; 
     } 
    } 
+0

Cảm ơn bạn Henk! Tôi sẽ thử ví dụ của bạn vào ngày mai. Đến cuối để mã hóa ngay bây giờ :) – Roger

1

Dưới đây là một ví dụ:

class Form1 : Form 
{ 
    private BackgroundWorker Worker { get; set; } 

    public Form1() 
    { 
     Worker = new BackgroundWorker(); 
     Worker.WorkerSupportsCancellation = true; 
     Worker.DoWork += OnWorkerDoWork; 
     Worker.RunWorkerCompleted += OnWorkerRunWorkerCompleted; 

     // at some point start the worker. 
     Worker.RunWorkerAsync(); 
    } 

    void OnWorkerDoWork(object sender, RunWorkerCompletedEventArgs e) 
    { 
     foreach(var data in someData) 
     { 
      // if cancelled 
      if (e.Cancelled) 
       return; 

      AddDataToColumn(someData.Var1, someData, Var2, someData.Var3); 
     } 
    } 

    void OnWorkerRunWorkerCompleted(object sender, DoWorkEventArgs e) 
    { 

    } 

    private delegate void AddDataToColumnDelegate(string var1, string var2, string var3); 
    private void AddDataToColumn(string var1, string var2, string var3) 
    { 
     // check if cross-thread operation 
     if (InvokeRequired) 
     { 
      Invoke(new AddDataToColumnDelegate(AddDataToColumn), var1, var2, var3); 
      return; 
     } 

     // Add data to column 
     dataGridView1.Rows.Add(var1, var2, var3); 
    } 
}