3

我想找到一个名为“textBoxQH_N”的文本框,其中“_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];

这似乎可行,但控件的 Name 属性不应该对其所有者是唯一的吗?IOW,Find() 应该只返回 0..1 个控件,对吧?

4

4 回答 4

7

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

正如贾斯汀在另一个答案中所建议的那样,First或者FirstOrDefault可能比[0]在阵列上使用更好。它可以更好地将您的意图传达给未来的读者。

于 2012-04-23T17:24:40.437 回答
3

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

关于这个的MSDN对这个方法很清楚

于 2012-04-23T17:24:32.060 回答
1

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

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

或者:

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

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

于 2012-04-23T17:24:48.927 回答
1

表单 API 设计观点 0 和 1 选项最好以 IEnumerable/collection/array 的形式返回,以避免需要进行空值检查。

正如其他答案所指出的,控件名称不必是全局唯一的,并且 Find 实际上可能返回超过 1 个项目。

链接到 MSDN - Controls.Find

于 2012-04-23T17:27:45.477 回答