2009-05-09 6 views
1

Zum Beispiel: Ich habe ein Kontaktobjekt auf dem Formular (siehe unten). Kann ich die Datenquellen-Eigenschaft der BindingSource als die Eigenschaft Contact.Addresses festlegen.Kann die DataDource einer BindingSource eine Eigenschaft von und ein Objekt auf dem Formular sein

Die Klasse AddressCollection implementiert BindingList, sodass es kein Problem gibt, das dies bindet, wenn es nicht von der Contact-Klasse gekapselt wird.

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 
} 

Dank Anthony

+0

Auf Ihre Frage - Sie können genauso einfach an ein einzelnes Element binden, ohne dass die Sammlung erforderlich ist. –

Antwort

0

Kurz gesagt, ja Sie können. Wenn Sie den Kontakt jedoch ändern müssen, sollten Sie die DataSource auf den Kontakt (oder die Kontaktliste) setzen und den DataMember für "Adressen" verwenden.

Hier ist ein vereinfachtes Beispiel für eine solche Bindung. Wenn ich Ihren Punkt verpasst habe, klären Sie bitte:

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

Dies ist, was ich im Sinn hatte und Sie waren Beispiel war hilfreich. Das einzige Problem ist das Formular, der Kontakt ist definiert: BusinessObjects.Contact currentCustomer; anstatt eine Sammlung von Kunden zu haben. Ich könnte einfach eine Sammlung mit einem Artikel darin haben, aber das scheint nur unordentlich? –