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 . 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.
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 . 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();
}
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.
Ü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?
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 .
jbartlau
(combit - Jochen Bartlau)
Split this topic
17