【问题标题】:C# Cannot bind to the property or column on the DataSourceC# 无法绑定到 DataSource 上的属性或列
【发布时间】:2014-10-10 08:49:25
【问题描述】:

我有 2 个实体:

public class Address
{
    public string Street, City, State;
}

public class Customer
{
    public int Id;
    public string Name;
    public Address Address;
}

我有一个 WinForms 表单,其中有 1 个文本框作为客户名称,1 个用户控件作为地址。用户控件的每个地址属性都有 3 个文本框。表单有一个“客户”绑定源,用户控件有一个“地址”绑定源。用户控件如下所示:

[DefaultBindingProperty("Address")]
public partial class AddressBox : UserControl
{
    private Address address;

    [Bindable(BindableSupport.Yes, BindingDirection.TwoWay)]
    [Browsable(false)]
    public Address Address
    {
        get { return address; }
        set
        {
            address = value;
            bindingSource.DataSource = address;
        }
    }
}

在设计模式下,我设置了表单和用户控件的数据成员。但是,一旦我设置了地址用户控件的数据成员,就会出现上述错误,并且无法在设计模式下打开表单。

我错过了什么吗?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    为了修复设计时错误,我从表单和用户控件的构造函数和 InitializeComponent 中删除了所有绑定源创建、数据源分配和控件数据绑定添加,并将所有内容包装在一个方法中,调用它:

    1. 在用户控件中:处理 OnLoad 和 VisibleChanged 时。
    2. 在主窗体中:覆盖 OnShown 时。

    在这个特定的主子绑定中,子用户控件在从主窗体加载调用时会失败,因为所有连线都已设置,但尚未为其分配数据...

    关于实际实现: 我想可能有一种更优雅的方式来使用属性来做到这一点。我的方法是这样的:

    1. 您必须将公共字段转换为实体类上的公共属性。
    2. 将地址绑定源方法包装在地址用户控件中。

    示例截图,'next' 推进绑定源位置,循环结束:

    下面的完整实现

    1. AddressUserControl

    2. Form

    3. Entities

    【讨论】:

    • 这几乎和我正在做的一样。但是我仍然收到上述错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    相关资源
    最近更新 更多