我们有一个用PowerShell编写的Windows表单。该表单显示三个树视图和一个datagridview。每个树视图里面都是ca. 100-1500个节点和一些子节点。 datagridview包含大约500个项目。
要显示的数据存储在XML文件中。
<Config>
<treeview1>
<ID ID="1" Data="" />
</treeview1>
<treeview2>
<ID ID="1" Data="" />
</treeview2>
<treeview3>
<ID ID="1" Data="" />
</treeview3>
<datagridview>
ID ID="1" Data="" />
</datagridview>
</Config>
要加载treeviews和datagridview,我们使用foreach
循环。
foreach ($XmlNode in $Xml.Config.treeview1.ID)
{
if (!($TreeView.Nodes.ContainsKey($XmlNode.Data)))
{
[System.Windows.Forms.TreeNode]$TreeViewNode = $null
$TreeViewNode = New-Object -TypeName System.Windows.Forms.TreeNode
$TreeViewNode.Text = $XmlNode.Data
$TreeViewNode.Name = $XmlNode.Data
$TreeViewNode.Tag = $XmlNode.ID
$TreeViewNode.ImageIndex = 1
$TreeViewNode.SelectedImageIndex = 1
$TreeView.Nodes.Add($TreeViewNode)
}
}
现在我们面临两个问题:
有没有建议加快数据加载和datagridview滚动?
答案 0 :(得分:0)
如果我首先创建一个项目数组并将它们与foreach
一起加载,而不是直接加载带有AddRange
的treeview或datagridview项目/节点,我注意到了一些permormance的好处。 />
这是一个ListView
的例子:
function Add-ListViewItem
{
[CmdletBinding()]
[OutputType([System.Void])]
param
(
[parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[System.Windows.Forms.ListView]$ListView,
[ValidateNotNullOrEmpty()]
[PSCustomObject]$Items,
[System.Management.Automation.SwitchParameter]$Append
)
begin
{
$ListView.Update()
}
process
{
#Clear listview
if (!$Append)
{
$ListView.Items.Clear()
}
#Create the ListViewItem
[System.Windows.Forms.ListViewItem[]]$ListViewItems = $null
foreach ($Item in $Items)
{
$ListViewItem = New-Object -TypeName System.Windows.Forms.ListViewItem
$ListViewItem.Text = $Item.NoteProperty1
$ListViewItem.SubItems.Add($Item.NoteProperty2)
$ListViewItems += $ListViewItem
}
#Add the items to the listview
if ($ListViewItems -ne $null)
{
$ListView.Items.AddRange($ListViewItems)
}
}
end
{
$ListView.EndUpdate()
}
}