2008-01-24

Databinding und LINQ to DataSet - AsDataView-Variante

Die AsDataView-Methode erstellt aus einem DataTable oder EnumerableRowCollection<T> einen DataView-Objekt. Durch die Verwendung der AsDataView-Methode kann eine Zweiweg-Datenbindung realisiert werden. In einer Zweiweg-Datenbindung können die Daten nicht nur aus dem Quellenobjekt gelesen und in einem User Control dargestellt sondern, die veränderten Daten im User Control werden an das Quellenobjekt weitergegeben.

Auch in diesem Beispiel werden die Daten mithilfe eines SqlDataAdapter-Objektes aus der Datenbank ermittelt und in ein DataSet gefüllt. Die Selektion der Daten erfolgt mit einer einfachen LINQ-Abfrage und das Resultat wird in die Variable qry weitergegeben. Diesmal wird an die DataSource-Eigenschaft der beiden DataGridView-Controls das Resultat der AsDataView-Methode zugewiesen.

private void btnAsDataView_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.dgvDatabindAsDataView.DataSource = qry.AsDataView();
this.dgvDatabindAsDataViewChanges.DataSource = qry.AsDataView();
}


Wenn ein Eintrag in einem DataGridView geändert wird, wird dieser Änderung mithilfe der Datenbindung an das Datenquellen-Objekt weitergeleitet und der entsprechende Eintrag im Datenquellen-Objekt wird auch geändert.

In der folgende Abbildung sind zwei DataGridView-Controls zu sehen. Die beiden Controls verwenden gleiches Objekt als Datenquelle und sie sind mit Datenbindung an das Datenquellen-Objekt gebunden. Die Änderung im linken DataGridView-Control verursacht eine Änderung im Datenquellenobjekt und dieser Änderung wird dann automatisch an den rechten DataGridView-Control weitergegeben. Dieser Aktion war mit der CopyToDataTable-Variante nicht möglich, weil die CopyToDataTable-Methode keine Zweiweg-Datenbindung unterstützt.


clip_image002

No comments: