Linq to SQL Problem mit DataBinding in Custom Control

01/04/2009 - 15:38 von Sascha Dietl | Report spam
Hi NG,
folgendes Problem beschàftigt mich nun seit einigen Tagen.
Ich habe mit sqlmetal den DataContext generiert. In diesem habe ich eine
Klasse Image, welche klar im DataContext als Table<Image> Images enthalten
ist. Ich habe die Klasse Image mit einer partial Klasse erweitert um eine
Property "Picture" hinzuzufügen, welche mir aus den Binary ein Image erstellt
und umgekehrt. Das ganze will ich nun an ein Custom Control binden.
Ich habe eine neue BindingSource im Designer erzeugt die als DataSource die
Klasse Image enthàlt auf dem Custom Control gebe ich die BindingSource an und
als DataMember die Property Picture aus der Image Klasse. Am Ende übergebe
ich bei der initialisierung die Table<Image> aus dem DataContext.
Die DataSource und DataMember Properties habe ich dementsprechend
implementiert und mit Designern versehen und das funktioniert auch. Jetzt
bekomme ich allerdings leider in meinem Control immer nur eine Liste mit
einer Lànge von 0. Ich habe nach brauchbaren Resourcen zu dem Thema gesucht,
allerdings das ganze immer nur mit DataGridViews gefunden, allerdings will
ich simpel eben nur die eine Property möglichst über den ListBindingHelper in
einer collection haben und nicht immer einen Count von 0.
Vielleicht hat jemand eine Idee oder einen besseren Lösungsansatz im Sinn.

Grüße
Sascha
 

Lesen sie die antworten

#1 Frank Dzaebel
01/04/2009 - 21:04 | Warnen spam
Hallo Sascha,

Ich habe mit sqlmetal den DataContext generiert.



ok, hat ja ~manchmal Vorteile gegenüber dem dem
VS Designer. Also hast Du etwa mal eine bat-Datei
im Projekt à la:

set binDir="%ProgramFiles%\Microsoft SDKs\Windows\v6.0A\bin"
%binDir%\SqlMetal /database:Northwind /dbml:NWind.dbml /namespace:NWind
pause

... die ausführen / und dann die dbml zum Projekt hinzufügt.



In diesem habe ich eine Klasse Image, welche klar im
DataContext als Table<Image> Images enthalten ist.
Ich habe die Klasse Image mit einer partial Klasse
erweitert um eine Property "Picture" hinzuzufügen, welche mir aus den
Binary ein Image erstellt und umgekehrt. Das ganze will ich nun an
ein Custom Control binden.



ja gut, normal hàngt man sich ja ans Format-Event des Binding.
Also etwa:

Binding bdPhoto = new Binding("Image", dataSet, "Employees.Photo");
bdPhoto.Format += new ConvertEventHandler(this.ImageFormat);
Photo.DataBindings.Add(bdPhoto);

private void ImageFormat(object sender, ConvertEventArgs e)
{
byte[] img = (byte[]) e.Value;
MemoryStream ms = new MemoryStream();
int offset = 78; // Nwind spezifisch
ms.Write(img, offset, img.Length - offset);
Bitmap bmp = new Bitmap(ms);
ms.Close(); e.Value = bmp;
}
___________

Aber ok, es geht ja auch so, wie Du es sagtest:

namespace NWind
{
public partial class Employees
{
/// <summary>NWind spezifischer Offset</summary>
const int picOffset = 78;

public Bitmap Picture
{
get
{
byte[] img = this.Photo.ToArray();
MemoryStream ms = new MemoryStream();
ms.Write(img, picOffset, img.Length - picOffset);
Bitmap bmp = new Bitmap(ms);
ms.Close(); return bmp;
}
}
}
}




Jetzt bekomme ich allerdings leider in meinem Control immer
nur eine Liste mit einer Lànge von 0.



ja, aber da musst Du uns jetzt genauer den
relevanten Code oder Hintergründe liefern.
Ja - beim DataGridView würde jetzt ein Bild in den
Spalten angeziegt werden:

Properties.Settings Props = Properties.Settings.Default;

private void Form1_Load(object sender, EventArgs e)
{
Northwind dc = new Northwind(Props.NorthwindConnectionString);
dgv.DataSource = dc.Employees;
dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
}



Ich habe nach brauchbaren Resourcen zu dem Thema gesucht,
allerdings das ganze immer nur mit DataGridViews gefunden, allerdings will
ich simpel eben nur die eine Property möglichst über den ListBindingHelper
in
einer collection haben und nicht immer einen Count von 0.



Nein, natürlich IMHO ganz normal die Standard Binding
Klassen nehmen. Das kriegen wir schon raus...


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

Ähnliche fragen