2012-04-23 65 views
3

我想找到一個名爲「textBoxQH_N」的文本框,其中「_N」是1到96之間的數字。爲什麼Find()方法返回一個數組?

所以,我有這樣的代碼:

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]; 

這似乎是工作,但不應該一個控件的名稱屬性是單向to它的主人? IOW,Find()應該只返回0..1個控件,對吧?

+0

可能重複(http://stackoverflow.com/questions/4483912/find-a-control-in-c-sharp- winforms-by-name) – dasblinkenlight 2012-04-23 17:25:01

回答

7

Find,與第二屬性設置爲true,是遞歸的。 「姓名」對該父母來說是唯一的,但您正在通過許多不同的父母進行搜索。 '姓名'不是全球唯一的。

正如賈斯汀在另一個回答中所建議的,FirstFirstOrDefault可能比使用[0]更好。它更好地向未來的讀者傳達你的意圖。

+2

這似乎是最合乎邏輯的答案;儘管「名稱」屬性的文檔實際上並不需要它是唯一的(還有其他唯一標識控件的方法),但我相信父級別的唯一性由Visual Studio IDE強制實施。 – 2012-04-23 17:29:33

3

Find方法會找到任何匹配項,所以即使它只是您的案例中的一個匹配項,在其他情況下也可能有很多匹配項。如果你想要更具語義意義的東西,你可以在這裏使用LINQ First

The MSDN on this is pretty clear on this method

1

它返回一個控件數組。 嘗試這樣的:

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

或:

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

正如你所看到的,你必須轉換爲正確類型的對象(在你的情況下,以文本框的陣列)。 希望它有幫助, 再見

1

表單API設計的角度0和1的選擇最好是返回IEnumerable /收集/數組,以避免需要空檢查。

正如其他答案指出的那樣,控件的名稱不必是全局唯一的,並且查找實際上可能會返回多個項目。

鏈接到MSDN - Controls.Find

的[查找按名稱C#的WinForms控制]
相關問題