【问题标题】:Slow Databinding setup time in C# .NET 4.0C# .NET 4.0 中的数据绑定设置时间慢
【发布时间】:2011-02-16 19:25:04
【问题描述】:

我有一个问题。我有具有动态生成布局的 Windows 窗体应用程序,但性能有问题。在这种形式中,我使用来自.NET 4.0DataBinding 并且设置后的数据绑定工作正常,但他为 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 分析器说只有绑定问题,我知道。

  1. System.Windows.Forms.Control.ControlCollection.Add(类 System.Windows.Forms.Control)
  2. 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


【解决方案1】:

这个工作并不快,因为__bindingsource 有很多元素。 Binding 不能很好地处理大型收藏,这是一个问题。

__bindingsource 是一个 BindingSource 类。并且必须有更少的元素来快速工作。我解决了这个问题,为每个 BindingSet 创建了另一个新的BindingSource 实例(我的意思是只用一个元素将多个元素绑定到一个对象的属性),只有这个我想要使用。 p>

【讨论】:

    【解决方案2】:

    我也有这个问题。我将DataSourceUpdateMode 设置为Never(在Binding-class 构造函数中):然后性能要好得多。如果您不需要更新数据源,这是正确的方法。

    此性能问题是由触发的验证事件引起的。即使控件失去焦点或被单击,这也会触发验证事件,这会大大降低应用程序的性能。

    编辑:虽然我没有绑定到 EntityFramework,但性能非常糟糕。将DataSourceUpdateMode 设置为Never 会减少触发的事件数量。将 DataSourceUpdatedMode 设置为 Never 后,更新将是单向的:从 DataSource 到 Control。

    【讨论】:

    • 我必须有 DataBinding OneTime 从 DataSource 到 Control 并始终从 Control 到 DataSource 并验证数据,因为在其他情况下我会出现 sql 错误。
    【解决方案3】:

    不确定这是否是您的问题,但如果触发“事件风暴”,绑定可能需要很长时间。也就是你绑定到控件A,触发控件B的变化,触发控件A的变化....

    要检查的一件事是您正在更新的控件上的事件。

    另一件事是,从您的 cmets 看来,您在表单之间共享 __bindingsource。这可能是问题的根源。你为什么做这个?为每个表单使用绑定源将使您的程序更易于管理。

    【讨论】:

    • 我使用相同的 bindingsource,因为我想通过绑定导航器迭代表中的元素,但如果这是问题的根源,我可以忘记这个选项。我明天分析你的帖子并给你结果反馈。
    • 绑定上下文来自实体框架,这可能对这个问题有价值吗?包括:从这个 DataContext 到 DridGridView 的数据是立即加载的。
    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多