Textbox + file dialog name GUI do not work in a function

Hello everyone, I have the problem that when I open a file with OpenFileDialog in my script, the file is not transferred to the textbox. In general, I cannot enter any text in the text box. But if I do this outside the function, it works as I imagine. But it has to happen in the function.

I don’t understand what the problem is. Can you please help me?

This is the code, if you open program 1, you get into the program with the selection of a file:

# Laden der Assembly für Windows Forms
Add-Type -AssemblyName System.Windows.Forms

# Erstellen des Hauptfensters
$form = New-Object System.Windows.Forms.Form
$form.Text = "Script Test"
$form.Size = New-Object System.Drawing.Size(600, 400)
$form.StartPosition = "CenterScreen"

# Funktion für den Button-Click-Event
function ButtonClickProgram1($startP1) {
    # Hier kannst du die Aktionen für jeden Button definieren
    $form.Controls.Clear()
    $form.Text = "Programm 1"

    # Erstellen Sie ein Textfeld
    $textBox = New-Object System.Windows.Forms.TextBox
    $textBox.Width = 250
    $textBox.Left = 10
    $textBox.Top = 30
    # Setzen Sie die Schriftgröße für den Text in der TextBox
    $textBox.Font = New-Object System.Drawing.Font("Arial", 12)  # Hier wird die Schriftgröße festgelegt

    # Erstellen Sie einen Button
    $button = New-Object System.Windows.Forms.Button
    $button.Text = "Datei auswählen"
    $button.Font = New-Object System.Drawing.Font("Arial", 10) 
    $button.Left = 280
    $button.Top = 28
    $button.Width = 160
    $button.Height = 30

    # Handler für den Button-Click-Event hinzufügen
    $button.Add_Click({
        $fileDialog = New-Object System.Windows.Forms.OpenFileDialog
        $fileDialog.Filter = "CSV-Dateien (*.csv)|*.csv|Textdateien (*.txt)|*.txt"
        $result = $fileDialog.ShowDialog()

        if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
            $textBox.Text = $fileDialog.FileName
        }
    })

    # Fügen Sie die Steuerelemente dem Formular hinzu
    $form.Controls.Add($textBox)
    $form.Controls.Add($button)
}

# Funktion für den Button-Click-Event
function ButtonClickProgram2($startP2) {
    # Hier kannst du die Aktionen für jeden Button definieren
    $form.Controls.Clear()
    $form.Text = "Programm 2"
}

# Funktion für den Button-Click-Event
function ButtonClickProgram3($startP3) {
    # Hier kannst du die Aktionen für jeden Button definieren
    $form.Controls.Clear()
    $form.Text = "Programm 3"
}

# Funktion für den Button-Click-Event
function ButtonClickProgram4($startP4) {
    # Hier kannst du die Aktionen für jeden Button definieren
    $form.Controls.Clear()
    $form.Text = "Programm 4"
}

# Funktion für den Button-Click-Event
function ButtonClickProgram5($startP5) {
    # Hier kannst du die Aktionen für jeden Button definieren
    $form.Controls.Clear()
    $form.Text = "Programm 5"
}


# Erstellen der Programmbuttons
$programButton1 = New-Object System.Windows.Forms.Button
$programButton1.Text = "Programm 1 starten"
$programButton1.Add_Click({ ButtonClickProgram1 $startP1})
$programButton2 = New-Object System.Windows.Forms.Button
$programButton2.Text = "Programm 2 starten"
$programButton2.Add_Click({ ButtonClickProgram2 $startP2})
$programButton3 = New-Object System.Windows.Forms.Button
$programButton3.Text = "Programm 3 starten"
$programButton3.Add_Click({ ButtonClickProgram3 $startP3})
$programButton4 = New-Object System.Windows.Forms.Button
$programButton4.Text = "Programm 4 starten"
$programButton4.Add_Click({ ButtonClickProgram4 $startP4})
$programButton5 = New-Object System.Windows.Forms.Button
$programButton5.Text = "Programm 5 starten"
$programButton5.Add_Click({ ButtonClickProgram5 $startP5})

# Positionieren der Buttons
$programButton1.Location = New-Object System.Drawing.Point(250, 50)
$programButton2.Location = New-Object System.Drawing.Point(250, 100)
$programButton3.Location = New-Object System.Drawing.Point(250, 150)
$programButton4.Location = New-Object System.Drawing.Point(250, 200)
$programButton5.Location = New-Object System.Drawing.Point(250, 250)

# Hinzufügen der Buttons zum Hauptfenster
$form.Controls.Add($programButton1)
$form.Controls.Add($programButton2)
$form.Controls.Add($programButton3)
$form.Controls.Add($programButton4)
$form.Controls.Add($programButton5)

# Zeigen des Hauptfensters
$form.ShowDialog()


![sc|575x177](upload://ek4ghNz7332P3JjubX3e5SnzShQ.png)

Hi,

Welcome to the forum :wave:

This is a problem with variable scope. The $textbox variable in Add_Click is not the $textbox variable declared in the function. You can explicitly declare the scope to ensure you reference the same variable:

function ButtonClickProgram1($startP1) {
    # Hier kannst du die Aktionen für jeden Button definieren
    $form.Controls.Clear()
    $form.Text = "Programm 1"

    # Erstellen Sie ein Textfeld
    $script:textBox = New-Object System.Windows.Forms.TextBox

   ...

    $button.Add_Click({
        $fileDialog = New-Object System.Windows.Forms.OpenFileDialog
        $fileDialog.Filter = "CSV-Dateien (*.csv)|*.csv|Textdateien (*.txt)|*.txt"
        $result = $fileDialog.ShowDialog()

        Update-TextBox($result)
        if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
            $script:textBox.Text = $fileDialog.FileName
        }
    })

    ...
1 Like

Hi, many thanks for your anser. Thank you very much for your answer. Unfortunately, it doesn’t work for me either. Here the error message is displayed that the property “Text” was not found for the object.

Please post your updated code. It works fine for me.

Ahh sorry, I did a mistake. I have tested it again and now it works. Thank you very much :slight_smile:

I had set the variable $textBox = New-Object System.Windows.Forms.TextBox. After I removed this it works

1 Like