2009-03-02 49 views
7

WinForms veri bağlama konusunda yardıma/kılavuza ihtiyacım var ve Google'ın bana bu konuda yardımcı olması için yardımcı olamadım.WinForms veri bağlama - Bir listedeki nesnelere bağlama

İşte benim senaryo. Neye ihtiyacım benzer aşağıdaki sınıfları dikkate alın: Bunun

public class Car 
{ 
    public string Name { get; set; } 
    public List<Tire> Tires { get; set; } 
} 

public class Tire 
{ 
    public double Pressure { get; set; } 
} 

Benim örneklerini dört Lastik nesnelerle bir List sınıfı Car bir nesne olacak. Listede her zaman bilinen sayıda nesneye sahip olacağımı unutmayın.

Şimdi bunu veriyi beş metin kutusu içeren bir Form'a bağlamak istiyorum. Otomobilin adı ve her lastik basıncı ile bir metin kutusu ile bir metin kutusu.

Bu işin nasıl yapıldığına dair bir fikrin var mı? VS'deki tasarımcı, Lastikleri [0] .Pressure gibi liste dizinlerine atayarak bunu ayarlamama izin vermiyor gibi görünüyor.

Benim şimdiki çözüm gibi olurdu bir "BindableCar" bağlanma geçerli:

public class BindableCar 
{ 
    private Car _car; 

    public BindableCar(Car car) 
    { 
     _car = car; 
    } 

    public string Name 
    { 
     get { return _car.Name; } 
     set { _car.Name = value; } 
    } 

    public double Tire1Pressure 
    { 
     get { return _car.Tires[0].Pressure; } 
     set { _car.Tires[0].Pressure = value; } 
    } 

    public double Tire2Pressure 
    { 
     get { return _car.Tires[1].Pressure; } 
     set { _car.Tires[1].Pressure = value; } 
    } 

    public double Tire3Pressure 
    { 
     get { return _car.Tires[2].Pressure; } 
     set { _car.Tires[2].Pressure = value; } 
    } 

    public double Tire4Pressure 
    { 
     get { return _car.Tires[3].Pressure; } 
     set { _car.Tires[3].Pressure = value; } 
    } 
} 

ama benim listeleri 20 yerine 4 nesneleri içeriyorsa bu gerçekten çirkin olur ve ben isteyen nesnelerin her biri için 6 özelliğe karşı bağlanır. Bu büyük bir "BindableObject" yapar!

cevap

3

WinForms tasarımcısı bunu yapmanıza izin vermese de, kodda bağlama ayarlamayı denediniz mi? Sanırım bir textbox'ı someCar.Tires [1] 'e bağlamakta sorun yok.

+0

Hayır, tasarımcı tarafından gönderilen mesaj nedeniyle bunun desteklenmediğini varsaydım. Bunu en kısa zamanda deneyeceğim. –

-1

Tasarımcı yerine kod aracılığıyla bir listeye bağlanabilmeniz gerekir. İşte bir example (sadece birkaç saat önce).

17

Sen için arayüzleri IList, ICollection veya IEnumerable uygulayan veya bu arabirimleri uygulayan bir sınıftan miras herhangi nesne türünü kontrollerini bağlayabilir unutmamalıdır. Genel koleksiyonlar da bu tür bir bağlanma için uygundur.

Bunlar dahili olarak IBindingList örneğine dönüştürülür. Daha fazla bilgi için aşağıdaki linkleri üzerinden

Kontrol:

  1. Roadmap for Windowsforms databinding - uygulanması ve olasılıklar çok kapsamlı bir görünüm alır ve diğer KB makalelerin bağlantı sunar.
  2. Winforms Object binding - Rockford Lhotka'nın konuyla ilgili makalesi. Bir Windows formları veri bağlama uygulamak tasarımcı odaklı bir yol sağlar.
  3. Databinding with Windows forms 2.0 - Brian Noyes'in bu kitabı hem karmaşık hem de basit senaryolarda Databinding'ın çeşitli yönlerini araştırıyor.
+0

Harika bağlantılar için teşekkürler! –

+0

Benim için zevk! ;-) – Cerebrus

+0

Bir not. İlk linkte, "... Windows Forms nesne modeli ... 'IEnumerable' arabirimine bağlanmayı desteklemiyor, çünkü basit bir nesne dışında bir şeye bağlandığınızda geriye doğru kaydırma desteği gerekiyor." IEnumerable'ın otomatik olarak "IBindingList" e dönüştürüleceğini söylüyorsunuz. –