2008-07-18

LINQ to SQL und WinForm - DataBinding mit BindingSource (DataGridView, TextBox, formattingEnabled Parameter)

Ein Leser von meinem Buch LINQ hat mir die Frage gestellt, wie er in einer WinForm Applikation (WinForm Application) ein numerisches Feld (numeric field) in der Datenbank (database) aktualisieren kann.

Er schreibt, dass er nur die String-Felder (string fields) in der Datenbank (database) aktualisieren kann aber die Änderungen an Numeric-Felder ignoriert werden.

In dem folgenden Beispiel wird der SQL Server als Datenbank (database) und LINQ to SQL wird für den Datenzugriff verwendet. Die Daten werden in einem DataGridView-Control aufgelistet, die mit Hilfe einer BindingSource-Komponente mit den Daten verknüpft ist. Zusätzlich ermöglichen die zwei TextBox-Controls die Bearbeitung der Daten. Die beiden TextBox-Controls sind ebenfalls mit Hilfe der BindingSource-Komponente mit den Daten verknüpft.

Die Datenbanktabelle Person im Design-Modus:

Table Person Design Mode

Script für die Datenbanktabelle (database table) Person:

USE [SampleDb]
GO
/****** Object: Table [dbo].[Person] Script Date: 07/18/2008 21:56:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Person](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Age] [int] NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


WinForm im Desing-Modus sieht wie folgt aus:



image



Und Source-Code innerhalb unser WinForm sieht wie folgt aus:





using System;
using System.Linq;
using System.Windows.Forms;

namespace LinqToSqlDataBindingSample
{
public partial class Form1 : Form
{
private SampleDbDataContext db;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.db = new SampleDbDataContext();

this.loadData();
}

private void loadData()
{
var qry = from p in db.Persons
select p;

this.bindingSource1 = new BindingSource();
this.bindingSource1.DataSource = qry;

this.dataGridView1.DataSource = this.bindingSource1;

this.txtName.DataBindings.Add("Text", this.bindingSource1, "Name");
this.txtAge.DataBindings.Add("Text", this.bindingSource1, "Age", true);
}

private void btnOK_Click(object sender, EventArgs e)
{
MessageBox.Show(this.db.GetChangeSet().ToString());

this.db.SubmitChanges();
}
}
}



Das Age-Feld ist hier als Numeric bzw. als Int definiert. Wie in der folgende Zeilen auch ersichtlich, unterscheiden sich die DataBindings. Beim Feld Age wird noch der Parameter formattingEnabled verwendet.




this.txtName.DataBindings.Add("Text", this.bindingSource1, "Name");
this.txtAge.DataBindings.Add("Text", this.bindingSource1, "Age", true);



ControlBindingsCollection Add formattingEnabled



Wenn der Parameter formattingEnabled den Wert false besitzt oder nicht verwendet wird, dann wird die eingegebene Zahl in das TextBox-Control vom DataBinding ignoriert und der alte Wert wird wieder in das Feld zurück geschrieben.



Ein kleiner Ausschnitt aus einem MSDN-Artikel zu diesem Thema:



Automatic Formatting Using Code


In earlier versions of the .NET Framework you had to manually perform the type conversions and formatting using the Format and Parse events of the Binding object. You can now do this by enabling formatting on the Binding object, either by setting the FormattingEnabled property directly or passing true to the Add method of the ControlBindingsCollection. In addition, you will need to specify a format string, either using the Add method, or by setting the FormatString property of the Binding object.



The following code includes two formatting examples. The first formatting example shows how to create a binding between a DateTime value in the data source and the Text value of a TextBox control. The FormattingEnabled property is set on the Binding object, the FormatString value specifies that the DateTime should be formatted as a long date/time string, and the binding is added to the collection.



Behind the Scenes: Improvements to Windows Forms Data Binding in the .NET Framework 2.0, Part 1



Das Beispielprojekt findet Ihr unter: LinqToSqlDataBindingSample



Viel Spass

No comments: