Может ли DataDource BindingSource быть свойством и объектом в форме

Например: у меня есть объект Contact на форме (см. ниже). Могу ли я установить свойство источника данных BindingSource как свойство Contact.Addresses.

Класс AddressCollection реализует BindingList, поэтому нет проблем с привязкой this, если он не инкапсулирован классом 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
}

Спасибо, Энтони.


person Ant Swift    schedule 09.05.2009    source источник
comment
По вашему вопросу - вы можете так же легко привязываться к одному элементу без необходимости в коллекции.   -  person Marc Gravell    schedule 09.05.2009


Ответы (1)


Короче да, можно. Однако, если вам нужно изменить контакт, вы можете установить DataSource для контакта (или списка контактов) и использовать 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);

    }
}
person Marc Gravell    schedule 09.05.2009
comment
Это то, что я имел в виду, и ваш пример был полезен. Единственная проблема заключается в форме, контакт определен: BusinessObjects.Contact currentCustomer; вместо сбора клиентов. Я мог бы просто иметь коллекцию с одним элементом, но это кажется неопрятным? - person Ant Swift; 09.05.2009