johann.z

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
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 2544278331

Url: https://administrator.de/forum/powershell-gui-ausgabe-in-die-richtextbox-als-hyperlink-2544278331.html

Ausgedruckt am: 01.05.2025 um 07:05 Uhr

1915348599
Lösung 1915348599 20.04.2022 aktualisiert um 11:40:02 Uhr
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
Johann.Z
Johann.Z 20.04.2022 um 11:58:53 Uhr
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
Johann.Z
Johann.Z 20.04.2022 um 12:07:54 Uhr
Goto Top
werden nicht als Link erkannt, da als Pfad (String) ankommen, denke ich. Die Formatierung entspricht nicht den hinterlegten Settings.
1915348599
1915348599 20.04.2022 aktualisiert um 12:17:22 Uhr
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"  
Johann.Z
Johann.Z 20.04.2022 um 13:15:12 Uhr
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
1915348599
1915348599 20.04.2022 aktualisiert um 13:17:14 Uhr
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.
Johann.Z
Johann.Z 20.04.2022 um 13:29:57 Uhr
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