Problem mit Abfrage / Datenübergabe

Hallo,

ich bin gerade dabei in WPF eine Anwendung zu programmieren, in der die Nutzer eigene SQL Abfragen zusammenbauen können. Mein DataGrid in WPF zeigt dann die jeweilige Abfrage an. Nun möchte ich dieses DataGrid an meinen Report übergeben. Dazu werden zwei Listen an den Report übergeben. Eine List von strings für die Spalten und eine Liste von objects für die Zeilen. Meine Frage ist, wie ich im Designer die Spalten dynamisch generieren kann? Je nach SQL Abfrage können unterschiedlich viele Spalten in der Liste sein.

Außerdem kann ich nicht auf eine Liste von object zugreifen im Designer, wodurch ich auch die Zeilen nicht darstellen kann. Wenn ich auf den Pfeil neben Object klicke, dann wird diese nicht aufgeklappt im Gegensatz zu der Liste von strings.

image


Bin mir nicht sicher, ob ich das richtig verstehe. Eigentlich sollte die Datenquelle so aufgebaut sein:

Spalte 1 Spalte 2
Spalte 1, Wert 1 Spalte 2, Wert 1
Spalte 1, Wert 2 Spalte 2, Wert 2

Dann könnte im Designer die Tabelle gewählt werden, die Spalten platziert und die Zeilen würden sich aus den Zeilen der Datenquelle ergeben.

Wenn es “nur” um die Darstellung eines Grids geht könnte auch dieses Beispiel helfen, das sollte sich für WPF anpassen lassen:

In meinem aktuellen Projekt kenne ich die Struktur der Datenquelle erst zur Laufzeit, da die Nutzer ihre eigenen SQL-Abfragen erstellen können. Daher kann ich keine statische Datenquelle an den Report übergeben. Das bedeutet auch, dass die Spalten jedes Mal variieren und ich diese nicht vorab im Designer anlegen kann.

In meinen früheren Projekten, bei denen die Datenstruktur von Anfang an klar war, habe ich das so gelöst:

ItemsSource="{Binding WorkListCollection}"
private ObservableCollection<WorkListItem> _workListCollection = new ObservableCollection<WorkListItem>();
public ObservableCollection<WorkListItem> WorkListCollection { get { return _workListCollection; } }

 public class WorkListItem
{
private string _entnahmenummer = "";
public string Entnahmenummer { get { return _entnahmenummer; } set { SetVal(ref _entnahmenummer, value); } }
private string _ab0 = "";
public string AB0 { get { return _ab0; } set { SetVal(ref _ab0, value); } }
}

Die WorkListCollection habe ich dann an den Report übergeben und konnte im Designer direkt auf die einzelnen Properties (z.B. Entnahmenummer, AB0) zugreifen.

In meinem aktuellen Projekt kann ich jedoch keine feste Klasse wie WorkListItem erstellen, da sich die Struktur des DataGrids je nach Abfrage ändert. Daher übergebe ich aktuell eine Liste von Strings für die Spaltennamen und eine Liste von Objekten für die Zeilen. Leider weiß ich nicht, wie ich die Spalten im Designer dynamisch anlegen kann.

So auf die schnelle würde ich hier auf die Verwendung der DOM hinweisen, da sich die Properties also Spalten, Tabellen etc. ändern dynamisch sind, solltest du auch kein einzelnes Projekt dafür nehmen das hat ja die andere Spalten usw. drin, entweder du nimmst ein und das selbe Projekt und änderst es immer ab per DOM, ich fände es aber besser wenn du ein neues erstellst basierend auf einem Template oder ähnlichem.
Mal auf die schnelle als Ansatz evntl.
LG

1 Like

Jepp, genau - so macht es das Beispiel, das ich oben angelinkt habe auch.

:slight_smile: hab das gar nicht angeschaut :face_with_hand_over_mouth:

Wir haben ein bestehendes Header Report (.lst), wlches wir bei jedem neuen Report verwenden. Hat man die Möglichkeit mir der DOM-API auch diesen Report in einen neuen zu importieren? Ich habe nur gesehen, dass man mit Open() ein neuen Report anlegt. Wie würde man diesem Report jetzt noch den Header zuweisen?

ProjectList proj = new ProjectList(LL);
proj.Open(Path.Combine(Application.StartupPath, “dynamic.lst”), LlDomFileMode.Create, LlDomAccessMode.ReadWrite);

Den Header im Code nachzubauen wäre viel zu viel Aufwand.

Das sollte über die ImportFrom-Methode möglich sein. Also einfach beide Projekte geöffnet haben und dann

project1.Objects.ImportFrom(project2.Objects);

Alternativ kann das Projekt natürlich auch per DOM als Projektbaustein hinzugefügt werden. Das ist hier dokumentiert: