【问题标题】:Binding error in design and runtime on usercontrol用户控件上的设计和运行时绑定错误
【发布时间】:2017-08-17 06:23:05
【问题描述】:

非常需要有关 Winform UserControls 的奇怪绑定问题的帮助。

是这样的。

  • 有一个带有 UserControl 的表单
  • UserControl 有一个 System.Windows.Forms.BindingSource 控件
  • BindingSource 在设计时将 DataSource 设置为实体 POCO 类型。
  • UserControl 具有绑定到 POCO 类的属性的控件。一个例子:创建日期

UserControl 本身的设计器没有问题。

但是进入包含 UserControl 的设计器和表单时,我得到一个设计器错误窗口,并显示以下消息:“无法绑定到数据源上的属性或列 CreateDate。参数名称:dataMember”

在运行时我得到同样的错误,但首先是在表单上调用 Show 时。在这里,我可以在堆栈跟踪中看到它是在 CheckBinding 调用之后抛出的。

在创建(在构造函数中)或表单上的 Load 事件期间,无论 bindingSource 上的 DataSource 是否设置,都会发生错误。

我可以看到设计器在设计器文件中这样设置我的数据源:this.bindingSourceRecipe.DataSource = typeof(Data.Entities.Recipe);

我已经尝试了很多方法来解决这个问题。这似乎很奇怪,因为这是一个非常简单的表单/控件设置,应该是 Winforms 用户控件的简单使用。

如果我在运行时将 bindingSourceRecipe.DataSource 设置为临时值。表单中 InitializeComponent() 之后的实例,则不会发生错误;

InitializeComponent();
ucRecipeBaseControl.Recipe = new Recipe() { Id = 0, CreateDate = DateTime.Now, Name = "" };

因此,表单/控件的初始化周期似乎以某种方式清除了有关其 DataSource 类型的绑定源知识。

如果将所有用户控件和 BindingSource 直接放在表单上,​​这当然不会发生。然后一切正常,DataSource 是否被设置为 Data 实体的实例都没有关系。

对我来说似乎完全是个谜,应该很简单,我有点不知道该怎么做。

非常感谢任何帮助或建议。

BR彼得梅尔德加德

【问题讨论】:

  • 啊,终于搞定了。它是由 Winform 设计器行为和我的代码混合引起的。我在公共属性设置器中设置绑定控件数据源,因此我可以保存实体的副本,以便能够比较更改后的 org.问题是,当您将具有公共属性的控件放在窗体上时,设计器在此属性中为 null 设计器内部生成的代码。我不知道。因此,每次实例化用户控件时,DataSource 都会设置为 null,清除 typeof(dataentity),并丢失绑定信息。

标签: c# winforms binding windows-forms-designer


【解决方案1】:

啊哈,终于搞定了。它是由 Winform 设计器行为和我的代码混合引起的。我在公共属性设置器中设置绑定控件数据源,因此我可以保存实体的副本,以便能够比较更改后的 org.问题是,当您将具有公共属性的控件放在窗体上时,设计器会在设计器生成的代码中将此属性初始化为 null。我不知道。因此,每次实例化用户控件时,DataSource 都会设置为 null,清除 typeof(dataentity),尽管会丢失绑定信息。

在 setter 中添加 null 检查,并且仅在 value 不为 null 时更新数据源修复了问题。

【讨论】:

  • 如果您能通过一些例子更详细地解释您是如何解决这个问题的,我将不胜感激。我遇到了同样的情况,但我无法理解你的回答。
猜你喜欢
  • 2013-03-26
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2012-08-29
  • 2020-03-27
  • 2020-02-09
  • 2012-08-11
  • 2023-03-11
相关资源
最近更新 更多