【发布时间】:2011-02-16 19:25:04
【问题描述】:
我有一个问题。我有具有动态生成布局的 Windows 窗体应用程序,但性能有问题。在这种形式中,我使用来自.NET 4.0 的DataBinding 并且设置后的数据绑定工作正常,但他为 ONE 控件绑定设置时间在大约 0.7 秒时阻塞了我的应用程序。 我有一些控件,设置 binging 的时间约为 2 分钟。
我尝试了所有可能的解决方案,如果不编写自绑定类,我没有任何想法。 为什么我的代码有问题?
case "Boolean":
{
Binding b = new Binding("Checked", __bindingsource, __ep.Name);
CheckBox cb = new CheckBox();
/*
* HERE is the start of problem
*/
cb.DataBindings.Add(b);
/*
* HERE is the end of problem
*/
__flp.Controls.Add(cb);
__bindingcontrol.AddBinding(b);
break;
}
没有问题的代码行都可以快速运行且无需绑定;-(但我希望以正常速度打开绑定。
PS1。我在生成时暂停了布局。
PS2。我在绑定 TextBox'es、PictureBoxe、CheckBox 时遇到了同样的问题。
如何做到这一点,或者更小的如何调试问题,vs2010 分析器说只有绑定问题,我知道。
- System.Windows.Forms.Control.ControlCollection.Add(类 System.Windows.Forms.Control)
- System.Windows.Forms.ControlBindingsCollection.Add(类 System.Windows.Forms.Binding)
编辑:DataContext 来自数据库。 (实体框架)
【问题讨论】:
-
__bindingsource在看什么? -
@Marc Gravell: __bindingsource 是一个 System.Windows.Forms.BindingSource,他以其他形式声明并绑定到该表单中的 DataGridView,并在构造函数参数中传递给该表单(动态) .
-
Entity Framework 查询是惰性的,这在您的情况下意味着它们仅在绑定时执行(除非您之前强制运行它们)(顺便说一下,它们甚至可能在绑定时执行两次)。因此,如果查询很复杂,从逻辑上讲,您会在您提到的那一行中看到性能问题。那么,您能否向我们展示一下您的查询的构造逻辑,以及有关容量的指示?
-
@Marcanpilami:我试试这个,我给你反馈,但是你有什么办法让实体框架变得懒惰?;-)
-
@Svisstack:要强制执行,只需使用 Execute() 函数 (msdn.microsoft.com/en-us/library/bb738469.aspx) 并绑定到函数结果。您还可以使用任何会导致评估 IEnumerables 的函数,例如 ToList(但在这种情况下,将无法创建双向绑定)。
标签: c# winforms performance data-binding