none
winform,DataGridView,数据源高速实时更新问题。 RRS feed

  • 问题

  • 问题是这样的,我用List<object>类型作为DataGridView的数据源。

    然后,我有好几个线程同时在高事更新List<object>数据源。我想在实时的展现在DataGridView的界面上。

    如果直接改的话,会报错,因为数据源在遍历的时候已经发生了更改。如果在遍历的时候保持同步,不让其它线程去更新,又影响到效率。

    求大神有没有更好的办法,尽可能做到两全其美(在不直接修改DataGridView控件的前提下)。


    让暴风雨来的更猛烈些吧...

    2014年10月27日 8:14

全部回复

  • 你好 番茄炒西红柿,

    WinForm程序使用的是STA模式,即单线程Mode。他的要求是创建控件的线程外的线程必须被封装到创建控件的线程中处理。为此提供了一下的一些方法Invoke, BeginInvoke, and EndInvoke

    这里Invoke用于同步方法,BeginInvoke用于异步方法

    所以在WinForm里因为我们有UI线程和BackGroundWorker的后台线程,一般是把数据操作放在后台线程里调用我所提到的方法来做操作。

    请问的代码里你是怎么做的数据操作呢?这对于我们了解你的问题最为关键。

    一些参考:

    http://stackoverflow.com/questions/6387941/how-to-update-datasource-of-datagridview-from-another-thread-in-c-sharp

    http://msdn.microsoft.com/en-us/library/3s8xdz5c(v=vs.80).aspx

    Regards,



    Barry
    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2014年10月29日 2:26
    版主
  • try
                {
                    lock (dgv_Tags)
                    {
                        Boolean isSearched = false;
    
                        foreach (DataGridViewRow item in dgv_Tags.Rows)
                        {
                            if (item.Cells["Key"].Value.Equals(tag_6C.EPC + "|" + tag_6C.TID))
                            {
                                item.Cells["clm_TotalCount"].Value = (Int64.Parse(item.Cells["clm_TotalCount"].Value.ToString()) + 1).ToString();
                                item.Cells["clm_ANT" + tag_6C.ANT_NUM].Value = (Int64.Parse(item.Cells["clm_ANT" + tag_6C.ANT_NUM].Value.ToString()) + 1).ToString();
                                isSearched = true;
                                break;
                            }
                        }
                        if (!isSearched)
                        {
                            dgv_Tags.Rows.Add(new object[] { tag_6C.EPC + "|" + tag_6C.TID, tag_6C.EPC, tag_6C.TID, tag_6C.UserData, tag_6C.TotalCount, tag_6C.ANT1_COUNT, tag_6C.ANT2_COUNT, tag_6C.ANT3_COUNT, tag_6C.ANT4_COUNT, tag_6C.RSSI });
                        }
                    }
    
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine("--------" + ex.Message);
                }
                finally
                {
                    
                }
    是这样的,这一块代码一个或多个线程返回数据,并更新Gridview是面的显示内容,尤其是要显示读取的速度。实时更新的速度太快,界面就直接就死掉了。不知道用GridView能不能实现这个问题。如果不能实现,是不是只有自己写自定义的控件来实现了?怎么实现有没有好一点儿的办法。尤其需求是要有排序,和选择列,有没有大神在呀。

    让暴风雨来的更猛烈些吧...

    2014年11月4日 7:58