2016-11-29 78 views
-1

我想知道,是否可以通過編號訪問pictureBox。我之前問過類似的問題,並給了一個很好的答案,但它是關於textBoxes的,它似乎不適用於pictureBoxes。以下是它如何與textBoxes一起使用:按照編號/索引訪問pictureBox

this.Controls["textBox" + i.ToString()].Text = allProducts; 

我可以在某些相似的問題中訪問pictureBox [i]嗎?謝謝。

編輯:有人誰建議文本框的職位,我已經提到,相同的方式不適用於pictureBox。

+0

可能重複的[如何解決在窗體中的文本框的數量?](http://stackoverflow.com/questions/40733855)/how-can-i-address-textboxes-in-windows-forms-by-their-number) –

回答

1

您未按其編號訪問文本框。你正在通過他們的名字訪問他們,這恰好包括一個數字。如果其名稱在最後包含數字,則可以對任何UI控件執行相同操作,包括PictureBox控件。

您已經有工作代碼。只需更改名稱。

例如

this.Controls["textBox" + i.ToString()].Text = allProducts; 

也可能是

this.Controls["pictureBox" + i.ToString()].Text = allProducts; 

甚至

this.Controls["MyKeshaThemedCustomControl" + i.ToString()].Text = allProducts; 

您的代碼不是類型特異性。只要它繼承自Windows.Forms.Controls.Control,它就可以與任何控件一起使用。他們都有一個Text屬性,所以你的代碼甚至是類型安全的!在這裏限制你的唯一的事情就是你的命名習慣,以及你遵守它的能力。

如果您需要訪問一些屬性,特定於一個PictureBox(如圖像),你可以做這樣的事情:

var p = this.Controls["pictureBox" + i.ToString()].Text as PictureBox; 
if (p == null) throw new IndexOutOfRangeException("Late binding is a B*!"); 
p.Image = GetImage(); 

如果你敢肯定你永遠不會得到i錯誤(或者,如果你不關心凌亂除外)可以縮短到

((PictureBox)this.Controls["pictureBox" + i.ToString()]).Image = GetImage(); 
+0

代碼行看起來像什麼? – Gytis39

+0

這可能是,但我正在尋找的屬性是.image,而不是.text,並且.image是pictureBox特定的。由於我認爲該程序僅僅意識到我在編譯期間實際上是指pictureBox,所以在Visual Studio說它是錯誤之前,因爲this.Controls沒有屬性.image。 – Gytis39

+0

你爲什麼不這麼說?回答編輯。 –

0

下面的代碼會做你想要什麼類型安全方式

var myPicBox = this.Controls.OfType<PictureBox>().FirstOrDefault(e => e.Name == "pictureBox" + i.ToString()); 

它將遍歷所有控件並過濾掉圖片框,然後找到以索引結尾的圖片。如果失敗,您將得到一個空值。您可以修改代碼以與許多其他類型的控件一起使用。例如,如果你正在尋找文本框,它將..

var myTextBox = this.Controls.OfType<TextBox>().FirstOrDefault(e => e.Name == "textBox" + i.ToString()); 
+0

所以在這種情況下,我可以將myPicBox作爲pictureBox類對象?如果是這樣,那正是我正在尋找的東西,在接受答案之前會試一試,以確保。 – Gytis39

+0

是的,你得到的是你指定的類的強類型對象,在這個例子中是PictureBox。 Visual Studio甚至會在myPicBox上爲您提供智能代碼完成 –