Может ли DataDource объекта BindingSource быть свойством и объектом в форме - PullRequest
1 голос
/ 09 мая 2009

Например: У меня есть контактный объект в форме (см. Ниже). Могу ли я установить свойство источника данных BindingSource как свойство 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
}

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

1 Ответ

0 голосов
/ 09 мая 2009

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

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...