2008-09-24 11 views
34

Bir DataGridView denetimine List<T> bağlamaya çalışıyorum ve özel bağlamalar oluşturma konusunda hiç şansım yok.winForms + DataGridBir Listeye bağlanma <T>

denedim:

gvProgramCode.DataBindings.Add(new Binding("Opcode",code,"Opcode")); 

Hiçbir şey bu özellik adıyla bulundu söyleyerek, bir istisna atar.

Söz konusu sütunun adı "Opcode". List<T>'daki özelliğin adı Opcode.

ANSWER EDIT: Sorun şu ki, sınıfımdaki özellikler, yalnızca ortak alanlar olarak binilebilir alanlara sahip değildim ... Görünüşe göre bu alanlar yalnızca mülklere yansıyor.

+0

LOL. –

+2

+1 Sadece aynı problemi yaşadım. Topları berbat adam! –

+0

Sen bir tanrısalsın. Kafamı bu probleme karşı altı saat boyunca düzleştirdim, şimdi. Düşünebildiğim her şeyi ve Google'a düşünebildiğim her şeyi denedim. Şanssız. Sonunda mesajınızı buldum ve elbette acelem vardı ve onları alanlara değil mülklere dönüştürdüm. – Locke

cevap

14

Opcode'a bağlandığınız ızgaradaki özellik de mi? .. Doğrudan listeye bağlanmak istiyorsanız, sadece DataSource = list. Veritabanları özel bağlama sağlar. Veri kaynağından başka bir şey yapmaya mı çalışıyorsunuz?

Bir demet boş satır mı alıyorsunuz? otomatik oluşturulan sütunların adları var mı? Doğrulanmış veri var mı nesnede (sadece string.empty değil)?

class MyObject 
    { 
     public string Something { get; set; } 
     public string Text { get; set; } 
     public string Other { get; set; } 
    } 

    public Form1() 
    { 
     InitializeComponent(); 

     List<MyObject> myList = new List<MyObject>(); 

     for (int i = 0; i < 200; i++) 
     { 
      string num = i.ToString(); 
      myList.Add(new MyObject { Something = "Something " + num , Text = "Some Row " + num , Other = "Other " + num }); 
     } 

     dataGridView1.DataSource = myList; 
    } 

bu güzel çalışması gerekir ...

+0

Evet. Sadece DataSource = listeyi yaparsam, bir grup boş sütun alırım. – FlySwat

+1

Yani ızgarayı özel nesneler listesinde opcode özelliğine bağlamak mı istiyorsunuz? –

+0

İstediğim şey o zaman oyuncuların yapması ... Grid.DataSource = MyList.Select (o => o.Opcode); –

5

Gerçekten sen dahil örnekle yapmaya çalışıyor, ama nesnelerin genel bir listeye bağlama şeyi söyleyemem eğer oldukça basittir sadece nesneleri listelemek istiyorum:

private BindingSource _gridSource; 

    private BindingSource GridSource 
    { 
     get 
     { 
      if (_gridSource == null) 
       _gridSource = new BindingSource(); 
      return _gridSource; 
     } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     List<FluffyBunny> list = new List<FluffyBunny>(); 
     list.Add(new FluffyBunny { Color = "White", EarType = "Long", Name = "Stan" }); 
     list.Add(new FluffyBunny { Color = "Brown", EarType = "Medium", Name = "Mike" }); 
     list.Add(new FluffyBunny { Color = "Mottled", EarType = "Short", Name = "Torvald" }); 

     GridSource.DataSource = list; 
     dataGridView1.Columns["EarType"].Visible = false; //Optionally hide a column 
     dataGridView1.DataSource = GridSource; 

    } 

yalnızca görünmez istenmeyen sütun (lar) yapmak mümkün olmalıdır Listesi'nin tip spesifik özelliklerini görüntülemek istiyorsanız.

Teknik olarak, gerçekten BindingSource'ı oluşturmanız gerekmez, ancak varsa, güncelleştirmeler veya değişiklikler yaptığımda bunu çok daha kolay buluyorum.

Bu yardımcı olur umarım.

+0

Doğrudan List 'a bağlanırken, bir sürü boş satır, veri yok. Liste sınıfındaki sınıf sadece 3 dizeden oluşur. – FlySwat

+0

Teşekkürler Jared! BindingSource hakkındaki yorumunuz, bir Liste 'u kullanırken yeni satırlar oluşturmayı nasıl anlamaya çalıştığımda bana gerçekten yardımcı oldu. Bir tıklama var! –

+0

+1 İlginç bilgiler için – SteveCav

4

Aynı sorunla karşılaştım ... Açık alanlarla açık bir yapıya sahiptim. ızgarada hiçbir şey yok. kamu alıcıları sağladı, çalıştı.

+0

Benim için çalıştı! Tks – Pascal

3

Bulduğum başka bir çözüm BindingList koleksiyonunu kullanmaktır. Eğer sorun çözüldü memnun



private void Form1_Load(object sender, EventArgs e) 
{ 
    BindingList people= new BindingList { 
    new Person {Name="John",Age=23}, 
    new Person {Name="Lucy",Age=16} 
    }; 

    dataGridView1.DataSource= people; 
} 

Benim için çalışıyor, benim yorumlarında ekledi vardı sadece ne olduğunu