johann.z
Goto Top

Powershell GUI. Ausgabe in die RichTextBox als Hyperlink

Hallo zusammen,

wie kann die Ausgabe in die RichTextBox als Hyperlink/URL angefügt werden?
Damit der User die angefügten Lines (Ausgabe) per Klick öffnen kann.

$richTextBox1_LinkClicked = { Start-Process -FilePath $($linkLabel1.Text) }

Aktuell funktioniert das Öffnen nur mit einem einzelnen linkLabel1 wie gewünscht.
Und die Ausgabe in der RichTextBox erfolgt nur als String Array Lines, die man nicht wie eine URL per Klick öffnen kann.

Ist es mit PS möglich, die String Array Lines in linkLabels umzuwandeln?
Oder eventuell eine andere Möglichkeit?

Ich habe einiges gefunden, aber leider alles in c# und für mich noch zu komplex.

Links with arbitrary text in a RichTextBox

Da mir der Script in PS vorliegt, möchte ich den Code in PS behalten. Ist aber schon wohl das, was ich brauche, nur dass in meinem Fall die Lines spaltenweise und ohne Aufbereitung / Prüfung angefügt werden können.

Vielen Dank im voraus
2022-04-20 08_55_22-
2022-04-20 09_34_01-alt

Content-Key: 2544278331

Url: https://administrator.de/contentid/2544278331

Printed on: May 9, 2024 at 04:05 o'clock

Mitglied: 1915348599
Solution 1915348599 Apr 20, 2022 updated at 09:40:02 (UTC)
Goto Top
So ...
$richTextBox1_LinkClicked = { Start-Process -FilePath $_.LinkText }
(Btw. Doku lesen hilft: https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.linkcli ..)

Ich würde stattdessen gleich ein DataGridView Control nehmen und den Schmuh mit der Richtextbox gleich schnell vergessen ...
Denn das DataGridview hat gleich die passende Hyperlink-Column dafür parat
https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.datagri ...

#Generated Form Function
function GenerateForm {

#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  
#endregion

#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$datagridview = New-Object System.Windows.Forms.DataGridView
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
$handler_form1_Load = {
    $datagridview.rows.Add(@("Administrator","https://administrator.de"))  
    $datagridview.rows.Add(@("Google","https://google.de"))  
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
	$form1.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 296
$System_Drawing_Size.Width = 438
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Name = "form1"  
$form1.Text = "DataGridView Link Column Beispiel"  
$form1.add_Load($handler_form1_Load)

$datagridview.Anchor = 15
$System_Windows_Forms_DataGridViewTextBoxColumn_1 = New-Object System.Windows.Forms.DataGridViewTextBoxColumn
$System_Windows_Forms_DataGridViewTextBoxColumn_1.HeaderText = "Spalte1"  
$System_Windows_Forms_DataGridViewTextBoxColumn_1.Name = ""  
$System_Windows_Forms_DataGridViewTextBoxColumn_1.Width = 100

$datagridview.Columns.Add($System_Windows_Forms_DataGridViewTextBoxColumn_1)|Out-Null
$System_Windows_Forms_DataGridViewLinkColumn_2 = New-Object System.Windows.Forms.DataGridViewLinkColumn
$System_Windows_Forms_DataGridViewLinkColumn_2.AutoSizeMode = 16
$System_Windows_Forms_DataGridViewLinkColumn_2.HeaderText = "Linkspalte"  
$System_Windows_Forms_DataGridViewLinkColumn_2.Name = ""  
$System_Windows_Forms_DataGridViewLinkColumn_2.Width = 271

$datagridview.Columns.Add($System_Windows_Forms_DataGridViewLinkColumn_2)|Out-Null
$datagridview.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 12
$datagridview.Location = $System_Drawing_Point
$datagridview.Name = "datagridview"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 272
$System_Drawing_Size.Width = 414
$datagridview.Size = $System_Drawing_Size
$datagridview.TabIndex = 0
$datagridview.ReadOnly = $true
$datagridview.SelectionMode = [System.Windows.Forms.DataGridViewSelectionMode]::FullRowSelect
$dataGridView.add_CellContentClick({
    # wenn auf den Inhalt der zweiten Spalte geklickt wird öffne den Link
    if ($_.ColumnIndex -eq 1){
        start $datagridview.Rows[$_.RowIndex].Cells[$_.ColumnIndex].Value
    }
})

$form1.Controls.Add($datagridview)

#endregion Generated Form Code

#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null

} #End Function

#Call the Function
GenerateForm

Wenn es unbedingt eine Richtextbox sein muss, die erkennt automatisch enthaltene Links wenn die Eigenschaft detectUrls auf $true steht (was sie per Default ist), du brauchst dann nur das LinkClicked event benutzen um den Link aufrufen zu können. Guckst du
#Generated Form Function
function GenerateForm {

#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  
#endregion

#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$richTextBox1 = New-Object System.Windows.Forms.RichTextBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
$handler_form1_Load= 
{
    $richTextBox1.Text = "Das ist ein Testlink: file:///C:\windows\explorer.exe"  
}

$handler_richTextBox1_LinkClicked= 
{
    start $_.LinkText
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
	$form1.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 296
$System_Drawing_Size.Width = 438
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Name = "form1"  
$form1.Text = "DataGridView Link Column Beispiel"  
$form1.add_Load($handler_form1_Load)

$richTextBox1.Anchor = 15
$richTextBox1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 12
$richTextBox1.Location = $System_Drawing_Point
$richTextBox1.Name = "richTextBox1"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 272
$System_Drawing_Size.Width = 414
$richTextBox1.Size = $System_Drawing_Size
$richTextBox1.TabIndex = 0
$richTextBox1.Text = ""  
$richTextBox1.add_LinkClicked($handler_richTextBox1_LinkClicked)

$form1.Controls.Add($richTextBox1)

#endregion Generated Form Code

#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null

} #End Function

#Call the Function
GenerateForm
Member: Johann.Z
Johann.Z Apr 20, 2022 at 09:58:53 (UTC)
Goto Top
oo, ist einiges, was ich mir ansehen muss, vielen Dank schonmal dafür!

zu. DetectUrls

Das hatte ich bereits überprüft, steht auf True.

Aber ich lese mir erstmal alles durch
2022-04-20 11_55_24-saugopti - microsoft visual studio
Member: Johann.Z
Johann.Z Apr 20, 2022 at 10:07:54 (UTC)
Goto Top
werden nicht als Link erkannt, da als Pfad (String) ankommen, denke ich. Die Formatierung entspricht nicht den hinterlegten Settings.
Mitglied: 1915348599
1915348599 Apr 20, 2022 updated at 10:17:22 (UTC)
Goto Top
Zitat von @Johann.Z:

werden nicht als Link erkannt, da als Pfad (String) ankommen, denke ich. Die Formatierung entspricht nicht den hinterlegten Settings.
?? Hast du mein Beispiel überhaupt mal probiert, geht problemlos , du musst es nur richtig machen face-wink.

Dateisystemlinks müssen natürlich mit file:/// Protocol-Prefix hinterlegt werden sonst werden diese verständlicherweise nicht automatisch erkannt!
$richTextBox1.Text = "Das ist ein Testlink: file:///C:\windows\explorer.exe"  
Member: Johann.Z
Johann.Z Apr 20, 2022 at 11:15:12 (UTC)
Goto Top
Dateisystemlinks müssen natürlich mit file:/ Protocol-Prefix hinterlegt werden sonst werden diese verständlicherweise nicht automatisch erkannt!

file:
/ das war es! Jetzt passt es.

Ist zwar nicht sonderlich schön, wenn Präfixe sichtbar sind, aber es funktioniert, besten Dank.
Wenn noch file:/// raus maskiert, und die Lines per Kontext markiert (um in die Zwischenablage kopieren zu können) werden könnten, wäre es perfekt.
Dein Code funktionierte selbstverständlich auch!
2022-04-20 13_00_31-bmg511
2022-04-20 12_50_05-saugopti - microsoft visual studio
Mitglied: 1915348599
1915348599 Apr 20, 2022 updated at 11:17:14 (UTC)
Goto Top
Zitat von @Johann.Z:
Wenn noch file:/// raus maskiert, und die Lines per Kontext markiert (um in die Zwischenablage kopieren zu können) werden könnten, wäre es perfekt.
Das geht mit der Erkennung leider nicht, da würde ich dann wie schon dazu geraten zu einem DataGridView greifen, damit hast du wesentlich mehr Anpassungs-Möglichkeiten.
Member: Johann.Z
Johann.Z Apr 20, 2022 at 11:29:57 (UTC)
Goto Top
Okay, so ist es auch gut, die User können nicht alles haben.
Die Hauptanforderung war, die Files per Klick öffnen zu können und das ist damit erfüllt.
Vielen Dank