Megamidget3
Megamidget3

Reputation: 59

Populate listbox from a selected.item in another listbox

Good day to you all!

I have a Powershell program that I am making for my company. I have 2 listbox, one with the make of printers and the other will be for the models of printers. I was hoping for help to populate the 'model' list with what the user selects in the 'make' list. I understand doing a selecteditem could work, but whatever I do, it doesn't populate the 'model' list.

This is my first time programming and am self-taught. Right now, I am using Windows.Forms to make the GUI.

Any help is appreciated. Thank you so much for this wonderful community of like-minded awesomeness!

*Code:

Add-Type -AssemblyName System.Windows.Forms
$Form_Service = New-Object system.Windows.Forms.Form
$Form_Service.ClientSize = '452,400'
$Form_Service.text = "Service Call"
$Form_Service.TopMost = $true
$Form_Service.StartPosition = 'CenterScreen'

$Label_ValleyID = New-Object system.Windows.Forms.Label
$Label_ValleyID.text = "Enter Valley ID"
$Label_ValleyID.AutoSize = $true
$Label_ValleyID.width= 25
$Label_ValleyID.height = 10
$Label_ValleyID.location = New-Object System.Drawing.Point(45,41)
$Label_ValleyID.Font = 'Microsoft Sans Serif,10'

$TextBox_ValleyID= New-Object system.Windows.Forms.TextBox
$TextBox_ValleyID.multiline= $false
$TextBox_ValleyID.width= 180
$TextBox_ValleyID.height = 20
$TextBox_ValleyID.location = New-Object System.Drawing.Point(45,62)
$TextBox_ValleyID.Font = 'Microsoft Sans Serif,10'

$Label_Make= New-Object system.Windows.Forms.Label
$Label_Make.text = "Make"
$Label_Make.AutoSize = $true
$Label_Make.width= 25
$Label_Make.height = 10
$Label_Make.location = New-Object System.Drawing.Point(45,108)
$Label_Make.Font = 'Microsoft Sans Serif,10'

$ListBox_Make= New-Object system.Windows.Forms.ListBox
$ListBox_Make.text = "Make"
$ListBox_Make.width= 144
$ListBox_Make.height = 50
$ListBox_Make.location = New-Object System.Drawing.Point(45,129)

[void] $ListBox_Make.Items.Add('Brother')
[void] $ListBox_Make.Items.Add('Canon')
[void] $ListBox_Make.Items.Add('HP')
[void] $ListBox_Make.Items.Add('Kyocera')
[void] $ListBox_Make.Items.Add('Ricoh')
[void] $ListBox_Make.Items.Add('Sharp')

$Label_Model = New-Object system.Windows.Forms.Label
$Label_Model.text= "Model"
$Label_Model.AutoSize= $true
$Label_Model.width = 25
$Label_Model.height= 10
$Label_Model.location= New-Object System.Drawing.Point(259,108)
$Label_Model.Font= 'Microsoft Sans Serif,10'

$ListBox_Model = New-Object system.Windows.Forms.ListBox
$ListBox_Model.text= "Model"
$ListBox_Model.width = 146
$ListBox_Model.height= 50
$ListBox_Model.location= New-Object System.Drawing.Point(259,129)

$Label_Location= New-Object system.Windows.Forms.Label
$Label_Location.text = "Location"
$Label_Location.AutoSize = $true
$Label_Location.width= 25
$Label_Location.height = 10
$Label_Location.location = New-Object System.Drawing.Point(45,195)
$Label_Location.Font = 'Microsoft Sans Serif,10'

$TextBox_Location= New-Object system.Windows.Forms.TextBox
$TextBox_Location.multiline= $false
$TextBox_Location.width= 363
$TextBox_Location.height = 20
$TextBox_Location.location = New-Object System.Drawing.Point(45,215)
$TextBox_Location.Font = 'Microsoft Sans Serif,10'

$Label_Problem = New-Object system.Windows.Forms.Label
$Label_Problem.text= "State what is wrong:"
$Label_Problem.AutoSize= $true
$Label_Problem.width = 25
$Label_Problem.height= 10
$Label_Problem.location= New-Object System.Drawing.Point(45,250)
$Label_Problem.Font= 'Microsoft Sans Serif,10'

$TextBox_Problem = New-Object system.Windows.Forms.TextBox
$TextBox_Problem.multiline = $false
$TextBox_Problem.width = 364
$TextBox_Problem.height= 100
$TextBox_Problem.location= New-Object System.Drawing.Point(45,270)
$TextBox_Problem.Font= 'Microsoft Sans Serif,10'

$CheckBox_Nope = New-Object system.Windows.Forms.CheckBox
$CheckBox_Nope.text= "Is your printer inoperable?"
$CheckBox_Nope.width = 250
$CheckBox_Nope.height= 50 
$CheckBox_Nope.location= New-Object System.Drawing.Point(145,295)
$CheckBox_Nope.Font = 'Microsoft Sans Serif,10'

$Button_Submit = New-Object system.Windows.Forms.Button
$Button_Submit.text= "Submit"
$Button_Submit.width = 70
$Button_Submit.height= 30
$Button_Submit.location= New-Object System.Drawing.Point(189,345)
$Button_Submit.Font= 'Microsoft Sans Serif,10'

$Form_Service.controls.AddRange(@($Label_ValleyID,$Label_Make,$Label_Model,$Label_Location,$Label_Problem,$TextBox_ValleyID,$ListBox_Make,$ListBox_Model,$TextBox_Location,$TextBox_Problem,$Button_Submit,$CheckBox_Nope))

if ($ListBox_Make.SelectedItem -eq "Brother"){
[void] $ListBox_Model.Items.Add('MP301')
}

[void]$Form_Service.ShowDialog()

Upvotes: 0

Views: 1407

Answers (1)

ArcSet
ArcSet

Reputation: 6860

OK so what you are looking for is called events. Events are actions that take place that then allow you to run code after the action. Like when Mouse Clicks on a object or Keyboard button is pressed.

In Powershell when dealing with Winforms you can use

$Control.Add_EventName{
    Code Here
}

Put the events after the controls are already called. I usally put them right before i show a form.

$ListBox_Make.Add_Click{
    $ListBox_Model.Items.Add($ListBox_Make.SelectedItem)
}

[void]$Form_Service.ShowDialog()

in your exact case you could use :

$ListBox_Make.Add_Click{
    if ($ListBox_Make.SelectedItem -eq "Brother"){
        [void] $ListBox_Model.Items.Add('MP301')
    }
}

Hopefully this puts you on the right track.

Also instead of a bunch of if Statements try a Switch instead

$ListBox_Make.Add_Click{
    switch ($ListBox_Make.SelectedItem){
        "Brother"{
            $ListBox_Model.Items.Add('MP301')
        }
        "Canon"{
            $ListBox_Model.Items.Add('LT45')
        }
        "HP"{
            $ListBox_Model.Items.Add('ABC2133')
        }
    }
}

You can find the events for listbox https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.listbox?view=netframework-4.7.2#events

Upvotes: 2

Related Questions