Form Combobox1 Changing Text in Combobox2

I have created a form that gets data from a JSON config file. The first combobox gets a list of departments as listed in the JSON file. Based on what is selected from combobox1, combobox2 should list the titles associated with the selected department. I have the basics created and can get this to work, however, it is not user friendly.

The only thing I want my IT users updating is the JSON file. They should not have to update the Powershell. What I am having an issue figuring out is how to tell Powershell what department is selected and what titles to get out of the JSON file based on that.

Here is what I got so far.

Powershell

.NOTES
===========================================================================
Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.180
Created on: 8/19/2020 10:29 AM
Created by: Joseph
Organization: Company
Filename: AddADUser.ps1
===========================================================================
.DESCRIPTION
Form will allow the creation of standard AD user accounts
#>

< #
Definitions
Prefixes
~ $l_ = Label
~ $tb_ = Textbox
~ $lb_ = Listbox
~ $cb_ = Combobox
~ $ch_ = Checkbox
~ $rb_ = Radio Selection
~ $btn_ = Button
#>

#region Load Modules
Import-Module ActiveDirectory
#endregion

#region Get Config File
$configfile = Get-Content -Raw -Path .\ADCEU_Departments.json | ConvertFrom-Json
#endregion

#region Functions
function AddADUser {
    $fname = $tb_fname.Text
    $lname = $tb_lname.Text
    $puid = $tb_puid.Text
    $dept = $cb_department.SelectedItem
    if ($ch_temp.Checked -eq $true) {
        $etype = 'Temp Employee'
    }
    else {
        $etype = 'Perm Employee'
    }
    [System.Windows.Forms.MessageBox]::Show("$fname $lname - $puid - $dept - $etype")
}
#endregion

#region Get AD Info
$domain = Get-ADDomainController
$dname = $domain.Domain
$dcname = $domain.Name
#endregion

#region Form Build

#region Load Form Assemblies
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void][System.Windows.Forms.Application]::EnableVisualStyles()
#endregion

#region Form Controls

#region First Name
$l_fname = New-Object System.Windows.Forms.Label
$l_fname.Location = New-Object System.Drawing.Point(10, 20)
$l_fname.Size = New-Object System.Drawing.Size(160, 20)
$l_fname.Text = 'End User First Name'

$tb_fname = New-Object System.Windows.Forms.TextBox
$tb_fname.Location = New-Object System.Drawing.Point(10, 40)
$tb_fname.Size = New-Object System.Drawing.Size(160, 20)
#endregion

#region Last Name
$l_lname = New-Object System.Windows.Forms.Label
$l_lname.Location = New-Object System.Drawing.Point(180, 20)
$l_lname.Size = New-Object System.Drawing.Size(160, 20)
$l_lname.Text = 'End User Last Name'

$tb_lname = New-Object System.Windows.Forms.TextBox
$tb_lname.Location = New-Object System.Drawing.Point(180, 40)
$tb_lname.Size = New-Object System.Drawing.Size(160, 20)
#endregion

#region PUID
$l_puid = New-Object System.Windows.Forms.Label
$l_puid.Location = New-Object System.Drawing.Point(350, 20)
$l_puid.Size = New-Object System.Drawing.Size(160, 20)
$l_puid.Text = 'PUID'

$tb_puid = New-Object System.Windows.Forms.TextBox
$tb_puid.Location = New-Object System.Drawing.Point(350, 40)
$tb_puid.Size = New-Object System.Drawing.Size(160, 20)
#endregion

#region Department
$l_department = New-Object System.Windows.Forms.Label
$l_department.Location = New-Object System.Drawing.Point(10, 70)
$l_department.Size = New-Object System.Drawing.Size(160, 20)
$l_department.Text = 'Department'

$cb_department = New-Object System.Windows.Forms.ComboBox
$cb_department.Location = New-Object System.Drawing.Point(10, 90)
$cb_department.Size = New-Object System.Drawing.Size(160, 20)

foreach ($dept in $configfile) {
    $deptname = $dept.Department
    [void]$cb_department.Items.Add($deptname)
}
#endregion

#region Title
$l_title = New-Object System.Windows.Forms.Label
$l_title.Location = New-Object System.Drawing.Point(180, 70)
$l_title.Size = New-Object System.Drawing.Size(160, 20)
$l_title.Text = 'Title'

$cb_title = New-Object System.Windows.Forms.ComboBox
$cb_title.Location = New-Object System.Drawing.Point(180, 90)
$cb_title.Size = New-Object System.Drawing.Size(160, 20)

foreach ($dept in $configfile) {
    if ($dept.Department -eq 'Information Technology') {
        $titles = $dept.Groups.Titles | Sort-Object Title
    }
}

$cb_department_change = {
    $cb_title.Items.Clear()
    $cb_title.Text = $null
    switch ($cb_department.Text) {
        "Information Technology" {
            $titles.Title | foreach { $cb_title.Items.Add($_) }
        }
    }
}
$cb_department.add_SelectedIndexChanged($cb_department_change)
#endregion

#region Temp Employee
$ch_temp = new-object System.Windows.Forms.checkbox
$ch_temp.Location = new-object System.Drawing.Point(180, 90)
$ch_temp.Text = "Temp Employee"
$ch_temp.Checked = $false
#endregion

#region Create User Button
$btn_createuser = new-object System.Windows.Forms.Button
$btn_createuser.Location = new-object System.Drawing.Size(350, 80)
$btn_createuser.Size = new-object System.Drawing.Size(100, 40)
$btn_createuser.Text = "Create User"
$btn_createuser.Add_Click( { AddADUser })
#endregion

#region Cancel Button
$btn_cancel = new-object System.Windows.Forms.Button
$btn_cancel.Location = new-object System.Drawing.Size(460, 80)
$btn_cancel.Size = new-object System.Drawing.Size(100, 40)
$btn_cancel.Text = "Cancel"
$btn_cancel.Add_Click( { $form.Close })
#endregion

#endregion

#region Form GUI Build
$form = New-Object system.Windows.Forms.Form
$form.Size = New-Object System.Drawing.Size(650, 200)
$form.StartPosition = 'CenterScreen'
$form.Text = "Active Directory: Create End User | Connected to $dcname in $dname"
$form.Icon = 'File:\300x300_Ik4_icon.ico'
$form.TopMost = $true

$form.Controls.Add($l_fname)
$form.Controls.Add($tb_fname)
$form.Controls.Add($l_lname)
$form.Controls.Add($tb_lname)
$form.Controls.Add($l_puid)
$form.Controls.Add($tb_puid)
$form.Controls.Add($l_department)
$form.Controls.Add($cb_department)
$form.Controls.Add($l_title)
$form.Controls.Add($cb_title)
# $form.Controls.Add($ch_temp)
$form.Controls.Add($btn_createuser)
$form.Controls.Add($btn_cancel)
$form.Add_Shown( { $tb_fname.Select() })
$form.ShowDialog()
#endregion

#endregion

JSON

[
    {
        "Department": "Information Technology",
        "Groups": [
            {
                "Group": "GG_Infrastructure",
                "Titles": [
                    {
                        "Title": "Director of IT"
                    },
                    {
                        "Title": "Senior Systems Administrator"
                    },
                    {
                        "Title": "Systems Adminitrator"
                    },
                    {
                        "Title": "Desktop Support Technician"
                    },
                    {
                        "Title": "Systems Analyst I"
                    },
                    {
                        "Title": "Systems Analyst II"
                    }
                ]
            },
            {
                "Group": "GG_Solutions",
                "Titles": [
                    {
                        "Title": "VP Systems Development"
                    },
                    {
                        "Title": "Senior Systems Developer"
                    },
                    {
                        "Title": "Healthcare EDI Analyst"
                    },
                    {
                        "Title": "Data Scientist"
                    }
                ]
            }
        ]
    },
    {
        "Department": "Billing",
        "Groups": [
            {
                "Group": "GG_Billing",
                "Titles": [
                    {
                        "Title": "Processor"
                    }
                ]
            }
        ]
    },
    {
        "Department": "Shipping",
        "Groups": [
            {
                "Group": "GG_Shipping",
                "Titles": [
                    {
                        "Title": "Shipping Manager"
                    },
                    {
                        "Title": "Associate"
                    }
                ]
            }
        ]
    }
]

Use the selecteditem property in the where clause to search based on what is selected:

$configFile = @"
[
   {
      "Department":"Information Technology",
      "Groups":[
         {
            "Group":"GG_Infrastructure",
            "Titles":[
               {
                  "Title":"Director of IT"
               },
               {
                  "Title":"Senior Systems Administrator"
               },
               {
                  "Title":"Systems Adminitrator"
               },
               {
                  "Title":"Desktop Support Technician"
               },
               {
                  "Title":"Systems Analyst I"
               },
               {
                  "Title":"Systems Analyst II"
               }
            ]
         },
         {
            "Group":"GG_Solutions",
            "Titles":[
               {
                  "Title":"VP Systems Development"
               },
               {
                  "Title":"Senior Systems Developer"
               },
               {
                  "Title":"Healthcare EDI Analyst"
               },
               {
                  "Title":"Data Scientist"
               }
            ]
         }
      ]
   },
   {
      "Department":"Billing",
      "Groups":[
         {
            "Group":"GG_Billing",
            "Titles":[
               {
                  "Title":"Processor"
               }
            ]
         }
      ]
   },
   {
      "Department":"Shipping",
      "Groups":[
         {
            "Group":"GG_Shipping",
            "Titles":[
               {
                  "Title":"Shipping Manager"
               },
               {
                  "Title":"Associate"
               }
            ]
         }
      ]
   }
]
"@ | ConvertFrom-Json

$selectedDept = ‘Shipping’ #$cb_department.SelectedItem

foreach ($dept in $configfile | Where{$_.Department -eq $selectedDept}) {
    $dept.Groups.Titles | Sort-Object Title
}

I have that working. What I am wanting to avoid is hard coding the departments within the Powershell script.

Scratch my last reply. I thought what I was looking at was the same thing, just coded differently. I see the difference now, but cannot get it to work. Can you go into a little more detail on the PowerShell portion?

 

Never mind, I figured it out. I replace the following lines 124-139 with:

$cb_department_change = { $selectedDept = $cb_department.SelectedItem foreach ($dept in $configfile | Where{ $_.Department -eq $selectedDept }) { $titles = $dept.Groups.Titles | Sort-Object Title } $cb_title.Items.Clear() $cb_title.Text = $null $titles.Title | foreach { $cb_title.Items.Add($_) } } $cb_department.add_SelectedIndexChanged($cb_department_change)

Take a look at this:

<#
.NOTES
===========================================================================
Created with: SAPIEN Technologies, Inc., PowerShell Studio 2020 v5.7.180
Created on: 8/19/2020 10:29 AM
Created by: Joseph
Organization: Company
Filename: AddADUser.ps1
===========================================================================
.DESCRIPTION
Form will allow the creation of standard AD user accounts
#>

<#
Definitions
Prefixes
~ $l_ = Label
~ $tb_ = Textbox
~ $lb_ = Listbox
~ $cb_ = Combobox
~ $ch_ = Checkbox
~ $rb_ = Radio Selection
~ $btn_ = Button
#>

#region Load Modules
#Import-Module ActiveDirectory
#endregion

#region Get Config File
$configfile = Get-Content -Raw -Path C:\Scripts\temp.json | ConvertFrom-Json
#endregion

#region Functions
function AddADUser {
    $fname = $tb_fname.Text
    $lname = $tb_lname.Text
    $puid = $tb_puid.Text
    $dept = $cb_department.SelectedItem
    if ($ch_temp.Checked -eq $true) {
        $etype = 'Temp Employee'
    }
    else {
        $etype = 'Perm Employee'
    }
    [System.Windows.Forms.MessageBox]::Show("$fname $lname - $puid - $dept - $etype")
}
#endregion

#region Get AD Info
#$domain = Get-ADDomainController
#$dname = $domain.Domain
#$dcname = $domain.Name
$dname = 'company.com'
$dcname = 'DC1'
#endregion

#region Form Build

#region Load Form Assemblies
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void][System.Windows.Forms.Application]::EnableVisualStyles()
#endregion

#region Form Controls

function Update-Title ($dept){
    $cb_title.Items.Clear()
 
    foreach ($title in (($configfile | Where{$_.Department -eq $dept}).Groups.Titles.Title | Sort-Object)) {
        $cb_title.Items.Add($title)
    }

    $cb_Title.SelectedIndex = 0
}

#region First Name
$l_fname = New-Object System.Windows.Forms.Label
$l_fname.Location = New-Object System.Drawing.Point(10, 20)
$l_fname.Size = New-Object System.Drawing.Size(160, 20)
$l_fname.Text = 'End User First Name'

$tb_fname = New-Object System.Windows.Forms.TextBox
$tb_fname.Location = New-Object System.Drawing.Point(10, 40)
$tb_fname.Size = New-Object System.Drawing.Size(160, 20)
#endregion

#region Last Name
$l_lname = New-Object System.Windows.Forms.Label
$l_lname.Location = New-Object System.Drawing.Point(180, 20)
$l_lname.Size = New-Object System.Drawing.Size(160, 20)
$l_lname.Text = 'End User Last Name'

$tb_lname = New-Object System.Windows.Forms.TextBox
$tb_lname.Location = New-Object System.Drawing.Point(180, 40)
$tb_lname.Size = New-Object System.Drawing.Size(160, 20)
#endregion

#region PUID
$l_puid = New-Object System.Windows.Forms.Label
$l_puid.Location = New-Object System.Drawing.Point(350, 20)
$l_puid.Size = New-Object System.Drawing.Size(160, 20)
$l_puid.Text = 'PUID'

$tb_puid = New-Object System.Windows.Forms.TextBox
$tb_puid.Location = New-Object System.Drawing.Point(350, 40)
$tb_puid.Size = New-Object System.Drawing.Size(160, 20)
#endregion

#region Department
$l_department = New-Object System.Windows.Forms.Label
$l_department.Location = New-Object System.Drawing.Point(10, 70)
$l_department.Size = New-Object System.Drawing.Size(160, 20)
$l_department.Text = 'Department'

$cb_department = New-Object System.Windows.Forms.ComboBox
$cb_department.Location = New-Object System.Drawing.Point(10, 90)
$cb_department.Size = New-Object System.Drawing.Size(160, 20)

foreach ($dept in $configfile) {
    $deptname = $dept.Department
    [void]$cb_department.Items.Add($deptname)
}

$cb_department.SelectedIndex = 0

#endregion

#region Title
$l_title = New-Object System.Windows.Forms.Label
$l_title.Location = New-Object System.Drawing.Point(180, 70)
$l_title.Size = New-Object System.Drawing.Size(160, 20)
$l_title.Text = 'Title'

$cb_title = New-Object System.Windows.Forms.ComboBox
$cb_title.Location = New-Object System.Drawing.Point(180, 90)
$cb_title.Size = New-Object System.Drawing.Size(160, 20)

#Set initial titles
Update-Title -Dept $cb_department.SelectedItem

$cb_department_change = {
    Update-Title -Dept $cb_department.SelectedItem
}
#Reset title on dept change
$cb_department.add_SelectedIndexChanged($cb_department_change)

#endregion

#region Temp Employee
$ch_temp = new-object System.Windows.Forms.checkbox
$ch_temp.Location = new-object System.Drawing.Point(180, 90)
$ch_temp.Text = "Temp Employee"
$ch_temp.Checked = $false
#endregion

#region Create User Button
$btn_createuser = new-object System.Windows.Forms.Button
$btn_createuser.Location = new-object System.Drawing.Size(350, 80)
$btn_createuser.Size = new-object System.Drawing.Size(100, 40)
$btn_createuser.Text = "Create User"
$btn_createuser.Add_Click( { AddADUser })
#endregion

#region Cancel Button
$btn_cancel = new-object System.Windows.Forms.Button
$btn_cancel.Location = new-object System.Drawing.Size(460, 80)
$btn_cancel.Size = new-object System.Drawing.Size(100, 40)
$btn_cancel.Text = "Cancel"
$btn_cancel.Add_Click( { $form.Close })
#endregion

#endregion

#region Form GUI Build
$form = New-Object system.Windows.Forms.Form
$form.Size = New-Object System.Drawing.Size(650, 200)
$form.StartPosition = 'CenterScreen'
$form.Text = "Active Directory: Create End User | Connected to $dcname in $dname"
#$form.Icon = 'File:\300x300_Ik4_icon.ico'
$form.TopMost = $true

$form.Controls.Add($l_fname)
$form.Controls.Add($tb_fname)
$form.Controls.Add($l_lname)
$form.Controls.Add($tb_lname)
$form.Controls.Add($l_puid)
$form.Controls.Add($tb_puid)
$form.Controls.Add($l_department)
$form.Controls.Add($cb_department)
$form.Controls.Add($l_title)
$form.Controls.Add($cb_title)
# $form.Controls.Add($ch_temp)
$form.Controls.Add($btn_createuser)
$form.Controls.Add($btn_cancel)
$form.Add_Shown( { $tb_fname.Select() })
$form.ShowDialog()
#endregion

#endregion