Периодическая ошибка (индекс в ноль) с обнаружением изменения SelectedIndex в Windows Forms - PullRequest
0 голосов
/ 01 мая 2019

Я получаю неустойчивую ошибку при этом методе изменения текстовой метки формы в соответствии с выбранным элементом в окне Listview.

Пример кода, как показано ниже, при изменении записи будет периодически:

Невозможно индексировать в пустой массив.В 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()

Может кто-нибудь указать мне, где я иду неправильнопожалуйста?Или есть лучший способ сделать это

1 Ответ

0 голосов
/ 01 мая 2019

Хорошо, я нашел это

По-видимому, сохранено устаревшее поведение, и исправлением является проверка на нулевое значение:

$VMsListBox_SelectedIndexChanged={
    If($VMsListbox.SelectedItems -ne $Null){
        $SelectedFname.Text = $VMsListBox.SelectedItems.Text
        $SelectedPath.Text = $VMsListBox.SelectedItems.SubItems[1].Text
        Write-Host "Entry changed"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...