Wie geht das Einbinden der Runtime-Bibliothek?

Entschuldigung, wenn die Frage recht dumm erscheint, aber wir sind grade dabei LL zum ersten mal zu testen. Es geht um die Integration der LL-Runtime-Bibliothek in unseren C# Code.
Die Meisten Beispiele beinhalten meistens diee Codezeile LL.Design();, zum Erstellen von Reports.
Beispiel:

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load("..\\sampledata.xml");

if (xmlDocument != null)
{
   // Erstelle ein XmlDataProvider Objekt
   XmlDataProvider provider = new XmlDataProvider(xmlDocument);

   try
   {
      // An das XmlDataProvider Objekt binden
      LL.SetDataBinding(provider, string.Empty);

      // Den Standard-Projektnamen setzen
      LL.AutoProjectFile = "InvoiceList.lst";

      // Dateiauswahldialog anzeigen und den Benutzer das Erstellen von neuen Listen erlauben
      LL.AutoProjectType = LlProject.List | LlProject.FileAlsoNew;

      // Designer aufrufen
      **LL.Design();**
   }
   catch (ListLabelException LlException)
   {
      // Exception abfangen
      MessageBox.Show("Information: " + LlException.Message + "\n\nThis information was generated by a List & Label custom exception.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
   }
}

Dabei wird der Designer gestartet und der fertige Bericht ist im Designer zu sehen. Das ist aber nicht das, was ich brauche. Ich will den Bericht im Hintergrund erstellen und das einfach nur auf der Platte liegen haben. Muss ich dazu immer den Designer öffnen?

Hallo und Willkommen hier im Forum :slight_smile:. Es gibt keine dummen Fragen, allenfalls noch unbekannte Antworten…

Sie können Projektdateien auch direkt per Code erstellen, wenn es das ist, was Sie machen möchten. Werfen Sie einmal einen Blick auf die diversen Beispiele mit “DOM” im Namen. Die Doku finden Sie hier.

Der übliche Workflow wäre ansonsten, ein Projekt im Designer (oder eben per DOM) zu erstellen und - wenn es dann ausgegeben werden soll - die Print() oder Export()-Methode zu verwenden um es auszugeben. Melden Sie sich gerne noch einmal, wenn etwas nicht so funktioniert wie gedacht.

Danke Herr Bartlau,

ich habe jetzt so viel:

 public void RuntimeTry()
        {
            XPathDocument XMLDoc = new XPathDocument("XMLFile1.xml");
            XmlDataProvider provider = new XmlDataProvider(XMLDoc);

            // create List & Label instance
            combit.ListLabel24.ListLabel LL = new combit.ListLabel24.ListLabel();
            LL.DataSource = provider;

            // attach project 
            ProjectList proj = new ProjectList(LL);

            // create new project file 
            proj.Open(Path.Combine(Application.StartupPath, "dynamic.lst"), LlDomFileMode.Create, LlDomAccessMode.ReadWrite);

            // ... modify ...

            // save project
            proj.Save();

            // close project, free resources
            proj.Close();

            ExportConfiguration exportConfiguration = new ExportConfiguration(LlExportTarget.Pdf, "output.pdf", "dynamic.lst");

            LL.Export(exportConfiguration);
        }

Allerdings bekomme ich in der letzten Zeile eine Exception : combit.ListLabel24.LL_No_Object_Exception: “Das Projekt enthält keine Objekte.”

dynamic.lst wird erstellt, aber der Export nach pdf funktioniert nicht.
Was fehlt hier?

Da wäre es interessant zu wissen, was bei // ...modify... passiert. Hier müssten Objekte (z.B. ein Berichtscontainer) angelegt werden, damit der Druck funktioniert. In unserem Simple DOM Sample liest sich der Teil dann z.B. so:

//D: Standardschrift und -größe setzen
//US: Set default font and size
proj.Settings.DefaultFont.FaceName = "\"Calibri\"";
proj.Settings.DefaultFont.Size = "12";

//D: Designschema setzen
//US: Set design scheme
proj.ProjectParameters["LL.DesignScheme"].Contents = "\"COMBITCOLORWHEEL\"";

//D: Eine neue Projektbeschreibung zuweisen
//US: Assign new project description
proj.ProjectParameters["LL.ProjectDescription"].Contents = textBox1.Text;

//D: Ein leeres Text Objekt erstellen
//US: Create an empty text object
ObjectText llobjText = new ObjectText(proj.Objects);

//D: Auslesen der Seitenkoordinaten der ersten Seite
//US: Get the coordinates for the first page
Size pageExtend = proj.Regions[0].Paper.Extent.Get();

//D: Setzen von Eigenschaften für das Textobjekt. Alle Einheiten sind SCM (1/1000 mm).
//US: Set some properties for the text object. All units are SCM (1/1000 mm).
llobjText.Position.Set(10000, 10000, pageExtend.Width - 65000, 27000);

//D: Hinzufügen eines Absatzes und setzen diverser Eigenschaften
//US: Add a paragraph to the text object and set some properties
Paragraph llobjParagraph = new Paragraph(llobjText.Paragraphs);
llobjParagraph.Contents = string.Format("\"{0}\"", textBox1.Text);
llobjParagraph.Font.Bold = "True";

//D: Hinzufügen eines Grafikobjekts
//US: Add a drawing object
ObjectDrawing llobjPic = new ObjectDrawing(proj.Objects);
llobjPic.Source.FileInfo.FileName = textBox2.Text;
llobjPic.Position.Set(pageExtend.Width - 50000, 10000, pageExtend.Width - (pageExtend.Width - 40000), 27000);

//D: Hinzufügen eines Tabellencontainers und setzen diverser Eigenschaften
//US: Add a table container and set some properties
ObjectReportContainer container = new ObjectReportContainer(proj.Objects);
container.Position.Set(10000, 40000, pageExtend.Width - 20000, pageExtend.Height - 44000);

//D: In dem Tabellencontainer eine Tabelle hinzufügen
//US: Add a table into the table container
SubItemTable table = new SubItemTable(container.SubItems);

//D: Gewünschte Tabelle als Datenquelle setzen
//US: Set required source table
table.TableId = comboBoxTable.Text;

//D: Zebramuster für Tabelle definieren
//US: Define zebra pattern for table
table.LineOptions.Data.ZebraPattern.Style = "1";
table.LineOptions.Data.ZebraPattern.Pattern = "1";
table.LineOptions.Data.ZebraPattern.Color = "LL.Scheme.BackgroundColor0";

//D: Eine neue Datenzeile hinzufügen mit allen ausgewählten Feldern
//US: Add a new data line including all selected fields
TableLineData tableLineData = new TableLineData(table.Lines.Data);
TableLineHeader tableLineHeader = new TableLineHeader(table.Lines.Header);

foreach (string fieldName in listBox2.Items)
{
	string fieldWidth = (Convert.ToInt32(container.Position.Width) / listBox2.Items.Count).ToString();

	//D: Kopfzeile definieren
	//US: Define header line
	TableFieldText header = new TableFieldText(tableLineHeader.Fields);
	header.Contents = string.Format("\"{0}\"", fieldName);
	header.Filling.Style = "1";
	header.Filling.Color = "LL.Scheme.BackgroundColor2";
	header.Font.Bold = "True";
	header.Font.Color = "LL.Color.White";
	header.Width = fieldWidth;

	//D: Datenzeile definieren
	//US: Define data line
	TableFieldText tableField = new TableFieldText(tableLineData.Fields);
	tableField.Contents = comboBoxTable.Text + "." + fieldName;
	tableField.Width = fieldWidth;
	tableField.Filling.Pattern = "0";
}

Etwas in der Art müsste noch hinzugefügt werden, wobei Sie die Inhalte natürlich an Ihre Datenstruktur anpassen sollten.

Okay, irgendetwas verstehe ich immer noch nicht, grundsätzlich.
Was ich eigentlich erreichen will ist folgendes:
Ein Kollege erstellt manuell eine .lst-Projektdatei,die ich als Vorlage oder Template bezeichne.
Das Template soll im Code geladen werden, an einen XML-Data-Provider gekoppelt werden und es soll dann eine .lsr Datei erstellt werden, mit den Daten aus dem XMLDataProvider. Und zusätzlich nach .pdf exportiert werden.
Was ich bisher gemacht habe, ist natürlich falsch.
Die Projectlist.Open Methode erstellt eine .lst-Datei, die ich nicht brauche, die habe ich bereits.

Gibt es irgendwo ein Code-Beispiel, wie ich eine lst-Datei öffne und mit einem DataProvider auffülle?
Und dann exportiere?

Deswegen war ich mir auch nicht sicher, ob Sie wirklich eine dynamisch erstellte Datei haben wollen :innocent:. Klar, wenn es die Datei schon gibt ist es einfach - wobei Sie aus der *.lst keine *.lsr erzeugen müssen, Sie würden direkt mit Hilfe der *.lst-Datei einen Export auslösen. Beispiele finden Sie hier, im Prinzip müsste es so gehen:

using(ListLabel LL = new ListLabel())
{
    // Identify the data source
    XmlDataProvider xmlProvider = new XmlDataProvider(@"C:\temp\customers.xml");
    LL.DataSource = xmlProvider;
 
    // Define project type
    LL.AutoProjectType = LlProject.List;
 
    // Execute main function: Export
    string exportFilename = @C:\temp\export.pdf";
    ExportConfiguration exportConfiguration = new ExportConfiguration(LlExportTarget.Pdf, exportFilename, "<Pfad zur bestehenden LST-Datei>");
    LL.Export();  
}

Das sollte schon alles sein, was Sie brauchen.

:hugs:
Es funktioniert!
Bis auf ein kleines Detail: Beim Export muss das Speichern der pdf-Datei manuell bestätigt werden. Das ist natürlich nicht erwünscht, da der gesamte Vorgang im Hintergrund erfolgen soll.

1 Like

Schön, dass es fast schon klappt :smile:. Versuchen Sie einmal, direkt vor LL.Export(); diese Zeile einzufügen:

exportConfiguration.ExportOptions.Add(LlExportOption.ExportQuiet, "1");

Auf diese Weise können Sie auch eine Reihe weiterer Optionen setzen (vgl. die Doku hier).

leider funktioniert es immer noch nicht :frowning:

ExportConfiguration exportConfiguration = new ExportConfiguration(LlExportTarget.Pdf, exportFilename, “InspektionXMLnew.lst”);
exportConfiguration.ShowResult = false;
exportConfiguration.ExportOptions.Add(LlExportOption.ExportPath, “c:\output\”);
exportConfiguration.ExportOptions.Add(LlExportOption.ExportQuiet, “1”);
LL.Export(exportConfiguration);

fehlt noch irgendetwas?

mit

exportConfiguration.ExportOptions.Add(LlExportOption.ExportPath, @“c:\output\”);

davor geht es auch nicht

Übergeben Sie bei exportFilename den vollen Pfad mit Datei? Dann brauchen Sie LlExportOption.Path nicht mehr zu setzen. Schauen Sie sich einmal das C# Export-Beispiel an, da wird genau das gemacht. Klappt es da bei Ihnen?

nein, ich übergebe den Pfad bei dem Dateinamen nicht mit. Hier ist die gesamte Methode:

{
            XPathDocument XMLDoc = new XPathDocument("inspektion_struk.xml");
            XmlDataProvider provider = new XmlDataProvider(XMLDoc);
            combit.ListLabel24.ListLabel LL = new combit.ListLabel24.ListLabel();
            LL.DataSource = provider;
            LL.AutoProjectType = LlProject.List;
            string exportFilename = "export.pdf";
            
            ExportConfiguration exportConfiguration = new ExportConfiguration(LlExportTarget.Pdf, exportFilename, "InspektionXMLnew.lst");
            exportConfiguration.ShowResult = false;
            exportConfiguration.ExportOptions.Add(LlExportOption.ExportPath, @"c:\output\");
            exportConfiguration.ExportOptions.Add(LlExportOption.ExportQuiet, "1");
            try
            {
                LL.Export(exportConfiguration);
            }
            catch (combit.ListLabel24.LL_User_Aborted_Exception e)
            {
                // User hat die manuelle Bestätigung abgebrochen
            }
        }

Welches Export Beispiel meinen Sie? Das hier?

OleDbCommand cmd = CreateOleDbCommand(); 
DbCommandSetDataProvider provider = new DbCommandSetDataProvider(); provider.AddCommand(cmd, "Products"); 
LL.SetDataBinding(provider, "Products"); // create export configuration ExportConfiguration exportConfiguration = new ExportConfiguration(LlExportTarget.Pdf, fileNameBox.Text, "simple.lst"); exportConfiguration.ShowResult = true; // export LL.Export(exportConfiguration);

hier wird der Pfad nicht gesetzt.

Können Sie es einmal so probieren?

{
            XPathDocument XMLDoc = new XPathDocument("inspektion_struk.xml");
            XmlDataProvider provider = new XmlDataProvider(XMLDoc);
            combit.ListLabel24.ListLabel LL = new combit.ListLabel24.ListLabel();
            LL.DataSource = provider;
            LL.AutoProjectType = LlProject.List;
            // Hier den vollen Pfad + Dateiname übergeben
            string exportFilename = @"c:\output\export.pdf";
            
            ExportConfiguration exportConfiguration = new ExportConfiguration(LlExportTarget.Pdf, exportFilename, "InspektionXMLnew.lst");
            exportConfiguration.ShowResult = false;
            exportConfiguration.ExportOptions.Add(LlExportOption.ExportQuiet, "1");
            try
            {
                LL.Export(exportConfiguration);
            }
            catch (combit.ListLabel24.LL_User_Aborted_Exception e)
            {
                // User hat die manuelle Bestätigung abgebrochen
            }
        }

Die Änderung der Zeile :

string exportFilename = “export.pdf”;

string exportFilename = @“c:\output\export.pdf”;

tut es!
Trotzdem, seltsam, es scheint als wäre die Export-Option in der Zeile:

       exportConfiguration.ExportOptions.Add(LlExportOption.ExportPath, @"c:\output\");

wirkungslos.
Kann es sein, dass wir hier einen Bug entdeckt haben? :thinking:
Wie auch immer, DANKE!

1 Like

Vermutlich müssen Sie sich entweder für die eine oder die andere Methode entscheiden - ein Mix wird nicht unterstützt. Das können wir uns ja noch ansehen. Gut dass jetzt alles klappt :slight_smile:.

A post was split to a new topic: Designer in Form hosten?