Formularelement "Button" - Ereignis OnClick

Hallo zusammen,

habe einen Report mit einem Formularelement “Button” … würde gerne auf den Klick in meinem C# Code reagieren. Habe dbzgl. aber in den Beispielen und im Forum leider nichts gefunden.

Bin froh über jeden Tip in die richtige Richtung.

Zusatz: Wenn ich den Report per LL.Print (…) aufrufe, dann werde ich beim ButtonClick im Ereignis LL.ViewerActionResult() benachrichtigt.
Es erfolgt allerdings keine Benachrichtigung, wenn ich über LL.Design (…) den Report öffne und in der Vorschau auf den Button klicke.

Eventuell würde sich hier das HandleHyperlinkAction Event anbieten, setzen Sie einfach einen Hyperlink in der Eigenschaft “Link” des Formularelements (siehe Bild).
image

Im code können Sie dann auf den Klick reagieren:
z.B.

Das klappt so, prima. Vielen Dank!

Noch eine Frage: Falls mehrere Hyperlinks in einem Report sind - wie erfahre ich welcher Link angewählt wurde? Über das HyperLinkClickedEventArgs erfahre ich das nicht, und der sender ist jeweils die List&Label Komponente ?

Die Informationen zu URL steht in der “Data” der HyperLinkClickedEventArgs, also über e.Data würde man da ran kommen.

Danke für die Antwort, aber …

Würde gerne mehrere HyperLinks in einem Report hinterlegen. Jeder dieser HyperLinks soll, wo auch immer, eine Zeichenfolge hinterlegt haben, z.B.: “SendData ID=2 SubID=12”. Ich muss das Data mit “www.” beginnen, ansonsten erhalte ich die Meldung, dass er die Datei nicht findet.

Gibt es eine andere Möglichkeit?

Sie könnten hier ein eigenes Protokoll definieren, sowas wie:

MyApp://SendData?ID=2

dann können Sie im Event das Protokoll prüfen und Ihre gewünschte Aktion durchführen.

Hinweis e.ReturnValue
Das e.ReturnValue bestimmt ob die Aktion “Handled” ist, also wenn man z.B. einen Hyperlink wie z.B. “www.combit.net” einfügt und e.ReturnValue ist auf “0”, würde er den Standardbrowser mit der URL öffnen, e.ReturnValue auf 1 würde “Handled” auf true setzen.

Das klappt so, prima. Vielen Dank!

1 Like

Ich versuche es nun noch mit einer letzten Anschlussfrage:

Gibt es eine Möglichkeit, an der Stelle nun den aktuellen Report (mit mehreren Berichtsparametern) aus C# heraus zu schliessen? Oder aber irgendwie einzuleiten, dass der Report nun geschlossen werden soll (ohne Aufforderung zum Speichern, …)?

Hier müssten Sie dann ein WM_CLOSE an das Preview Fenster schicken, das Fenster könnte man mit der Windows Funktion FindWindow finden und das Handle beim SendMessage verwenden.
Das müssen Sie aber in einen eigenen Task packen, im Eventhandler dürfen Sie das Fenster nicht schließen, das wird dort noch gebraucht (weil es ja eben den Event geschickt hat).
Die Preview über ein SendMessage zu schließen, ist aber nicht der von uns empfohlene Weg, wenn Sie es dennoch umsetzen möchten finden Sie folgend ein kleines mögliches Codesnippets hierzu.

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = false)]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
        static uint WM_CLOSE = 0x10;

        async Task SendWithDelay()
        {            
        // ich habe hier mal ein Delay eingefügt, gilt nur als Beispiel
            await Task.Delay(8000);            
       //Handle der Vorschau ermitteln 
            IntPtr PreviewHandle = FindWindow("L&LViewer", null);
      //Fenster schließen
            if (!PreviewHandle.Equals(IntPtr.Zero))
                SendMessage(PreviewHandle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
        }
      private void button1_Click(object sender, EventArgs e)
        {

            Task t1 = SendWithDelay();
            //Druck starten usw.
         }

Hinweis:
Bei dieser Vorschau darf es sich jedoch nicht um das LL PreviewControl handeln, sondern muss ein eigenes Window mit einer Vorschau sein. Wenn es sich um ersteres handeln würde, dann würden man diesem PreviewControl über das ParentHandle sozusagen den Boden unter den Füßen wegziehen.

Das klappt, vielen Dank. Wenn ich aber Berichtsparameter ausfülle, dann werde ich gefragt ob gespeichert werden soll - gibts da noch ein Flag das evtl. gesetzt werden kann?

Ich vermute mal Sie meinen nicht die Berichtsparameter, sondern unserer FormularElemente :o).
Sie können die Abfrage mittels der Projektparameter deaktivieren, folgend finden Sie ein Beispiel, dies sollte für die LL Instanz gesetzt werden, für das deaktivieren der Abfrage müssen alle unten stehenden Parameter gesetzt werden.

            ListLabel LL = new ListLabel();
            LL.ProjectParameters[LlProjectParameter.SaveAsFilename].Value = "test.xml";
            LL.ProjectParameters[LlProjectParameter.SaveAsFormat].Value = "xml";
            LL.ProjectParameters[LlProjectParameter.SaveAsShowDialog].Value = "0";
            LL.ProjectParameters[LlProjectParameter.SaveAsNoSaveQuery].Value = "1";
            LL.ProjectParameters[LlProjectParameter.SaveAsShowResult].Value = "0";

Vielen Dank für die Hinweise … der PDF Dateiname ist bei mir beim Aufruf der Print Methode noch nicht hinterlegt - er wird im Moment aus Variablen zusammengesetzt - muss also versuchen, den korrekten PDF Dateinamen unmittelbar VOR dem Speichern ins LlProjectParameter.SaveAsFilename einzutragen.

Melde mich wenn es geklappt hat.

Hallo,

ich versuche im QueryFileNameForExportJob Event den Dateinamen für einen Button “Save as PDF” herauszufinden. Wie oben bereits beschrieben verwende ich ein Formularelement vom Typ “Button” mit Aufgabe “Speichern”, Datenformat “PDF” und setze den Dateinamen auf [pdfPath + @LastName + “" + @FirstName + "” + @TimeStamp +".pdf"] → diesen möchte ich im C# Code abfragen.

Aus dem QueryFileNameForExportJobEventArgs bekomme ich “nur” den Report Dateinamen. Also ermittle ich den entsprechenden Button per

        ProjectList pl = new ProjectList(ll);
        pl.GetFromParent();

und gehe die Objekte durch bis ich auf den “Save as PDF” button stosse:

foreach (var item in pl.Objects)
	...
	if (item is ObjectInputButton)
	{
		ObjectInputButton but = item as ObjectInputButton;
		if (but.Action.ActionType == "1")	// Aufgabe "SPEICHERN"
		{
			PropertyInputButtonActionSaveAs pi = but.Action as PropertyInputButtonActionSaveAs;
			if (pi != null)
				string ss = pi.Filename;	--> Exception "Die Eigenschaft ist für das gewählte Objekt nicht definiert..."
		}
	}

Auch diverse Versuche mit pi.GetPropertyValues("…") liefern nur null Rückgaben.

Bin ich da auf dem Holzweg, oder ???

Nochmals Danke im Voraus

Wir hätten einen Lösungsansatz, den wir - weil Sie ein paar Dateien benötigen, es gab noch ein Problem mit der von Ihnen verwendeten Filename-Eigenschaft - über das Forum nicht austauschen können und würden Sie daher bitten sich bei unserem Sales-Team zu melden. Bitte beziehen Sie sich dabei auf den Thread.
Vielen Dank.

Mache ich, vielen Dank.