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.
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
7 Kommentare
Neuester Kommentar

So ...
(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 ...
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
$richTextBox1_LinkClicked = { Start-Process -FilePath $_.LinkText }
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

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 werden nicht als Link erkannt, da als Pfad (String) ankommen, denke ich. Die Formatierung entspricht nicht den hinterlegten Settings.
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"

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.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.