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

本文关键字:一个 数组 方法 Find 为什么 返回 | 更新日期: 2023-09-27 18:32:04

我想找到一个名为"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控件,对吧?

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

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

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

Find 方法将找到任何匹配项,因此即使在您的情况下只有一个匹配项,但在其他情况下也可能是多个匹配项。如果您想要一些语义更有意义的内容,则可以在此处使用 LINQ First

MSDN对此非常清楚

此方法

它返回一个控件数组。像这样尝试:

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

或:

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

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

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

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

链接到 MSDN - 控件查找