Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Find()方法返回数组?_C#_Winforms - Fatal编程技术网

C# 为什么Find()方法返回数组?

C# 为什么Find()方法返回数组?,c#,winforms,C#,Winforms,我想找到一个名为“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

我想找到一个名为“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属性对其所有者不是唯一的吗?现在,Find()应该只返回0..1个控件,对吗?

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


第二个属性设置为true时,Find是递归的。

Find
“名称”是该父级的唯一名称,但您正在搜索许多不同的父级名称“”不是全局唯一的


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

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

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

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

表单API设计角度0和1选项最好作为IEnumerable/collection/array返回,以避免进行空检查

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


链接到MSDN-

最合乎逻辑的答案似乎是可能的重复;尽管“Name”属性的文档实际上从未要求它是唯一的(有其他唯一标识控件的方法),但我相信父级的唯一性是由VisualStudioIDE强制实现的。
TextBox[] tbs = (TextBox[])this.Controls.Find("tb1", true);