我想找到一个名为“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控件,对吧?
答案 0 :(得分:7)
Find
,第二个属性设置为true,是递归的。 “姓名”对于该父母来说是独一无二的,但您正在搜索许多不同的父母。 “名称”不是全球唯一的。
正如Justin在另一个答案中所建议的,First
或FirstOrDefault
可能比在数组上使用[0]
更好。它可以更好地将您的意图传达给未来的读者。
答案 1 :(得分:3)
Find
方法会找到任何匹配项,因此即使在您的情况下只有一个匹配项,在其他情况下也可能很多。如果你想要更具语义意义的东西,你可以在这里使用LINQ First
吗?
答案 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