Forums Neueste Beiträge
 

EntityCollection als DataSource an DataGridView binden

18/08/2009 - 23:36 von Carsten Ilwig | Report spam
Hallo Leute,

ich stehe vor folgenden Problem:

Ich habe eine Adresseniste und möchte diese als DataSource an ein
DataGridview binden.

Aufbau einer einzelnen Adresse (Kurzform):

public class AdressArt : EntityObject
{
public string Bezeichnung;
}
public class Land : EntityObject
{
public string Bezeichnung;
}
public class Adresse : EntityObject
{
public AdressArt AdressArt;
public Land Land;
public string Name;
public string PLZ;
public string Ort;
}

Im DGV möchte ich folgende Spalten haben:

-AdressArt.Bezeichnung
-Land.Bezeichnung;
-Name;
-PLZ;
-Ort;

Ich hatte mir das so gedacht:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Data.Objects.DataClasses;

public class WinForm : Form
{
private BindingSource bindingSource1;
private System.ComponentModel.IContainer components;
private DataGridView dataGridView1;
private List<Adresse> adressen = new List<Adresse>();

[STAThread]
public static void Main()
{
Application.Run(new WinForm());
}

public WinForm()
{
InitializeComponent();
}

private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.bindingSource1 = new
System.Windows.Forms.BindingSource(this.components);
this.dataGridView1 = new System.Windows.Forms.DataGridView();
((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
this.SuspendLayout();
//
// dataGridView1
//
this.dataGridView1.AllowUserToOrderColumns = true;
this.dataGridView1.AutoGenerateColumns = false;
this.dataGridView1.ColumnHeadersHeightSizeMode =
System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.dataGridView1.Location = new System.Drawing.Point(0, 0);
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.Size = new System.Drawing.Size(284, 264);
this.dataGridView1.TabIndex = 0;
//
// WinForm
//
this.ClientSize = new System.Drawing.Size(284, 264);
this.Controls.Add(this.dataGridView1);
this.Name = "EnumsAndComboBox";
this.Load += new System.EventHandler(this.winForm_Load);
((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
this.ResumeLayout(false);

}

private void winForm_Load(object sender, EventArgs e)
{
adressen.Add(new Adresse()
{
AdressArt = new AdressArt() { Bezeichnung = "Postanschrift" },
Land = new Land() { Bezeichnung = "Deutschland" },
Name = "Müller",
PLZ = "12345",
Ort = "Berlin",
});
adressen.Add(new Adresse()
{
AdressArt = new AdressArt() { Bezeichnung = "Lieferanschrift" },
Land = new Land() { Bezeichnung = "Deutschland" },
Name = "Lehmann",
PLZ = "85698",
Ort = "München",
});
dataGridView1.DataSource = bindingSource1;

//anonymen Typ anlegen
//adressen.ForEach(x => bindingSource1.Add(new { AdressArt =
x.AdressArt.Bezeichnung, Land = x.Land.Bezeichnung, Name = x.Name, PLZ =
x.PLZ, Ort = x.Ort }));
//Spalten für den anonymen Typ
//dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() {
HeaderText = "Adressart", Name = "dgvCol_adressArt", DataPropertyName =
"AdressArt" });
//dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() {
HeaderText = "Land", Name = "dgvCol_land", DataPropertyName = "Land" });

//Auflistung der Originalobject als DataSource verwenden
bindingSource1.DataSource = adressen;
//Spalten für das Originalobject
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() {
HeaderText = "Adressart", Name = "dgvCol_adressArt", DataPropertyName =
"AdressArt.Bezeichnung" });
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() {
HeaderText = "Land", Name = "dgvCol_land", DataPropertyName =
"Land.Bezeichnung" });

dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() {
HeaderText = "Name", Name = "dgvCol_name", DataPropertyName = "Name" });
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() {
HeaderText = "PLZ", Name = "dgvCol_plz", DataPropertyName = "PLZ" });
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() {
HeaderText = "Ort", Name = "dgvCol_ortt", DataPropertyName = "Ort" });
}
}

Leider werden mir dann aber keine Daten im DGV angezeigt.
Ich muss erst einen anonymen Typ anlegen und diesen dann als DataSource
verwenden.
Dann werden die Daten im DGV angezeigt.

Kann man denn keine strukturierten Daten direkt in einem DGV anzeigen?

Vielen Dank für Eure Hilfe
Carsten
 

Lesen sie die antworten

#1 Frank Dzaebel
19/08/2009 - 07:31 | Warnen spam
Hallo Carsten,

Ich habe eine Adressenliste und möchte diese als DataSource an ein
DataGridview binden. [...]
Leider werden mir dann aber keine Daten im DGV angezeigt.



Deine Klassen AdressArt, Adresse, Land, etc. sollten
öffentliche Eigenschaften, nicht Felder haben. Also etwa:

public class AdressArt : EntityObject
{
public string Bezeichnung{get;set;}
public override string ToString(){return Bezeichnung;}
}

public class Land : EntityObject
{
public string Bezeichnung { get; set; }
public override string ToString() { return Bezeichnung; }
}

public class Adresse : EntityObject
{
public AdressArt AdressArt { get; set; }
public Land Land { get; set; }
public string Name { get; set; }
public string PLZ { get; set; }
public string Ort { get; set; }
}

Die Bindung ans Grid ist dann trivial:

bindingSource1.DataSource = adressen;
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = bindingSource1;

// ohne zusàtzliche DgvColumn-Zuweisungen :-)


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen