【问题标题】:How to optimize treeview & datagridview?如何优化树视图和数据网格视图?
【发布时间】:2017-05-25 21:57:23
【问题描述】:

我们有一个用 PowerShell 编写的 Windows 表单。该表单显示三个树视图和一个数据网格视图。每个树视图内部都有大约。 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>

要加载树视图和数据网格视图,我们使用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. 在 datagridview 中滚动速度很慢且滞后。

有什么建议可以加快数据加载和datagridview滚动吗?

【问题讨论】:

    标签: xml winforms powershell datagridview treeview


    【解决方案1】:

    不是直接使用foreach 加载treeview 或datagridview 项目/节点,我注意到如果我首先创建一个项目数组并使用AddRange 将它们全部加载在一起会带来一些性能优势。
    这是一个带有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()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多