0

I'm getting an intermittent error with this method of changing a forms text label according to the selected item in a Listview box.

Example code as below, changing the entry will intermittently give:

Cannot index into a null array. At C:\temp\test.ps1:62 char:5 + $SelectedPath.Text = $VMsListBox.SelectedItems.SubItems[1].Text

# Import namespaces
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing


$form = New-Object System.Windows.Forms.Form
$form.Text = 'Demo'
$form.Size = '580,545'
$form.StartPosition = 'CenterScreen'
$form.FormBorderStyle = 'FixedSingle'
$form.MaximizeBox = $false

# Listview box to display found open files
$VMsListBox = New-Object System.Windows.Forms.ListView
$VMsListBox.View = [System.Windows.Forms.View]::Details
$VMsListBox.Location = '15,120'
$VMsListBox.size = '435,10'
$VMsListBox.Height = 250
$VMsListBox.Columns.Add('Name') | Out-Null
$VMsListBox.Columns.Add('Path') | Out-Null
$VMsListBox.FullRowSelect = $true
$VMsListBox.MultiSelect = $false

# Selected file label
$SelectedFnameLbl = New-Object System.Windows.Forms.Label
$SelectedFnameLbl.Location = '10,25'
$SelectedFnameLbl.Size = '80,19'
$SelectedFnameLbl.Text = 'File Name:'
# Selected file name
$SelectedFname = New-Object System.Windows.Forms.Label
$SelectedFname.Location = '100,25'
$SelectedFname.Size = '300,19'
$SelectedFname.Text = 'n/a'
$SelectedFname.AutoEllipsis = $true
# Path Label
$SelectedFileLbl = New-Object System.Windows.Forms.Label
$SelectedFileLbl.Location = '10,45'
$SelectedFileLbl.Size = '80,19'
$SelectedFileLbl.Text = 'File Path:'
# Selected filepath
$SelectedPath = New-Object System.Windows.Forms.Label
$SelectedPath.Location = '100,45'
$SelectedPath.Size = '300,19'
$SelectedPath.Text = 'n/a'
$SelectedPath.AutoEllipsis = $true

$form.Controls.AddRange(@($VMsListBox,$SelectedFileLbl,$SelectedPath,$SelectedFnameLbl,$SelectedFname))

# Populate ListView

$Files = Get-ChildItem -Path 'c:\temp' -File
$Files | ForEach-Object {
    $Entry = New-Object System.Windows.Forms.ListViewItem($_.Name) -ErrorAction Stop
    $Entry.SubItems.Add($_.FullName) | Out-Null
    $VMsListBox.Items.Add($Entry) | Out-Null
}


$VMsListBox_SelectedIndexChanged={
    $SelectedFname.Text = $VMsListBox.SelectedItems.Text
    $SelectedPath.Text = $VMsListBox.SelectedItems.SubItems[1].Text
    Write-Host "Entry changed"
}
$VMsListBox.Add_SelectedIndexChanged($VMsListBox_SelectedIndexChanged)



# Show form
$form.ShowDialog() | Out-Null
$form.Dispose()

Can anyone point me where I'm going wrong please? Or is there a better way of doing this

Scepticalist
  • 3,737
  • 1
  • 13
  • 30

1 Answers1

0

Ok, I found this

Apparently retained legacy behaviour and the fix is to check for null:

$VMsListBox_SelectedIndexChanged={
    If($VMsListbox.SelectedItems -ne $Null){
        $SelectedFname.Text = $VMsListBox.SelectedItems.Text
        $SelectedPath.Text = $VMsListBox.SelectedItems.SubItems[1].Text
        Write-Host "Entry changed"
    }
}
Scepticalist
  • 3,737
  • 1
  • 13
  • 30