2008-07-14

LINQ to Objects und DataBinding mit DataGridView

Ein Leser von meinem Buch LINQ hat mir die Frage gestellt, wie er mit LINQ to Objects erstellte Objekte (Objects) in einem DataGridView Control auflisten kann.

Beispiel (Sample) 1

Im Beispiel-Code haben wir die Klasse (Class) Person zwei Public Felder (Fields) mit dem Namen Age und Name.

public class Person
{
public int Age;
public string Name;
}



Als nächstes erstellen wir unsere Daten wie folgt:




List<Person> firends = new List<Person>();

Person friend1 = new Person();
friend1.Name = "Hans";
friend1.Age = 38;
firends.Add(friend1);

Person friend2 = new Person();
friend2.Name = "Karin";
friend2.Age = 26;
firends.Add(friend2);



Bevor wird die Daten (friends) an die DataSource-Eigenschaft (Property) des DataGridView-Controls zuweisen, ist es wichtig, dass die gewünschten Felder mit Hilfe einer Abfrage bestimmt werden.




var friend = from f in friends
select new { f.Age, f.Name };



Durch die Verwendung der ToList() Methode werden unsere Daten DataGridView-Control tauglich.




this.dataGridView1.AutoGenerateColumns = true;
this.dataGridView1.DataSource = friend.ToList();



Nach der Zuweisung werden die Daten automatisch im Control aufgelistet.image



Den kompletten Source-Code findet Ihr wie folgt:




using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace LinqToObjectsDataGridView
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btnShowData_Click(object sender, EventArgs e)
{
List<Person> friends = new List<Person>();

Person friend1 = new Person();
friend1.Name = "Hans";
friend1.Age = 38;
friends.Add(friend1);

Person friend2 = new Person();
friend2.Name = "Karin";
friend2.Age = 26;
friends.Add(friend2);

var qry = from f in friends
select new { f.Age, f.Name };

this.dataGridView1.AutoGenerateColumns = true;
this.dataGridView1.DataSource = qry.ToList();
}
}

public class Person
{
public int Age;
public string Name;
}
}



Beispiel (Sample) 2



Wenn Sie die Getter-und-Setter in Ihrer Klasse verwenden, dann müssen Sie die Namen der Felder nicht explizit definieren.




public class PersonExtended
{
private int _Age;
public int Age
{
get { return _Age; }
set { _Age = value; }
}

private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
}



Die Abfrage sieht in diesem Beispiel wie folgt aus:




IEnumerable<PersonExtended> qry = from f in friends
select f;



Und anschließend die Zuweisung an die DataSource-Eigenschaft:




this.dataGridView1.AutoGenerateColumns = true;
this.dataGridView1.DataSource = qry.ToList();



Als Resultat erhalten wir die gleichen Einträge:



image



Source-Code sieht wie folgt aus:




using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace LinqToObjectsDataGridView
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btnShowData_Click(object sender, EventArgs e)
{
List<PersonExtended> friends = new List<PersonExtended>();
PersonExtended friend1 = new PersonExtended();
friend1.Name = "Hans";
friend1.Age = 38;
friends.Add(friend1);

PersonExtended friend2 = new PersonExtended();
friend2.Name = "Karin";
friend2.Age = 26;
friends.Add(friend2);

IEnumerable<PersonExtended> qry = from f in friends
select f;

this.dataGridView1.AutoGenerateColumns = true;
this.dataGridView1.DataSource = qry.ToList();
}
}

public class PersonExtended
{
private int _Age;
public int Age
{
get { return _Age; }
set { _Age = value; }
}

private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
}
}



Das komplette ZIP-File mit Source findet Ihr unter: LinqToObjectsDataGridView



Viel Spaß...

No comments: