为什么Find()方法返回一个数组?

时间:2012-04-23 17:21:23

标签: c# winforms

我想找到一个名为“textBoxQH_N”的TextBox,其中“_N”是1..96之间的数字。

所以,我有这个代码:

String sTextBoxToFind = String.Format("textBoxQH{0}", QuarterHour);
TextBox tb = (TextBox)this.Controls.Find(sTextBoxToFind, true);

...但它给了我,“无法将类型'System.Windows.Forms.Control []'转换为'System.Windows.Forms.TextBox'

所以我改变了第二行来抓住第一个返回的val:

TextBox tb = (TextBox)this.Controls.Find(sTextBoxToFind, true)[0];

哪个似乎有效,但是控件的名称属性不应该是其所有者的唯一属性? IOW,Find()应该只返回0..1控件,对吧?

4 个答案:

答案 0 :(得分:7)

Find,第二个属性设置为true,是递归的。 “姓名”对于该父母来说是独一无二的,但您正在搜索许多不同的父母。 “名称”不是全球唯一的。

正如Justin在另一个答案中所建议的,FirstFirstOrDefault可能比在数组上使用[0]更好。它可以更好地将您的意图传达给未来的读者。

答案 1 :(得分:3)

Find方法会找到任何匹配项,因此即使在您的情况下只有一个匹配项,在其他情况下也可能很多。如果你想要更具语义意义的东西,你可以在这里使用LINQ First吗?

The MSDN on this is pretty clear on this method

答案 2 :(得分:1)

它返回一组控件。 试试看:

Control[] tb = this.Controls.Find("textBox1", true); //change the name of the control

或:

TextBox[] tbs = (TextBox[])this.Controls.Find("tb1", true);

如您所见,您必须CAST到正确类型的对象(在您的情况下为TextBoxes数组)。 希望能帮助到你, 再见

答案 3 :(得分:1)

表单API设计观点0和1选择最好作为IEnumerable / collection / array返回,以避免需要空检查。

正如其他答案所指出的,控件名称不一定是全局唯一的,而实际上查找可能会返回多于1个项目。

指向MSDN的链接 - Controls.Find

相关问题