|
|
1
5
与所有其他控件一样,您必须更新主UI线程上的网格。参见控制。调用或控制。开始调用。 |
|
|
2
5
更新! 一、 部分地 找到了答案 第1部分 在《C#中的Pro.NET 2.0 Windows窗体和客户控件》一书中 我原本以为 刷新() 什么都没做,我需要打电话给 无效() 方法,告诉Windows在空闲时重新绘制我的控件。(通常是马上,但如果你需要重新粉刷的保证 现在 ,然后立即调用Update()方法。)
但是,事实证明 刷新() 方法只是以下内容的别名:
我发现的唯一问题是,如果dataGridView中没有数据,那么任何无效操作都不会刷新控件。我不得不重新分配数据源。在那之后,它工作得很好。但仅限于行数(或我的列表中的项)——如果添加了新项,dataGridView将不会意识到还有更多行要显示。 因此,当将数据源(列表或表)绑定到数据源时,dataGridView会对项目(行)进行计数,然后在内部设置,从不检查是否有新行/项目或删除的行/项目。这就是为什么重复绑定数据源以前是有效的。 现在,我们来了解如何更新dataGridView中显示的行数,而无需重新绑定数据源。..有趣,有趣,有趣! :-) 经过一番挖掘,我想我有了答案 第2部分 关于我的问题(又名安全多线程): 而不是使用 系统。计时器。定时器 ,我发现我应该使用 系统。窗户。形式。定时器 相反。 事件发生时,回调中使用的方法会自动发生在主线程上。没有跨线程问题! 声明如下:
方法如下:
|
|
|
3
3
看来你的答案就在那里! 只是在cawse中,你很好奇如何对ui进行跨线程调用: 所有控件都有一个Invoke()方法(或BEginInvoke(,如果你想异步执行操作),这用于在主UI线程的上下文中调用控件上的任何方法。 因此,如果你要从另一个线程调用你的datagridview,你需要执行以下操作:
|