DataGridView 和 DataTable 绑定后, DataTable频繁更新,DataGridView假死

norsd 2011-12-16 11:00:25
因为DataTable比较方便,所以使用 DataTable

DataGridView 负责显示, 设置DataGridView和 DataTable绑定.

然后网络数据更新入 DataTable 后 , 发现DataGridView陷入假死状态. 不显示任何内容,鼠标显示繁忙.

请问有没有什么办法?
为什么会有这种情况.
其实数据也不是很多.

怎么办?
谢谢!
...全文
692 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2011-12-20
  • 打赏
  • 举报
回复
CellValueChanged 必须是界面上修改才会触发的消息,数据源更改不会触发。因为你是数据源的修改,那么只能在数据源上面考虑,界面的控件能触发的事件很少。
norsd 2011-12-20
  • 打赏
  • 举报
回复
还有一个问题,就是 当 DataTable 中的数据改动时, DataGridView也会做出相应改变.

但是我无法收到DataGridView改动数据的消息
CellValueChanged 无法被触发.
请问怎么办!!!!?????
norsd 2011-12-18
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 qldsrx 的回复:]

另外开现成处理数据,如果是DataTable,那么调用如下方法即可关闭界面的及时刷新。
C# code
dt.BeginLoadData();

然后设定一个时间间隔来刷新界面,调用如下方法:
C# code
dt.EndLoadData();


关于DataTable中数据如何更新中的数据更新,必须手动设置主键属性,然后直接用Add方法添加记录,那样就会自动识别是否主键存在,主……
[/Quote]
非常感谢!
关于 rows.Add , 我试过了啊,如果主键重复,是会出现异常的,说是已经有一个同样的主键了。
norsd 2011-12-18
  • 打赏
  • 举报
回复
我搞了很长时间,首先发现,我原来对DataTable的操作就是在 非主线程 中进行的。
会假死的原因,我想了很多次。

结合有些异常,有时候假死,
很多情况是获取数据时,我同时点击DataGridView,或者拉动滚动条,会出现某个column 不能是null错误)
qldsrx 2011-12-18
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 norsd 的回复:]
非常感谢!
关于 rows.Add , 我试过了啊,如果主键重复,是会出现异常的,说是已经有一个同样的主键了。[/Quote]
想起来了,是当你删除后,再次添加的时候,会判断已经存在,并将原先删除的DataRow修改状态从已删除改为修改。如果未删除,则重复添加直接报错,一般是先调用Find方法,如果能返回一个DataRow,则直接修改这个DataRow,否则调用Add方法添加。

另外你说已经是多线程执行了,那么就是BeginLoadData()和EndLoadData()没有调用的关系了。频繁更新数据源的时候,必须使用BeginLoadData()来屏蔽通知,然后对DataTable修改,数据源更新完毕一次性调用EndLoadData()启用通知,告知界面来显示这个更新的数据源。
qldsrx 2011-12-18
  • 打赏
  • 举报
回复
你没有编辑,怎么可能会有提交动作啊?是不是代码哪里写得不好,没看到代码不好说。
norsd 2011-12-18
  • 打赏
  • 举报
回复
我应该已经解决假死的问题了,稍后我会写一个blog,希望后来人可以少走弯路!

另外,请问如何阻止 DataGridView Commit

我虽然已经设置 Readonly = True , 但是如果我乱点 DataGridView 的Cell ,还是会抛出 Commit失败的异常。
norsd 2011-12-18
  • 打赏
  • 举报
回复
http://stackoverflow.com/questions/667571/optimize-updates-to-datatable-bound-to-datagridview
qldsrx 2011-12-17
  • 打赏
  • 举报
回复
另外开现成处理数据,如果是DataTable,那么调用如下方法即可关闭界面的及时刷新。
dt.BeginLoadData();

然后设定一个时间间隔来刷新界面,调用如下方法:
dt.EndLoadData();


关于DataTable中数据如何更新中的数据更新,必须手动设置主键属性,然后直接用Add方法添加记录,那样就会自动识别是否主键存在,主键存在的情况下就会把原行内容修改。不可能出现你的那种情况,因为主键的存在,如果添加新纪录,会造成主键冲突,这是逻辑错误。
注:Sandy945应该没用过DataTable,不然怎么连“dataTable.Rows.Add 始终是新增行”的错误都会出现???
fhpu168 2011-12-16
  • 打赏
  • 举报
回复
dataGridView1.DataSource=fields;
dataGridView1.DataBind();
norsd 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qldsrx 的回复:]

你既然用了实体类,为什么又转到DataTable里去了,这样绕圈子有意思吗?直接绑定到List<REALTIMEDATAINFO>会更加快。

另外你数据处理可能太频繁,如果是那样,建议另外开一个线程处理,这样就可以解决界面假死问题。
[/Quote]
请问怎么绑定 List<REALTIMEDATAINFO> , 我第一次用这个.
另外开一个线程处理, 能否大致说一下.
因为现在就一句话:dataGridView1.DataSource = dataTbl;
我不知道怎么绑定到另外的线程
谢谢
qldsrx 2011-12-16
  • 打赏
  • 举报
回复
你既然用了实体类,为什么又转到DataTable里去了,这样绕圈子有意思吗?直接绑定到List<REALTIMEDATAINFO>会更加快。

另外你数据处理可能太频繁,如果是那样,建议另外开一个线程处理,这样就可以解决界面假死问题。
norsd 2011-12-16
  • 打赏
  • 举报
回复
绑定的地方就是

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;
}
norsd 2011-12-16
  • 打赏
  • 举报
回复
dataTbl 就是 DataTable
norsd 2011-12-16
  • 打赏
  • 举报
回复

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 );
}
bearlin081001 2011-12-16
  • 打赏
  • 举报
回复
说不定是无限循环哪,哈哈
  • 打赏
  • 举报
回复
DataGridView.DataSource是不是有多次给值 为DataTable的对象???
你是怎么绑定的???上代码
sdl2005lyx 2011-12-16
  • 打赏
  • 举报
回复
"然后网络数据更新入 DataTable 后 , 发现DataGridView陷入假死状态. 不显示任何内容,鼠标显示繁忙."

你是如何更新数据源的,把这部分代码贴出来。。。。
阿非 2011-12-16
  • 打赏
  • 举报
回复
绑定个副本试试

DataTable.Copy()
DENQH 2011-12-16
  • 打赏
  • 举报
回复
不用重新绑定,直接操作DataTble就可以了。
加载更多回复(13)

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧