2016-03-08 5 views
0

У меня есть ListView на форме, встроенной в PowerShell, которую я просто не могу отсортировать.ListView Sort не работает OnClick (PowerShell)

Если я вызываю $ LV.Sort() из командной строки (пока форма не показана), она работает отлично. Однако, если я попытаюсь называть его в событии OnClick ни на чем на форме, это не так. Я ввел флаги, и я знаю, что этот раздел кода запущен, он просто ничего не делает или не помещает никаких ошибок.

Очевидно, что $LV.Sorting = "Ascending" установлен, иначе он не будет сортироваться вообще, и я могу изменить элементы, чтобы ссылка на ListView была в порядке. Также попытался вызвать в случае проблемы с потоками, но не отличается.

Раздражающе это сложный предмет исследования из-за того, что многие люди забывают установить свойство Сортировка.

EDIT: Не уверен, если это необходимо, но форма вызываются с ShowDialog()

Add-Type -AssemblyName System.Windows.Forms 
[System.Windows.Forms.Application]::EnableVisualStyles() 

$form = New-Object System.Windows.Forms.Form 
$LVserverlist = New-Object System.Windows.Forms.ListView 
$form.Controls.Add($LVserverlist) 
    $LVserverlist.Dock = "Fill" 
    $LVserverlist.View = "Details" 
    $LVserverlist.Sorting = "Ascending" 
    $LVserverlist.Add_ColumnClick({ $LVserverlist.sort(); $LVserverlist.Items[0].Text = "Working?" }) 
    $LVserverlist.Columns.Add("Name", 200, "Left") | Out-Null 

0..10 | Foreach-Object { 
    $LVItem = New-Object System.Windows.Forms.ListViewItem 
    $LVItem.Text = (Get-Random -Maximum 1000).ToString() 
    $LVserverlist.Items.Add($LVItem) | Out-Null 
} 

$form.ShowDialog() 
+0

Может быть проблемой обзорной. Пожалуйста, покажите нам свой код –

+0

У меня около тысячи строк кода. Все, что имеет значение, - это то, что ListView находится в Splitter в Splitter внутри формы, который отображается с помощью ShowDialog(). Если я добавлю 'Sort()' в любое событие OnClick, он ничего не делает, но остальная часть кода в событии отлично работает. Не имеет значения, передаю ли ListView в качестве параметра или использую глобальную ссылку, я могу добавить и изменить элементы в нем. –

+0

Приготовьте небольшое приложение, которое воспроизводит ошибку, и опубликуйте это :) (см. Раздел 'MVCE' Справочного центра] (http://stackoverflow.com/help/mcve). –

ответ

1

Никогда не найти решение получать Sort(), чтобы работать, в конечном итоге с этим обходным путем (который является немного более гибким в любом случае):

Param 
(
    [System.Windows.Forms.ListView]$sender, 
    $column 
) 
$temp = $sender.Items | Foreach-Object { $_ } 

$sender.Items.Clear() 
$sender.Items.AddRange(($temp | Sort-Object -Property @{ Expression={ $_.SubItems[$column].Text } })) 

Обратите внимание, что на ListView Sorting свойство должно быть установлено значение None в противном случае элементы будут добавлены обратно в алфавитном порядке.

0

Коллер события

$MyListView.add_ColumnClick({SortListView $this $_.Column}) 

Сортировать функцию йоты запомнить Lastest заказа:

function SortListView { 
    Param(
     [System.Windows.Forms.ListView]$sender, 
     $column 
    ) 
    $temp = $sender.Items | Foreach-Object { $_ } 
    $Script:SortingDescending = !$Script:SortingDescending 
    $sender.Items.Clear() 
    $sender.ShowGroups = $false 
    $sender.Sorting = 'none' 
    $sender.Items.AddRange(($temp | Sort-Object -Descending:$script:SortingDescending -Property @{ Expression={ $_.SubItems[$column].Text } })) 
}