C# BindingSource的DataDource是否可以是表单上的属性和对象

C# BindingSource的DataDource是否可以是表单上的属性和对象,c#,bindingsource,bindinglist,C#,Bindingsource,Bindinglist,例如: 我在表单上有一个联系人对象(见下文)。我可以将BindingSource的datasource属性设置为属性Contact.Addresses吗 类AddressCollection实现BindingList,因此在未被Contact类封装的情况下,绑定该类不会出现问题 public class Contact : IComparable<Contact>, IComponent { #region Properties private AddressColl

例如: 我在表单上有一个联系人对象(见下文)。我可以将BindingSource的datasource属性设置为属性Contact.Addresses吗

类AddressCollection实现BindingList,因此在未被Contact类封装的情况下,绑定该类不会出现问题

public class Contact : IComparable<Contact>, IComponent
{
    #region Properties
    private AddressCollection addresses = new AddressCollection();
    private ContactNumberCollection contactNumbers = new ContactNumberCollection();

    public int ContactId { get; set; }
    public string Title { get; set; }
    public string Forename { get; set; }
    public string MiddleName { get; set; }
    public string Surname { get; set; }
    public string JobTitle { get; set; }
    public DateTime DateAdded { get; set; }
    public DateTime LastUpdate { get; set; }

    public AddressCollection Addresses
    {
        get { return addresses; }
        set { addresses = value; }
    }
    public ContactNumberCollection ContactNumbers
    {
        get { return contactNumbers; }
        set { contactNumbers = value; }
    }
    #endregion

    #region Constructors
    public Contact()
    {
        DateAdded = DateTime.Now;
        LastUpdate = DateTime.Now;
    }

    #endregion

    public int CompareTo(Contact other)
    {
        return FullName.CompareTo(other.FullName);
    }

    #region IComponent Objects
    private ISite mSite;

    public event EventHandler Disposed;

    public virtual void Dispose()
    {
        if ((mSite != null) && (mSite.Container != null))
        {
            mSite.Container.Remove(this);
        }

        Disposed(this, System.EventArgs.Empty);
    }

    public ISite Site
    {
        get
        {
            return mSite;
        }
        set
        {
            mSite = value;
        }
    }
    #endregion
}
公共类联系人:IComparable,IComponent
{
#区域属性
private AddressCollection addresses=新AddressCollection();
private ContactNumberCollection contactNumbers=新ContactNumberCollection();
public int ContactId{get;set;}
公共字符串标题{get;set;}
公共字符串名{get;set;}
公共字符串MiddleName{get;set;}
公共字符串姓氏{get;set;}
公共字符串JobTitle{get;set;}
public DateTime DateAdded{get;set;}
公共日期时间上次更新{get;set;}
公共地址收集地址
{
获取{返回地址;}
设置{地址=值;}
}
公共联系人号码收集联系人号码
{
获取{返回联系人号码;}
设置{contactNumbers=value;}
}
#端区
#区域构造函数
公众联络()
{
DateAdded=DateTime.Now;
LastUpdate=DateTime.Now;
}
#端区
公共内部比较(联系其他人)
{
返回FullName.CompareTo(其他.FullName);
}
#区域IComponent对象
私有硅藻土;
公共事件事件处理程序;
公共虚拟void Dispose()
{
如果((mSite!=null)&&(mSite.Container!=null))
{
mSite.Container.Remove(此);
}
已处置(此,System.EventArgs.Empty);
}
公众参观地点
{
收到
{
返回mSite;
}
设置
{
mSite=值;
}
}
#端区
}

谢谢安东尼简而言之,是的,你可以。但是,如果您需要更改联系人,您可能希望将数据源设置为联系人(或联系人列表),并使用DataMember设置为“地址”

下面是一个显示这种绑定的简化示例。如果我没有领会你的观点,请澄清:

using System;
using System.ComponentModel;
using System.Windows.Forms;
class AddressCollection : BindingList<Address>
{
    public void Add(string line1, string zip)
    { // just for convenience
        Add(new Address { Line1 = line1, Zip = zip});
    }
}

class Address
{
    public string Line1 { get; set; }
    public string Zip { get; set; }

    public override string ToString()
    {
        return Line1;
    }
}
class Contact
{
    public string Name { get; set; }
    private readonly AddressCollection addresses = new AddressCollection();
    public AddressCollection Addresses { get { return addresses; } }
    public override string ToString()
    {
        return Name;
    }
}

static class Program
{
    [STAThread]
    static void Main()
    {
        BindingList<Contact> contacts = new BindingList<Contact>
        {
            new Contact { Name = "Fred", Addresses = { {"123 Some road", "AB1"}}},
            new Contact { Name = "Barney", Addresses = { {"456 A Street", "CD2"}, {"789 The Lane", "EF3"}}}                
        };
        BindingSource bs = new BindingSource(contacts, "");

        Form form = new Form { 
            Controls = {
                                new DataGridView { Dock = DockStyle.Fill, DataSource = bs, DataMember = "Addresses" },
                new ComboBox { Dock = DockStyle.Top, DataSource = bs, DisplayMember = "Name" },
                new TextBox { Dock = DockStyle.Bottom, DataBindings = { {"Text", bs, "Addresses.Zip"}}}
            }
        };
        Application.Run(form);

    }
}
使用系统;
使用系统组件模型;
使用System.Windows.Forms;
类AddressCollection:BindingList
{
公共void添加(字符串行1,字符串zip)
{//只是为了方便
添加(新地址{Line1=Line1,Zip=Zip});
}
}
班级地址
{
公共字符串Line1{get;set;}
公共字符串Zip{get;set;}
公共重写字符串ToString()
{
回流线1;
}
}
班级联系
{
公共字符串名称{get;set;}
私有只读地址集合地址=新地址集合();
公共地址集合地址{获取{返回地址;}}
公共重写字符串ToString()
{
返回名称;
}
}
静态类程序
{
[状态线程]
静态void Main()
{
BindingList联系人=新建BindingList
{
新联系人{Name=“Fred”,地址={{“123某路”,“AB1”}},
新联系人{Name=“Barney”,地址={{“456A街”,“CD2”},{“789巷”,“EF3”}
};
BindingSource bs=新的BindingSource(联系人“”);
表单=新表单{
控件={
新DataGridView{Dock=DockStyle.Fill,DataSource=bs,DataMember=“Addresses”},
新组合框{Dock=DockStyle.Top,DataSource=bs,DisplayMember=“Name”},
新文本框{Dock=DockStyle.Bottom,数据绑定={{“Text”,bs,“Addresses.Zip”}
}
};
申请表格;
}
}

这就是我的想法,你的例子很有帮助。唯一的问题是在表单上,联系人定义为:BusinessObjects.contact currentCustomer;而不是有一群顾客。我可以简单地拥有一个包含一个项目的集合,但是这看起来不整洁?这是你的问题-你可以轻松地绑定到单个项目,而不需要任何集合。