Hallo zusammen,
ich erstelle in meinem Programm aus einem Base64String einen MemoryStream.
Dieser wird dann an List&Label übergeben und kann dort bearbeit werden. Leider kann der Stream aber nicht durch List&Label vergrößert werden was in einer NotSupportedException endet:
byte[] reportBytes = Convert.FromBase64String(data.ReportDefinition);
using (MemoryStream ms = new MemoryStream(reportBytes))
{
ll.Design(LlProject.List, ms);
SaveReportStreamToDatabase(ms);
}
Wie kann ich diesen Stream expandable "machen"?
Vielen Dank!
Campy
A programmer is just a tool, which converts coffeine into code! 🙂
Moin Campy,
mit dem passenden Konstruktor geht das.
Gruß
muhtanten
Hi muhtanten,
ein writeable reicht jedoch nicht?
Oder welchen meinst du?
Vielen Dank!
Campy
A programmer is just a tool, which converts coffeine into code! 🙂
Hallo muhtanten,
der Stream ist nun expandable!
using (MemoryStream ms = new MemoryStream())
{
ms.Write(reportBytes, 0, reportBytes.Length);
Jedoch kann nun List&Label nicht mehr mit diesem Stream (siehe Code) umgehen ..
Gibt es sonst noch einen Unterschied zwischen dem Konstruktor und der Write() Methode?
Gruß
Campy
A programmer is just a tool, which converts coffeine into code! 🙂
Was ist eigentlich "List&Label"?
Weeks of programming can save you hours of planning
Ok, aber dann solltest du mal beschreiben, was die beiden Methoden eigentlich machen wollen/sollen:
ll.Design(LlProject.List, ms);
SaveReportStreamToDatabase(ms);
Kommt mir irgendwie komisch vor: Aus einem Stream Daten lesen und gleichzeitig den Stream vergrößern zu wollen. Da muß doch noch irgendetwas anderes dahinterstecken, und ich hab keine Lust in der List&Label-Doku danach zu suchen...
Christian
Weeks of programming can save you hours of planning
Oh entschuldigt bitte.
die ll.design() ruft den List&Label Designer auf, deswegen müssen die Änderungen anschließend auch wieder zurück in die Datenbank gespeichert werden (SaveReportStreamToDatabase()). Das Problem ist allerdings, dass es mit dem parameterlosen Konstruktor und der Write() Methode nicht funktioniert.
Wenn ich den weiter oben beschriebenen Konstruktur verwende wird der Designer geöffnet nur die Änderungen können nicht an den Stream weiter übergeben werden.
Gruß
Campy
A programmer is just a tool, which converts coffeine into code! 🙂
ll.design() ruft den List&Label Designer auf, deswegen müssen die Änderungen anschließend auch wieder zurück in die Datenbank gespeichert werden (SaveReportStreamToDatabase()).
Also liest die design-Methode die Daten aus dem Stream und schreibt sie nach dem Bearbeiten wieder in den gleichen Stream zurück. Bist du sicher, daß es so gedacht ist? Was sagt die L&L-Doku dazu?
Weeks of programming can save you hours of planning
Es gibt natürlich noch eine Print() Methode die zum normalen ausdrucken verwendet wird. Jedoch kann und darf der Endkunde auch das ReportLayout anpassen.
Dazu wird eben die Design Methode aufgerufen.
In der ListLabel Doku steht dazu folgendes:
Projektdateien können auch direkt in Datenbanken gespeichert werden. Neben der Mög-lichkeit, diese direkt aus der Datenbank zu entpacken und im lokalen Dateisystem zu speichern kann diese Arbeit auch auf List & Label abgewälzt werden. Die Print und De-sign-Methoden haben Überladungen, die die direkte Angabe eines Streams erlauben.
Bei Verwendung dieser Überladungen sind einige wichtige Verhaltensänderungen zu beachten. Hintergrund für diese ist das Fehlen eines lokalen Dateikontextes und damit verbunden die fehlende Möglichkeit, neue Dateien anzulegen:
· Im Designer ist es nicht möglich, ein neues Projekt anzulegen
· Die Menüpunkte Datei > Speichern unter und Datei > Öffnen sind nicht verfüg-bar
· Die Projektbaustein-Funktionalität ist deaktiviert
· Drilldown ist nicht verfügbar
· Die Designerfunktion "ProjectPath$" ist nicht verfügbar
Für den Designfall kann es natürlich passieren, dass der übergebene Stream modifiziert wird. In diesem Fall müssen Sie nach Ende des Designs den aktualisierten Stream in die Datenbank schreiben.
A programmer is just a tool, which converts coffeine into code! 🙂
Hallo Campy,
vermutlich musst du den Stream zurückspulen (Seek, z.B. SetPosition), nachdem du die Daten hineingeschrieben hast.
herbivore
Hallo herbivore,
du hattest Recht!!! Vielen Dank!
Ist auch irgendwie logisch dass man zurück an den Anfang muss ..
Gruß
Campy
leider brachte das auch keine Besserung.
Mit dem Konstruktor mit Parametern funktioniert das Öffnen, nur die Änderungen können nicht zurück in den Stream geschrieben werden.
Viele Grüße
Campy
A programmer is just a tool, which converts coffeine into code! 🙂
Interessant, dann ändert der Designer also tatsächlich den Inhalt des Streams. Das bedeutet aber auch, daß du den Stream sowohl VOR als auch NACH dem Aufruf der design-Methode zurückspulen müßtest.
Christian
Weeks of programming can save you hours of planning