2013-08-01 32 views
2

是否有可能使用多線程從DataGridView中讀取數據。或者還有其他方法嗎?任何人都可以給我一個例子或概念?datagridview在c中的多線程#

我想從datagridview中逐行讀取數據。並將每行作爲參數傳遞給方法。

請幫我在這...

+0

那麼該方法會觸發一次?或者你是否每行都運行某種條件匹配的方法? – Derek

+0

您使用的是MVVM模式嗎?如果是這種情況,則可以迭代視圖模型中用於綁定視圖中的dataGrid的列表或observableCollection屬性的每個元素。 –

回答

1

你要讀取的數據是不是?你爲什麼不只是從基礎數據源讀取呢?可能是一個數據表。

如果你能讓我更清楚你正在嘗試的場景,將有助於提供更好的解決方案。由於數據表綁定到網格,您需要通過UI線程訪問它。

以下是使用任務的示例代碼。

public Task<DataRow> ReadData(DataTable table, int rowId) 
    { 
     return Task<DataRow>.Factory.StartNew(() => table.Rows[rowId]); 
    } 

你需要同步機制來訪問此行,自不同的線程運行,

0

//定義一個線程,deligate,列表中的

 public List<string> temp_list= new List<string>(); 
     public Thread Run_thread = null, run1 = null; 
     private delegate void UpdateDelegate(); 

//啓動線程形式加載事件...然後暫停它,直到你想開始...

 run1 = new Thread(new ThreadStart(run_tab)); 
     run1.IsBackground = true; 
     run1.Start(); 

     Datagridview dg = new Datagridview(); 
     dg.Rows.Add(); 

// this below function will wil當你按下按鈕一些L爲觸發.....,它會啓動線程來完成其工作..

private void Btn_run_Click(object sender, EventArgs e) 
    { 
     if (run1.ThreadState == System.Threading.ThreadState.Aborted) 
     { 
      try 
      { 
       myResetEvent.Reset(); 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Exception message:" + ex.Message); 
       } 
      } 
      else 
      { 
       try 
        { 
        myResetEvent.Set(); 
        } 
        catch (Exception ex) 
        { 
        throw new Exception("Exception message:" + ex.Message); 
        } 
      } 
    } 

//後添加幾行你想線程應該從GridView控件通過每個行的值給部分方法。

 private void run_tab() 
      { 

       while (true) 
       { 
       myResetEvent.WaitOne(); 

//直到你按下按鈕一些或其他一些事件或意思是說,當你想線程開始做它的操作

這上面的命令將停止執行的線程//按我的appraoch讀一旦完成gridview的行,一旦它完成,然後使用這些值運行後臺線程所有的值存儲在臨時表..

  if (InvokeRequired) 
        { 
       Invoke(new UpdateDelegate(
        delegate 
        { 
         int rowcount = dg.Rows.Count; 

        for (b = 0; b < rowcount; b++) 
         { 
         string temp= dg.Rows[b].Cells[0].Value.ToString(); 
         temp_List.Add(type1); 
         } 
        }) 
        ); 
       } 

//現在臨時存儲完成.... //現在要做的正常的線程工作.....

  for (int i = 0; i < temp_List.Count; i++) 
        { 
       // some moethod xyz where u want o pass those values 
        method_XYZ(temp_List[i]); 
        } 


    } 
    } 

希望這會給一些解決問題的方法...

0

不,它不是安全上比主UI線程以外的任何線程訪問DataGridView(或任何爲此事Control) 。這包括從控制器讀取數據。你無法安全地做到這一點。

您需要做的是維護一個單獨的數據結構,該數據結構保存數據並從中讀取數據。這是額外的工作,因爲現在您必須保持DataGridView與其他數據結構同步。如果您手動將行添加到網格,那麼它可能很容易。如果你是數據綁定網格(通過BindingList或其他),那麼它可能會有點棘手。

請記住,涉及Contol.Invoke的技巧不會實現併發讀取行爲,因爲實際讀取將被封送到UI線程中。你不妨完全避免使用多線程。但是,您可能能夠做的是在UI線程上單獨讀取數據行,將它們複製到POCO數據結構中,然後將POCO對象穿梭到您想調用的方法並使其在Task中執行或退出工作線程。

+0

感謝您的回覆... [鏈接](http://stackoverflow.com/questions/18015371/multithreading-with-datagridview-c-sharp)請通過此鏈接,並回答我的問題... – yasmuru