Search code examples
powershellcomboboxpanel

ComboBox.SelectedItem giving Null value


I have been stuck in this for whole day. I am creating a UI using PowerShell forms. In that:

  • user select an option from 1st combobox. click button Go
  • Based on the selection, a panel will appear having another combobox.
  • if user select another option in 1st combobox then another panel appears with another combobox
  • After selecting options from panel comboboxes, user clicks on start button.
  • This leads to a function which stores the selected options to a variable.

Problem

  • Now when user selects the options from the comboboxes of panels, I am using $combobox.selecteditem.Tostring to get the values. But it gives me NULL result. Here is my code..
    $global:Button1Clicked = 0;
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
    [System.Windows.Forms.Application]::EnableVisualStyles()
    [System.Windows.Forms.FormClosingEventHandler]
    
    $Form = New-Object system.Windows.Forms.Form
    $Form.ClientSize = '1500,800'
    $Form.text = "NextUI "
    $Form.BackColor = 'White'
    $Form.TopMost = $true
    $Form.add_closing(
    {
    if($global:Button2Clicked)
    {
    $global:Button2Clicked = 0;
    
    $_.cancel = $true;
    }
    })
    
    
    $panel1 = New-Object system.Windows.Forms.Panel
    $panel1.AutoSize = $true
    $panel1.Width = 1200
    $panel1.Height = 200
    $panel1.location = New-Object System.Drawing.Point(50,100)
    $panel1.Visible = $false
    $panel1.Controls.Add($label3)
    $panel1.Controls.Add($comboBox2)
    $panel1.BorderStyle = 1
    
    
    $panel2 = New-Object system.Windows.Forms.Panel
    $panel2.AutoSize = $true
    $panel2.Width = 1200
    $panel2.Height =200
    $panel2.location = New-Object system.Drawing.Point(50,100)
    $panel2.Visible = $false
    $panel2.Controls.Add($label4)
    $panel2.Controls.Add($ComboBox3)
    $panel2.BorderStyle = 1
    
    $Label1 = New-Object system.Windows.Forms.Label
    $Label1.text = "Select Module"
    $Label1.AutoSize = $true
    $Label1.location = New-Object System.Drawing.Point(35,50)
    $Label1.Font = 'segoe ui,9.5'
    
    $Label2 = New-Object system.Windows.Forms.Label
    $Label2.text = "SharePoint Settings"
    $Label2.AutoSize = $true
    $Label2.location = New-Object System.Drawing.Point(35,15)
    $Label2.Font = 'Segoe UI Semibold,9.5'
    
    $Label3 = New-Object system.Windows.Forms.Label
    $Label3.text = "Choose file and folder permission option"
    $Label3.AutoSize = $true
    $Label3.location = New-Object System.Drawing.Point(100,200)
    $Label3.Font = 'segoe ui,9.5'
    
    
    $Label4 = New-Object system.Windows.Forms.Label
    $Label4.AutoSize = $True
    $Label4.text = "File Permission"
    $Label4.location = New-Object System.Drawing.Point(100,200)
    $Label4.Font = 'Segoe UI ,9.5'
    
    
    ################ Module combo box ################
    
    $ComboBox1 = New-Object system.Windows.Forms.ComboBox
    $ComboBox1.text = "Select Module"
    $ComboBox1.width = 200
    $ComboBox1.height = 20
    $ComboBox1.location = New-Object System.Drawing.Point(310, 45)
    $ComboBox1.Font = 'Microsoft Sans Serif,10'
    $combobox1.items.Add("ControlSettings")
    $combobox1.items.Add("NextSettings")
    
    
    ######## file and folder permission #############
    $ComboBox2 = New-Object system.Windows.Forms.ComboBox
    $ComboBox2.text = "select an option"
    $ComboBox2.width = 200
    $ComboBox2.height = 20
    $ComboBox2.location = New-Object System.Drawing.Point(450, 200)
    $ComboBox2.Font = 'Microsoft Sans Serif,10'
    $ComboBox2.items.Add("View") 
    $ComboBox2.items.Add("Edit") 
    
    $ComboBox3 = New-Object system.Windows.Forms.ComboBox
    $ComboBox3.text = "select an option"
    $ComboBox3.width = 200
    $ComboBox3.height = 20
    $ComboBox3.location = New-Object System.Drawing.Point(450, 200)
    $ComboBox3.Font = 'Microsoft Sans Serif,10'
    $ComboBox3.items.Add("View") 
    $ComboBox3.items.Add("Edit")
    
    
    Function Button2_Click()
    {
    
    if ($ComboBox1.SelectedIndex -eq 0)
    {
    $panel2.Visible = $true
    $panel1.Visible = $false
    }
    
    if ($ComboBox1.SelectedIndex -eq 1)
    {
    $panel1.Visible = $true
    $panel2.Visible = $false
    
    }
    
    
    }
    
    $Button1 = New-Object system.Windows.Forms.Button
    $Button1.text = "Start"
    $Button1.width = 150
    $Button1.height = 30
    $Button1.BackColor = '#F6CEE3'
    $Button1.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $Button1.location = New-Object System.Drawing.Point(500, 700)
    $Button1.Font = 'segoe ui,10'
    $Button1.Add_Click({
    Button1_Click;
    $global:Button1Clicked = 1;
    })
    
    ############# Button 'Go' #############
    
    $Button2 = New-Object system.Windows.Forms.Button
    $Button2.text = "Go"
    $Button2.width = 100
    $Button2.height = 30
    $Button2.BackColor = '#F6CEE3'
    $Button2.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $Button2.location = New-Object System.Drawing.Point(680, 43)
    $Button2.Font = 'segoe ui,10'
    $Button2.Add_Click({
    Button2_Click;
    $global:Button2Clicked = 1;
    })
    
    
    ######### code Starts ###########
    
    function Button1_Click()
    {
        $link = $comboBox2.SelectedItem.ToString();
        $linktype = $comboBox3.SelectedItem.ToString();
    
    
    }
    ####### end of code ######
    
    $form.Controls.Add($Panel1)
    $form.Controls.Add($Panel2)
    $form.Controls.Add($button1)
    $form.Controls.Add($comboBox1)
    $form.Controls.Add($button2)
    $form.Controls.Add($pictureBox1)
    $form.Controls.Add($label1)
    $form.Controls.Add($label2)
    
    [void]$Form.Add_Shown({ $Form.Activate() })
    [void]$Form.ShowDialog()

Solution

  • The issue is that your variables are being set in a function, so they are scoped to that function. There's really no reason to put that in a function, put it directly in the .add_click() instead. Or if you feel that you need to keep it in the function you can scope the variable like you did with $global:ButtonClicked and set them to $global:Link and $global:LinkType.

    Edit: Order does make a difference in PowerShell, so I did move some stuff around in your script to make it work right, but I was able to get values to reflect fine when I put them in the global scope.

    $global:Button1Clicked = 0;
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
    [System.Windows.Forms.Application]::EnableVisualStyles()
    [System.Windows.Forms.FormClosingEventHandler]
    
    ######### code Starts ###########
    
    function Button1_Click()
    {
        write-host "Link = $global:link"
        write-host "Link Type = $global:linktype"
    
    }
    
    Function Button2_Click()
    {
    
    if ($ComboBox1.SelectedIndex -eq 0)
    {
    $panel2.Visible = $true
    $panel1.Visible = $false
    }
    
    if ($ComboBox1.SelectedIndex -eq 1)
    {
    $panel1.Visible = $true
    $panel2.Visible = $false
    
    }
    
    
    }
    
    ####### end of code ######
    
    $Form = New-Object system.Windows.Forms.Form
    $Form.ClientSize = '1500,800'
    $Form.text = "NextUI "
    $Form.BackColor = 'White'
    $Form.TopMost = $true
    $Form.add_closing(
    {
    if($global:Button2Clicked)
    {
    $global:Button2Clicked = 0;
    
    $_.cancel = $true;
    }
    })
    
    ################ Module combo box ################
    
    $ComboBox1 = New-Object system.Windows.Forms.ComboBox
    $ComboBox1.text = "Select Module"
    $ComboBox1.width = 200
    $ComboBox1.height = 20
    $ComboBox1.location = New-Object System.Drawing.Point(310, 45)
    $ComboBox1.Font = 'Microsoft Sans Serif,10'
    $combobox1.items.Add("ControlSettings")
    $combobox1.items.Add("NextSettings")
    
    
    ######## file and folder permission #############
    $ComboBox2 = New-Object system.Windows.Forms.ComboBox
    $ComboBox2.text = "select an option"
    $ComboBox2.width = 200
    $ComboBox2.height = 20
    $ComboBox2.location = New-Object System.Drawing.Point(450, 200)
    $ComboBox2.Font = 'Microsoft Sans Serif,10'
    $ComboBox2.items.AddRange(@("View","Edit") )
    #$ComboBox2.items.Add("Edit") 
    
    $ComboBox3 = New-Object system.Windows.Forms.ComboBox
    $ComboBox3.text = "select an option"
    $ComboBox3.width = 200
    $ComboBox3.height = 20
    $ComboBox3.location = New-Object System.Drawing.Point(450, 200)
    $ComboBox3.Font = 'Microsoft Sans Serif,10'
    $ComboBox3.items.Add("View") 
    $ComboBox3.items.Add("Edit")
    
    $panel1 = New-Object system.Windows.Forms.Panel
    $panel1.AutoSize = $true
    $panel1.Width = 1200
    $panel1.Height = 200
    $panel1.location = New-Object System.Drawing.Point(50,100)
    $panel1.Visible = $false
    $panel1.Controls.Add($label3)
    $panel1.Controls.Add($comboBox2)
    $panel1.BorderStyle = 1
    
    
    $panel2 = New-Object system.Windows.Forms.Panel
    $panel2.AutoSize = $true
    $panel2.Width = 1200
    $panel2.Height =200
    $panel2.location = New-Object system.Drawing.Point(50,100)
    $panel2.Visible = $false
    $panel2.Controls.Add($label4)
    $panel2.Controls.Add($ComboBox3)
    $panel2.BorderStyle = 1
    
    $Label1 = New-Object system.Windows.Forms.Label
    $Label1.text = "Select Module"
    $Label1.AutoSize = $true
    $Label1.location = New-Object System.Drawing.Point(35,50)
    $Label1.Font = 'segoe ui,9.5'
    
    $Label2 = New-Object system.Windows.Forms.Label
    $Label2.text = "SharePoint Settings"
    $Label2.AutoSize = $true
    $Label2.location = New-Object System.Drawing.Point(35,15)
    $Label2.Font = 'Segoe UI Semibold,9.5'
    
    $Label3 = New-Object system.Windows.Forms.Label
    $Label3.text = "Choose file and folder permission option"
    $Label3.AutoSize = $true
    $Label3.location = New-Object System.Drawing.Point(100,200)
    $Label3.Font = 'segoe ui,9.5'
    
    
    $Label4 = New-Object system.Windows.Forms.Label
    $Label4.AutoSize = $True
    $Label4.text = "File Permission"
    $Label4.location = New-Object System.Drawing.Point(100,200)
    $Label4.Font = 'Segoe UI ,9.5'
    
    
    $Button1 = New-Object system.Windows.Forms.Button
    $Button1.text = "Start"
    $Button1.width = 150
    $Button1.height = 30
    $Button1.BackColor = '#F6CEE3'
    $Button1.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $Button1.location = New-Object System.Drawing.Point(500, 700)
    $Button1.Font = 'segoe ui,10'
    $Button1.Add_Click({
    $global:link = $comboBox2.SelectedItem.ToString();
    $global:linktype = $comboBox3.SelectedItem.ToString();
    Button1_Click;
    $global:Button1Clicked = 1;
    })
    
    ############# Button 'Go' #############
    
    $Button2 = New-Object system.Windows.Forms.Button
    $Button2.text = "Go"
    $Button2.width = 100
    $Button2.height = 30
    $Button2.BackColor = '#F6CEE3'
    $Button2.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $Button2.location = New-Object System.Drawing.Point(680, 43)
    $Button2.Font = 'segoe ui,10'
    $Button2.Add_Click({
    Button2_Click;
    $global:Button2Clicked = 1;
    })
    
    $form.Controls.Add($Panel1)
    $form.Controls.Add($Panel2)
    $form.Controls.Add($button1)
    $form.Controls.Add($comboBox1)
    $form.Controls.Add($button2)
    $form.Controls.Add($pictureBox1)
    $form.Controls.Add($label1)
    $form.Controls.Add($label2)
    
    [void]$Form.Add_Shown({ $Form.Activate() })
    [void]$Form.ShowDialog()
    

    When I ran that, set the two combobox values, and clicked Start I got text in the ISE saying what I set the Link and LinkType variables to, and was able to echo $global:link and $global:linktype to see the values correctly assigned.