2008-01-24

Databinding und LINQ to DataSet - CopyToDataTable-Variante

Der Hauptverwendungszweck der CopyToDataTable-Methode ist nicht die Datenbindung sondern, die Daten in ein anderes DataTable-Objekt zu transferieren. Die drei Überladungen der CopyToDataTable-Methode sind wie folgt beschrieben:

Die erste Überladung gibt ein DataTable-Objekt zurück, in dem das Quelle-Objekt in ein DataTable-Objekt umgewandelt wird.

CopyToDataTable<T>(this System.Collections.Generic.IEnumerable<T>)
Die zweite Überladung übergibt die Inhalte des Quellenobjektes in ein anderes DataTable-Objekt. Mit dem LoadOption-Parameter wird festgelegt, wie die Werte von Datenquelle auf die vorhandenen Zeilen verwendet werden sollen.
CopyToDataTable<T>(this System.Collections.Generic.IEnumerable<T>,
System.Data.DataTable,
System.Data.LoadOption)
Die dritte Überladung ist ähnlich wie die zweite Überladung. Zusätzlich kann ein Delegat definiert werden, welches beim Auftreten eines Fehlers während des Übergabeprozesses aufgerufen werden kann.
CopyToDataTable<T>(this System.Collections.Generic.IEnumerable<T>,
System.Data.DataTable,
System.Data.LoadOption,
System.Data.FillErrorEventHandler)
Mit der ersten Überladung zurückgeliefertes DataTable-Objekt kann mit einem DataGridView-Control verknüpft und die Daten in diesem DataGridView dargestellt werden.

Im folgenden Beispiel werden die Daten mithilfe eines SqlDataAdapter-Objektes aus der Datenbank ermittelt und in ein DataSet gefüllt. Eine einfache LINQ-Abfrage selektiert die Daten und das Resultat wird in die Variable qry zurückgegeben. Das Resultat wird mithilfe der CopyToDataTable-Methode in ein DataTable-Objekt konvertiert und an die DataSource-Eigenschaft eines DataGridView-Controls zugewiesen. Mit dieser Zuweisung werden die Daten automatisch im DataGridView-Control dargestellt.

private void btnCopyToDataTable_Click(object sender, EventArgs e)
{
string selectSql = @"SELECT [Person].[CountryRegion].[CountryRegionCode],
[Person].[CountryRegion].[Name],
[Person].[CountryRegion].[ModifiedDate]
FROM [Person].[CountryRegion]
";

SqlConnection sqlCon
= new SqlConnection(@"Data Source=.;
Initial Catalog=AdventureWorks;
Integrated Security=True
");

SqlDataAdapter sqlDa
= new SqlDataAdapter();
sqlDa.SelectCommand
= new SqlCommand(selectSql, sqlCon);

DataSet adventureWorksDS
= new DataSet("AdventureWorks");
sqlDa.Fill(adventureWorksDS,
"CountryRegion");

var qry
= from cr
in adventureWorksDS.Tables["CountryRegion"].AsEnumerable()
select cr;

this.dgvDatabindCopyToDataTable.DataSource = qry.CopyToDataTable();
this.dgvDatabindCopyToDataTableChanges.DataSource = qry.CopyToDataTable();
}
Beim obigen Beispielcode wurde ein Einweg Datenbindung implementiert. Wenn die Daten im DataGridView geändert werden, werden die Änderungen nicht an das Datencontainer-Objekt zurückgegeben. In der folgende Abbildung sind zwei DataGridView-Controls, die ihre Daten über die CopyToDataTable-Methode beziehen. Die Änderung eines Eintrages im linken DataGridView-Control wird nicht direkt an das rechte DataGridView-Control reflektiert.

clip_image002

Die Änderungen können über einen Umweg, wie im folgenden Beispielcode, mit Hilfe der GetChanges-Methode ermittelt werden.

private void btnCopyToDataTableChanges_Click(object sender, EventArgs e)
{
DataTable dt
= (DataTable)this.dgvDatabindCopyToDataTable.DataSource;
this.dgvDatabindCopyToDataTableChanges.DataSource = dt.GetChanges();
}

Mit folgenden Beispielcode können die geänderte Einträge ermittelt und in dem rechten DataGridView-Control angezeigt werden.

clip_image002[12]

No comments: