2013-08-01 29 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