Laden...

Fragen zu WPF mit LINQ to SQL mit DataGrid

Erstellt von nighty2k vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.897 Views
N
nighty2k Themenstarter:in
8 Beiträge seit 2009
vor 12 Jahren
Fragen zu WPF mit LINQ to SQL mit DataGrid

verwendetes Datenbanksystem: SQL Expess

Hallo Zusammen,

bin gerade am erstellen einer Datenbankanwendung, auf Grund von Designgründen musste ich nun auf WPF umsteigen. In einer komplexen Anwendung gleichzeitig WPF lernen fällt natürlich schwer, daher würde ich mich über etwas Unterstützung von euch freuen.

Fangen wir mal ganz Simpel mit den ersten Fragen an:

Gegeben ist in xaml ein Grid in welchem sich ein dataGrid1 (DataGrid) befindet.
Spalten, Zeilen sind nicht definiert, einfach ein blankes DataGrid.

Weiter ist gegeben eine LINQ Abfrage an einer SQL Express:


IQueryable<Klasse> VariablennameX;

//Klasse könnte jetzt so aussehen:
public int id { get; set; }
public string name { get; set; }
public string val { get; set; }

Frage 1: Wie würdet Ihr die Daten jetzt an das Grid binden, atm mach ich das mit datagrid1.ItemSoure

Frage 2: Wie kann ich es realisieren, das ich im DataGrid nur die Spalte name sehe, der Rest soll also versteckt sein, in WindowsForm umgebung war das ja recht einfach 😃

Frage 3: Ist es möglich, dass wenn ich VariablennameX neu lade, also das Ergebnis der Abfrage neu rein schreibe, dass sich das DataGrid automatisch aktualisiert? Ich gehe davon aus, dass dies mit Frage 1 zusammen hängt 😄

So, das sollte für den Anfang mal reichen, bitte keine Hinweise auf Google, ich hatte bis eben gefühlte 200 Tabs offen, leider macht es irgendwie jeder etwas anders, dass ich nun total verwirrt bin.

Greetz & Thanks

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo nighty2k,

in WPF ist das DataBinding ein sehr mächtiges Werkzeug.
Deshalb ist es auch nicht so einfach es in ein paar Worten zu erklären 😃

Kurz gesagt stellst du für die GUI deine Liste zur Verfügung.
In der GUI bindest du dann das DataGrid per {Binding VariablennameX} an deine Liste.

Im DataGrid kannst du dann das automatische Generieren der Spalten ausschalten und die Spalten-Definition selbst erstellen.
Damit kannst du auch nur den Namen anzeigen

Das Problem mit der Aktualisierung löst sich fast mit dem DataBinding.
Du musst nur noch das INotifyPropertyChanged Interface in deiner Code-Datei implementieren und das PropertyChanged event immer auslösen sobald die Liste geändert wurde.
Damit wird das DataGrid automatisch aktualisiert.

PS: IQueryable ist nicht so geschickt für das DataBinding.
Besser ist das eine ObservableCollection<T> geeignet das diese auch Änderungen in der Collection direkt an die GUI weitergibt.

Das ist jetzt alles ziemlich viel Input auf einmal, aber diese ganze Thematik ist einfach zu umfangreich um es in ein paar Wörtern zu erklären 😃

Gruß
Michael

N
nighty2k Themenstarter:in
8 Beiträge seit 2009
vor 12 Jahren

EDIT
Nachdem jetzt ein paar Stunden ins Land gegangen sind, konnte ich mir mittlerweile einiges selber beantworten, daher editiere ich mal:

Beritrag davor:

So, nun sind zwei Tage vergangen, Zeit sich wieder mal zu Wort zu melden,
danke erst mal an Michael.

In der Tat, Binding und WPF ist sehr mächtig, so mächtig, dass ich bis heute noch nicht dahinter gekommen bin, bzw. es zum laufen gebracht hätte.

Mittlerweile bin ich dahinter gekommen, dank den MSDN Webcasts, einfach Klasse 😃
bin jetzt Binding Fan 😄 , die Möglichkeiten sind ja annähernd unbegrenzt =)

Webcasts von Microsoft zu dem Thema hab ich leider keine gefunden.

Vll, kennt jemand eine gute HowTo Seite? Damit erledigt

Was spricht gegen die IQueryable<T> und für die ObservableCollection<T>
Linq to Sql erstellt ja automatisch IQueryable<T>, lässt sich das ändern, umgehen?
Frage steht noch!

So und noch eine neue Frage:
Bei einem Doppelclick auf ein DataGrid, wird automatisch die Zelle aktiviert zum editieren. Die ganzen UserCanX Parameter sind false. Ich brauch das Grid lediglich zum Anzeigen, Selektieren, bei Doppelklick -> öffnen des Elements in separater GUI.
Konnte ich nun über meine DataTemplates auf IsReadOnly setzen

1.029 Beiträge seit 2010
vor 12 Jahren

Hi,

Wenns nur noch um Linq2Sql geht 😛

Mit der Implementierung von IPropertyChanged erreichst du,
dass dein Grid einzelne Items aktualisiert wenn sich was ändert.

ObervableCollection würde es möglich machen, dass das Grid auch mitbekommt,
wenn was an der Liste geändert wurde (Sort, Add, Remove, etc. ...)

Und das ist auch schon der Grund 😉 IQueryable kann das (leider) nicht...

LG
Achim

N
nighty2k Themenstarter:in
8 Beiträge seit 2009
vor 12 Jahren

Okay verstanden!
Aber wie komm ich nun von meinem IQueryable<T> aus der Linq2Sel zu einer ObervableCollection ? 😄

I
279 Beiträge seit 2008
vor 12 Jahren

Aber wie komm ich nun von meinem IQueryable<T> aus der Linq2Sel zu einer ObervableCollection ? 😄

Vllt. über


new ObservableCollection<DeinDatentyp>(dasErgebnisDeinerAbfrage);

oO

T
146 Beiträge seit 2004
vor 12 Jahren

Ich mache das immer über eine Extensionmethode, die ich ToObservableCollection getauft habe.

Google bietet dazu sicherlich reichlich Informationen an.