Сфокусировать / выбрать элемент ListView в Powershell
Я получил элемент управления Listview в форме окна, запущенного из PowerShell, который динамически заполняется как журнал активности, и я в основном хочу, чтобы он автоматически прокручивался, чтобы последняя запись всегда была в фокусе.
Я могу заставить это работать с ListBox, просто установив Item для selected, но это не похоже на ListView. Я могу установить для него значение "Выбрано" и "Сосредоточено", но только в том случае, если выбран целевой элемент управления формой, и даже тогда он не вызывает перемещения полосы прокрутки.
Было бы хорошо, если бы я мог просто прокручивать его до конца страницы при каждом обновлении, но предпочел бы сосредоточиться на конкретном элементе, так как я получил две группы, и было бы хорошо, если бы элемент из верхней группы мог быть сосредоточены также.
Вот части кода
$listView1.View = 'Details'
$ListView1.Anchor = 'Top, Bottom, Left, Right'
$ListView1.Location = '0, 399'
$ListView1.Name = "ListView1"
$ListView1.Size = '683, 200'
$ListView1.TabIndex = 10
$listView1.FullRowSelect = $true
$listView1.MultiSelect = $False
$listColumnTime.Text = "Time"
$listColumnTime.Width = 90
$listColumnAction.Text = "Action"
$listColumnAction.Width = 100
$listColumnStatus.Text = "Status"
$listColumnStatus.Width = -2
$ListGroupUpdate.Header = "Updates"
$ListGroupUpdate.Tag = 0
$ListGroupAction.Header = "Actions"
$ListGroupAction.Tag = 1
$listView1.Columns.Add($listColumnTime)|Out-Null
$listView1.Columns.Add($listColumnAction)|Out-Null
$listView1.Columns.Add($listColumnStatus)|Out-Null
$listView1.Groups.Add($ListGroupUpdate)|Out-Null
$listView1.Groups.Add($ListGroupAction)|Out-Null
И функция Добавить
function Add-ListViewItem
{
Param(
[ValidateNotNull()]
[Parameter(Mandatory=$true)]
[System.Windows.Forms.ListView]$ListView,
[Parameter(Mandatory=$true)]
[string[]]$Items,
[Parameter(Mandatory=$true)]
[int]$Group,
[Parameter(Mandatory=$false)]
$timestamp = (get-date -Format "MM/dd HH:mm:ss"),
[switch]$Clear)
if($Clear)
{
$ListView1.Items.Clear();
}
$listitem = New-Object 'System.Windows.Forms.ListViewItem'
$listitem.text = $Timestamp
$listitem.Group = $listview.Groups[$group]
$listitem.SubItems.AddRange($Items)
$listitem.Selected = $true
$ListView.Items.Add($listitem)
$ListView.FocusedItem = $listitem
}
Буду очень признателен за любую помощь! БР Эрик
1 ответ
Я бы сделал это так
#Dll Import
Function ScrollbarImport
{
Add-Type @"
using System;
using System.Runtime.InteropServices;
public static class Scrollbar {
[DllImport("user32.dll")]
public static extern int GetScrollPos(IntPtr hWnd, int nBar);
[DllImport("user32.dll")]
public static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
}
"@
}
Сохраняет расположение полосы прокрутки.
$Script:ScrollbarX = [Scrollbar]::GetScrollPos($SQLProcessesListview.handle, 0)
$Script:ScrollbarY = [Scrollbar]::GetScrollPos($SQLProcessesListview.handle, 1)
Устанавливает сохраненную позицию.
[Scrollbar]::SendMessage($SQLProcessesListview.Handle, 4116 ,(0 - [Int]$Script:ScrollbarX),(0 - [Int]$Script:ScrollbarY))
[Scrollbar]::SendMessage($SQLProcessesListview.Handle, 4116 , [Int]$Script:ScrollbarX,([Int]$Script:ScrollbarY * 17))
Привет Янник