如何优化树视图和datagridview的?

时间:2017-01-11 07:45:37

标签: xml winforms powershell datagridview treeview

我们有一个用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)
    }
}

现在我们面临两个问题:

  1. 表单打开和加载数据很慢。
  2. 滚动数据网格视图很慢且滞后。
  3. 有没有建议加快数据加载和datagridview滚动?

1 个答案:

答案 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()
    }
}