因为DataTable比较方便,所以使用 DataTableDataGridView 负责显示, 设置DataGridView和 DataTable绑定.然后网络数据更新入 DataTable 后 , 发现DataGridView陷入假死状态. 不显示任何内容,鼠标显示繁忙.请问有没有什么办法?
为什么会有这种情况.
其实数据也不是很多.怎么办?
谢谢!

解决方案 »

  1.   

    "然后网络数据更新入 DataTable 后 , 发现DataGridView陷入假死状态. 不显示任何内容,鼠标显示繁忙."你是如何更新数据源的,把这部分代码贴出来。
      

  2.   

    DataGridView.DataSource是不是有多次给值 为DataTable的对象???
    你是怎么绑定的???上代码
      

  3.   


      void DataProvider_Realtime( REALTIMEDATAINFO realtimeInfo ,object originalInfo )
            {          
                var objParams = new object[vtName.Count];
                for( var i =0 ; i<vtName.Count ; i++)
                {
                    objParams[i] = norlib.Tools.GetMemberValue(realtimeInfo, vtName[i]);   
                }         
                dataTbl.Rows.Add(objParams );          
            }
      

  4.   

    绑定的地方就是    private void _InitDataView()
            {            
                var tpRealtimeInfo = typeof(REALTIMEDATAINFO);
                var fields = tpRealtimeInfo.GetFields();
                vtName.Clear();
                var arrDataTblKey = new DataColumn[1];            
                foreach (var field in fields)
                {               
                    foreach (Attribute attr in field.GetCustomAttributes(true))
                    {
                        var attrDesc = attr as DescriptionAttribute;
                        if (null == attrDesc)
                            continue;
                        var desc = attrDesc.Description;
                        var column = new DataGridViewTextBoxColumn();
                        column.HeaderText = desc;
                        dataGridView1.Columns.Add(column);
                        var datatblColumn = new DataColumn(desc, field.FieldType);
                        dataTbl.Columns.Add(datatblColumn);
                        vtName.Add(field.Name);         
                    }       
                }
                dataGridView1.DataSource = dataTbl;                    
            }
      

  5.   

    你既然用了实体类,为什么又转到DataTable里去了,这样绕圈子有意思吗?直接绑定到List<REALTIMEDATAINFO>会更加快。另外你数据处理可能太频繁,如果是那样,建议另外开一个线程处理,这样就可以解决界面假死问题。
      

  6.   

    请问怎么绑定 List<REALTIMEDATAINFO> , 我第一次用这个.
    另外开一个线程处理, 能否大致说一下. 
    因为现在就一句话:dataGridView1.DataSource = dataTbl; 
    我不知道怎么绑定到另外的线程
    谢谢
      

  7.   

    dataGridView1.DataSource=fields;
    dataGridView1.DataBind();
      

  8.   

    List<REALTIMEDATAINFO>  info=new List<REALTIMEDATAINFO>();dataGridView1.DataSource=info;
    dataGridView1.DataBind();
      

  9.   

    你是CS的 不能dataGridView1.DataBind()这样
      

  10.   

    你一次绑定的数据太多了吧 你可以跟一下 主要的事件花费到哪里了?
    1.取数据的时候   那就优化SQl语句
    2.走你绑定的方法的时候  那就优化算法  lz这里的问题可能出在两层forearch循环上了
    把能提到这个循环外面的东西 都在外面搞  甚至可以通过方法级的变量
      foreach (var field in fields)
                {               
                    foreach (Attribute attr in field.GetCustomAttributes(true))
                    {3.在获取到数据绑定到GridView上的这下慢  那可能就是你设置的gridview的属性的问题  把GridView的行、列自适应都给设置为False
      

  11.   


    开线程我会,现在的问题是:
    1.我是否应该在 新线程中获得数据,然后在新线程中把数据添加入DataTable
      可是我一旦添加入DataTable, 似乎DataGridView就自动更新,然后数据一多久假死了.2.当数据更新的时候,就是具有同一个PrimaryKey的时候, 如何更新数据, 而不是使用 DataTable.Rows.Add( newdata )
    我发现使用 Add函数总是添加了一条新纪录,而不是更新.
    我感到很困惑!
    谢谢.
      

  12.   


    非常感激您的回复.
    InitDataView() 只会调用一次,主要是初始化DataTable和DataGridView
    我试一下修改自适应为false
      

  13.   

    DataTable中数据如何更新?我设置了 PrimaryKey , 然后简单的调用 dataTable.Rows.Add(); 能否自动实现更新或者添加row?谢谢.
      

  14.   

    DGV  绑定数据时,只需要绑定一次, DGV 之后就会监视DataTable的——就是说,楼主没有 用 类似 for 循环的 重复绑定方式;---------------------------------
    楼主,确认一哈??!!
      

  15.   

    不能。 dataTable.Rows.Add 始终是新增行
      

  16.   


    嗯,数据绑定我只在 _InitDataView() 中做了一次 , 而 _InitDataView() 也只是被构造函数调用了一次, 反正就调用了一次绑定 DataSource
      

  17.   

    不用重新绑定,直接操作DataTble就可以了。
      

  18.   

    另外开现成处理数据,如果是DataTable,那么调用如下方法即可关闭界面的及时刷新。
    dt.BeginLoadData();
    然后设定一个时间间隔来刷新界面,调用如下方法:
    dt.EndLoadData();关于DataTable中数据如何更新中的数据更新,必须手动设置主键属性,然后直接用Add方法添加记录,那样就会自动识别是否主键存在,主键存在的情况下就会把原行内容修改。不可能出现你的那种情况,因为主键的存在,如果添加新纪录,会造成主键冲突,这是逻辑错误。
    注:Sandy945应该没用过DataTable,不然怎么连“dataTable.Rows.Add 始终是新增行”的错误都会出现???
      

  19.   

    我搞了很长时间,首先发现,我原来对DataTable的操作就是在 非主线程 中进行的。
    会假死的原因,我想了很多次。结合有些异常,有时候假死,
    很多情况是获取数据时,我同时点击DataGridView,或者拉动滚动条,会出现某个column 不能是null错误)
      

  20.   

    非常感谢!
    关于 rows.Add , 我试过了啊,如果主键重复,是会出现异常的,说是已经有一个同样的主键了。
      

  21.   

    http://stackoverflow.com/questions/667571/optimize-updates-to-datatable-bound-to-datagridview
      

  22.   

    想起来了,是当你删除后,再次添加的时候,会判断已经存在,并将原先删除的DataRow修改状态从已删除改为修改。如果未删除,则重复添加直接报错,一般是先调用Find方法,如果能返回一个DataRow,则直接修改这个DataRow,否则调用Add方法添加。另外你说已经是多线程执行了,那么就是BeginLoadData()和EndLoadData()没有调用的关系了。频繁更新数据源的时候,必须使用BeginLoadData()来屏蔽通知,然后对DataTable修改,数据源更新完毕一次性调用EndLoadData()启用通知,告知界面来显示这个更新的数据源。
      

  23.   

    我应该已经解决假死的问题了,稍后我会写一个blog,希望后来人可以少走弯路!另外,请问如何阻止 DataGridView Commit我虽然已经设置 Readonly = True , 但是如果我乱点 DataGridView 的Cell ,还是会抛出 Commit失败的异常。
      

  24.   

    还有一个问题,就是 当 DataTable 中的数据改动时, DataGridView也会做出相应改变.但是我无法收到DataGridView改动数据的消息
    CellValueChanged 无法被触发.
    请问怎么办!!!!?????
      

  25.   

    CellValueChanged 必须是界面上修改才会触发的消息,数据源更改不会触发。因为你是数据源的修改,那么只能在数据源上面考虑,界面的控件能触发的事件很少。