2008-09-24 13 views
34

Ich versuche, ein List<T> an ein DataGridView-Steuerelement zu binden, und ich habe kein Glück beim Erstellen von benutzerdefinierten Bindungen.winForms + DataGridView-Bindung an eine Liste <T>

Ich habe versucht:

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

Es gibt eine Ausnahme aus und sagte, dass nichts von dieser Eigenschaft Namen gefunden wurde.

Der Name der betreffenden Spalte lautet "Opcode". Der Name der Eigenschaft in List<T> ist Opcode.

ANTWORT BEARBEITEN: Das Problem war, dass ich nicht die bindbaren Felder in meiner Klasse als Eigenschaften hatte, nur öffentliche Felder ... Offenbar spiegelt es nicht Felder, nur Eigenschaften.

+0

LOL, das genau das, was ich in meiner Kommentare hinzugefügt hatte, froh, dass Sie Ihr Problem gelöst wurde. –

+2

+1 Ich hatte gerade das gleiche Problem. Mann, der Bälle bläst !!! –

+0

Du bist ein Glücksfall. Ich habe meinen Kopf jetzt sechs Stunden lang gegen dieses Problem geschlagen. Ich habe alles versucht, was mir einfiel, und alles, was ich an Google denken konnte. Kein Glück. Endlich deinen Post gefunden und natürlich hatte ich es eilig und hab sie zu Feldern gemacht, nicht zu Grundstücken. – Locke

Antwort

14

Ist die Eigenschaft im Grid, die Sie auch an Opcode binden? .. Wenn Sie direkt an List binden möchten, würden Sie nur DataSource = list. Die Datenbindungen ermöglichen benutzerdefinierte Bindung. Versuchen Sie, etwas anderes als die Datenquelle zu tun?

Sie erhalten eine Reihe von leeren Zeilen? haben die automatisch generierten Spalten Namen? Haben Sie überprüft, ob sich Daten im Objekt befinden (nicht nur string.empty)?

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

dies sollte funktionieren ...

+0

Ja. Wenn ich DataSource = list mache, bekomme ich eine Reihe leerer Spalten. – FlySwat

+1

Sie möchten also nur das Raster an die Opcode-Eigenschaft in einer Liste von benutzerdefinierten Objekten binden? –

+0

Wenn das, was ich gefragt habe, ist die Besetzung dann tun Sie ... Grid.DataSource = MyList.Select (o => o.Opcode); –

5

Ich kann nicht wirklich sagen, was Sie versuchen, mit dem Beispiel zu tun, enthalten Sie, aber auf eine generische Liste von Objekten, die Bindung ist recht einfach, wenn Sie wollen einfach nur die Objekte aufzulisten:

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; 

    } 

Wenn Sie nur bestimmte Eigenschaften der Liste des Typs angezeigt werden möchten, sollten Sie die unerwünschte Spalte (n) unsichtbar machen können.

Technisch gesehen müssen Sie die BindingSource nicht wirklich erstellen, aber ich finde es viel einfacher, wenn ich Aktualisierungen oder Änderungen vornahm, wenn ich sie habe.

Hoffe, das hilft.

+0

Bei der direkten Bindung an die Liste , bekomme ich eine Reihe von leeren Zeilen, keine Daten. Die Klasse in Liste enthält nur 3 Zeichenfolgen. – FlySwat

+0

Danke Jared! Ihr Kommentar zur BindingSource hat mir wirklich geholfen, als ich versuchte herauszufinden, wie man neue Zeilen erstellt, wenn man eine Liste verwendet. Habt einen Klick! –

+0

+1 für interessante Daten – SteveCav

4

Hatte das gleiche Problem ... Ich hatte offensichtlich eine Struktur mit öffentlichen Feldern. nichts im Raster. zur Verfügung gestellte öffentliche Getters, hat gearbeitet.

+0

Arbeitete für mich! Tks – Pascal

3

Eine andere Lösung, die ich gefunden habe, ist, die BindingList-Sammlung zu verwenden.



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

Es funktioniert gut für mich,

Verwandte Themen