如果我们看一下下面的代码,会发生什么
var uc1 = new UserControl();
var uc2 = new UserControl();
//We have to set the name, because one is not assigned automatically via code, only when added via Designer
uc1.Name = "notUnique";
uc2.Name = "notUnique";
//We add unique text values so that we can distinguish them uniquely for the purpose of this test
uc1.Text = "uc1";
uc2.Text = "uc2";
panel1.Controls.Add(uc1);
panel1.Controls.Add(uc2);
var control = panel1.Controls["notUnique"];
结果control
就是uc1
。但是如果我们交换添加的控件,让我们uc2
先添加到集合中
panel1.Controls.Add(uc2);
panel1.Controls.Add(uc1);
var control = panel1.Controls["notUnique"];
那么在这种情况下control
=uc2
因此很明显,索引返回它找到的第一个匹配项(如果不匹配,则返回 null)。
有趣的是,这意味着如果您还使用键删除控件,它将删除从集合中找到的第一个控件。
panel1.Controls.RemoveByKey("notUnique");
您假设控件的名称必须是唯一的。但实际上并非如此,并且在 Control 的文档中,Name 属性并未说明必须是唯一的。
现在有人可能会争辩说,正如在文档中使用术语“密钥”一样,这是一个错误,但这是与微软讨论的事情!我怀疑他们会说它按设计工作。(如果他们更改它,我会看到很多损坏的代码!)
同样有趣的是,如果您查看方法ControlCollection.Find
public System.Windows.Forms.Control[] Find (string key, bool searchAllChildren);
然后你会看到这将返回一个数组。