C# BindingSource的DataDource是否可以是表单上的属性和对象
例如: 我在表单上有一个联系人对象(见下文)。我可以将BindingSource的datasource属性设置为属性Contact.Addresses吗 类AddressCollection实现BindingList,因此在未被Contact类封装的情况下,绑定该类不会出现问题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
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;而不是有一群顾客。我可以简单地拥有一个包含一个项目的集合,但是这看起来不整洁?这是你的问题-你可以轻松地绑定到单个项目,而不需要任何集合。