Skip to content

Commit 248e23b

Browse files
committed
improved performance of 'ControlCollection.Clear' and 'TreeNodeCollection.AddRange' methods;
1 parent 4e7d649 commit 248e23b

File tree

3 files changed

+39
-23
lines changed

3 files changed

+39
-23
lines changed

System/Windows/Forms/Control.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,8 +1179,14 @@ public virtual void AddRange(Control[] controls)
11791179
}
11801180
public virtual void Clear()
11811181
{
1182-
while (Count != 0)
1183-
RemoveAt(Count - 1);
1182+
var tItems = new List<Control>(items);
1183+
1184+
items.Clear();
1185+
1186+
owner.PerformLayout();
1187+
1188+
for (int i = 0; i < tItems.Count; i++)
1189+
owner.OnControlRemoved(new ControlEventArgs(tItems[i]));
11841190
}
11851191
public bool Contains(Control control)
11861192
{

System/Windows/Forms/TreeNode.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ public class TreeNode
2020
private string text;
2121
private bool visible = true;
2222

23+
public TreeNode() : this(string.Empty, null)
24+
{ }
25+
2326
public TreeNode(string text) : this(text, null)
2427
{
2528
this.text = text;
2629
}
30+
2731
public TreeNode(string text, TreeNode[] children)
2832
{
2933
ImageColor = Color.White;

System/Windows/Forms/TreeNodeCollection.cs

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,20 @@ public virtual TreeNode this[string key]
7474

7575
public virtual int Add(TreeNode node)
7676
{
77-
return AddInternal(node, 0);
77+
if (node == null)
78+
throw new ArgumentNullException("node");
79+
80+
if (node.parent != null) node.Remove();
81+
82+
node.parent = owner;
83+
node.index = items.Count;
84+
85+
items.Add(node);
86+
87+
if (owner.TreeView != null)
88+
node.treeView = owner.TreeView;
89+
90+
return node.index;
7891
}
7992
public virtual TreeNode Add(string text)
8093
{
@@ -98,8 +111,20 @@ public virtual void AddRange(TreeNode[] nodes)
98111

99112
for (int i = 0; i < nodes.Length; i++)
100113
{
101-
AddInternal(nodes[i], i);
114+
var node = nodes[i];
115+
if (node == null)
116+
throw new InvalidOperationException("node is null");
117+
118+
if (node.parent != null) node.Remove();
119+
120+
node.parent = owner;
121+
node.index = items.Count + i;
122+
123+
if (owner.TreeView != null)
124+
node.treeView = owner.TreeView;
102125
}
126+
127+
items.AddRange(nodes);
103128
}
104129
public virtual void Clear()
105130
{
@@ -271,25 +296,6 @@ private static ArrayList FindInternal(string key, bool searchAllChildren, TreeNo
271296
}
272297
return nodes;
273298
}
274-
private int AddInternal(TreeNode node, int delta)
275-
{
276-
if (node == null)
277-
throw new ArgumentNullException("node");
278-
279-
if (node.parent != null) node.Remove();
280-
281-
node.parent = owner;
282-
node.index = items.Count;
283-
284-
items.Add(node);
285-
286-
if (owner.TreeView != null)
287-
{
288-
node.treeView = owner.TreeView;
289-
}
290-
291-
return node.index;
292-
}
293299
private bool IsValidIndex(int index)
294300
{
295301
return index >= 0 && index < Count;

0 commit comments

Comments
 (0)