2009-05-09 5 views
1

Par exemple: J'ai un objet Contact sur le formulaire (voir ci-dessous). Puis-je définir la propriété de la source de données de BindingSource comme étant la propriété Contact.Addresses.La DataDource d'une BindingSource peut-elle être une propriété de et un objet sur le formulaire

La classe AddressCollection implémente BindingList, donc il n'y a pas de problème de liaison si elle n'est pas encapsulée par la classe 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 
} 

Merci Anthony

+0

Répondez à votre question - vous pouvez vous lier aussi facilement à un seul article sans avoir besoin de la collection. –

Répondre

0

En bref, oui vous pouvez. Toutefois, si vous devez modifier le contact, vous pouvez définir le DataSource sur le contact (ou la liste des contacts) et utiliser le DataMember pour "Addresses".

Voici un exemple simplifié montrant une telle liaison. Si j'ai manqué votre point, veuillez clarifier:

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); 

    } 
} 
+0

C'est ce que j'avais en tête et votre exemple était utile. Le seul problème est sur le formulaire, le contact est défini: BusinessObjects.Contact currentCustomer; au lieu d'avoir une collection de clients. Je pourrais simplement avoir une collection avec un article dedans mais ceci semble juste désordonné? –

Questions connexes