c# - 用户控件上的设计和运行时绑定(bind)错误

标签 c# winforms binding windows-forms-designer

非常需要帮助解决有关 Winform UserControls 的奇怪绑定(bind)问题。

就像这样。

  • 拥有一个带有 UserControl 的表单
  • UserControl 有一个 System.Windows.Forms.BindingSource 控件
  • BindingSource 在设计时将 DataSource 设置为实体 POCO 类型。
  • UserControl 具有绑定(bind)到 POCO 类上的属性的控件。示例:CreateDate

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

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

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

无论在创建过程中(在构造函数中)或表单上的 Load 事件期间是否设置了绑定(bind)源上的数据源,都会发生错误。

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

我尝试了很多方法来解决这个问题。这看起来很奇怪,因为这是一个极其简单的表单/控件设置,应该是 Winforms 用户控件的简单使用。

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

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

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

如果将所有用户控件和 BindingSource 直接放在窗体上,这当然不会发生。然后一切正常,并且数据源是否被设置为数据实体的实例并不重要。

对我来说似乎完全是个谜,应该非常简单,而且我有点迷失了该怎么做。

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

BR 彼得·梅尔德加德

最佳答案

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

在setter中添加空检查,并且仅在值不为空时更新数据源解决了该问题。

关于c# - 用户控件上的设计和运行时绑定(bind)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42997368/

相关文章:

c# - 在带有子窗体的 WinForms 应用程序中进行依赖注入(inject)

wpf - 绑定(bind)字符串格式

cocoa - 绑定(bind)到 NSMutableDictionary 和默认值

c# - 将绑定(bind)值设置为 Xamarin Forms 中行为的参数

c# - 未选择为此解决方案配置构建的项目

c# - 不用函数直接将字符串限制到一定长度

c# - 如何激活由另一个进程启动的窗口

c# - 清除页面中的所有单选按钮

c# - 将 gRPC 服务绑定(bind)到 aspnetcore 中的特定端口

c# - 在 Windows 窗体应用程序中托管 ASP.NET Core API