2017-01-11 77 views
1

我們有一個用PowerShell編寫的Windows窗體。該表單顯示三個treeview和一個datagridview。每個樹視圖內都是ca. 100-1500個節點和一些孩子節點。 datagridview包含約500個項目。如何優化treeview和datagridview?

要顯示的數據存儲在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> 

要加載的樹視圖,並在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. 在datagridview中滾動很慢並且滯後。

有沒有建議加快數據加載和datagridview滾動?

回答

0

而不是直接加載樹視圖或datagridview的項目/與foreach節點,我注意到一些permormance的好處,如果我創建第一個項目的所有的數組,並與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() 
    } 
}