Bilder (byte-Arrays) als String

Guten Morgen,

ich habe ein Problem mit dem Designer. Ich füge ein ganzes Objekt als Variable hinzu ( _listLabel.Variables.Add(variable.Name, variable.Obj):wink:
In meinem Objekt gibt es eine Property “Logo” vom Typ byte-Array. Ist in dem Objekt ein gültiges Logo enthalten, so wird es im Designer als Bild angeboten und ich kann es einfach hinaufziehen. Ist aber das Bild nicht vorhanden (byte[0]), so wird die Property der Variable auf einmal als String angeboten, und es gibt sogar einen Designerfehler (String, Bild erwartet).

Leider kann ich bei der Überladung von Variables.Add(string Name, object Objekt) den Typ (LlFieldType.Drawing) nicht direkt angeben. Der Typ kann nur bei der letzten Überladung Variables.Add(string name, string value, LlFieldType fieldType) angegeben werden - aber ich hab ja ein Bild, und keinen String.

Ich möchte, dass Logo immer ein Bild im Designer ist, auch wenn mal kein echtes Logo vorhanden ist. Wie muss ich das machen?

Guten Morgen :slight_smile: - interessante Frage. In der Tat werden Byte-Arrays nur dann als Bilder angezeigt, wenn sie auch als solche erkannt werden können, es könnten ja auch andere BLOB-Inhalte enthalten sein. Wenn die Inhalte über einen Datenprovider übergeben werden kann das AutoDefineField-Event verwendet werden um den Typen “geradezubiegen”.

In Ihrem Fall bleibt nur der “der erste gewinnt”-Ansatz. Melden Sie einfach die Bildvariable (und nur diese) vorab schon an, in etwa so:

// Grafikfeld vorab als solches bekannt machen - die erste Typendeklaration gewinnt
_listLabel.Variables.Add("Object.ImageProperty", String.Empty, LlFieldTypeDrawing);

// und jetzt weiter wie schon im Code vorhanden
_listLabel.Variables.Add(variable.Name, variable.Obj)

Das Object.ImageProperty sollte dabei dem Namen der Variablen entsprechen wie sie sich im Augenblick aus der Anmeldung schon ergibt. Damit überschreiben Sie das Standardverhalten und sollten zuverlässig ein Bild erhalten. Könnten Sie das einmal ausprobieren?

A post was split to a new topic: PDF-Variablen als Stream übergeben

Guten Morgen,

leider klappen beide Ansätze nicht. Beim ersten Ansatz mit Prüfen auf AutoDefineField (eher AutoDefineVariable) wird das event leider gar nicht geworfen, warum weiß ich nicht.

Und beim zweiten Ansatz bleibt leider alles so wie es ist. ist kein Bild angegeben, bleibt es ein String-Feld.

Was ich mir wünschen würde wäre eine Überladung der Add-Methode wie folgt:
public virtual void Add(string name, object value, LlFieldType fieldType);

Dann könnte ich ein Object übergeben und trotzdem den Typ explizit festlegen. Könnt ihr das bauen?

Ok, ich habs…

Also, zum einen ist es der “letzte-gewinnt”-Ansatz, also erst das gesamte Objekt hinzufügen und danach nochmal die Variable mit dem konkreten Objekt.
und zusätzlich mache ich beim Hinzufügen das hier - Byte-Arrays nach images konvertieren. Dann erkennt er auch leere Bilder als Bild.

                byte[] arr = (byte[])variable.Obj;
                Image image = null;
                if (arr.Length > 0)
                {
                    using (var ms = new MemoryStream(arr))
                    {
                        image = Image.FromStream(ms);
                    }
                }
                _listLabel.Variables.Add(variable.Name, image);

Danke trotzdem für das auf den richtigen Weg bringen… Mein Vorschlag könnt ihr ja vlt. dennoch in einer der folgenden Versionen berücksichtigen.
Viele Grüße

1 Like

Das wird nur dann ausgelöst, wenn die Variablen/Felder aus einem Datenprovider übergeben werden, nicht in Ihrem Fall :slight_smile:.

Interessant - das hätte ich gerade andersherum erwartet. Aber schön, wenn Sie eine Lösung haben die in Ihrem Kontext zuverlässig funktioniert. Viel Erfolg weiterhin - und bis bald :sunglasses:.

1 Like