2011-03-02 106 views
0

我有一個包含名爲pb_a1,pb_a2,pb_a3大量的圖片框的窗體...等等..C#窗體控件

我有一個包含圖片框名稱的String數組。我需要做的是訪問每個這些併爲其指定一個圖像。 而不是硬編碼的,我想知道是否有這給了我命令,如

> Form1.pb_a1.Image=<some Image>; 
> 
> Form1.pb_a2.Image=<some Image>; 
> 
> Form1.pb_a3.Image=<some Image>; 
> 
> Form1.pb_a4.Image=<some Image>; 
+0

我想你會幫助自己大大的未來現在停止和閱讀一些初學者編碼指南和教程。例如,pb_a1等不是特別接受的命名約定。 – MrEdmundo 2011-03-02 09:05:55

+0

@MrEdmundo:我認爲這是一個邏輯問題,而不是編碼風格問題。有許多編碼慣例,它們在某些情況下都是有效的。 – Nick 2011-03-02 09:07:12

+0

@尼克我同意這是一個邏輯問題,這就是爲什麼我沒有把我的評論作爲答案。但我的觀點依然存在。 – MrEdmundo 2011-03-02 09:08:57

回答

2

您可以使用表格Controls屬性上的ControlCollection.Find()方法嗎?

+0

這就是我現在正在做的事情,但不幸的是,我在表單中有太多的控件,並且通過每個控件都在增加時間複雜度以至於無法接受的級別。 – Khemka 2011-03-02 09:12:01

+0

但是Find()方法不允許你搜索子控件嗎? – Nick 2011-03-02 09:29:05

+0

哦,是的...這可能會工作....我現在會嘗試... – Khemka 2011-03-02 09:56:00

0

如果你只有圖片控件的名稱和任何方式,我可以寫一個循環不是對它們的引用(當你在表單的前面創建這些控件時,我認爲你可以保存在帶有名稱和引用的字典中......),我認爲唯一的方法是在Form.Controls集合中進行搜索直到找到具有您正在查找的名稱和圖片框類型的名稱。

+0

你有沒有trid ImageList?對於你的場景,你將不得不循環Form.Controls並比較名字... – sajoshi 2011-03-02 09:06:10

+0

是否有沒有可能創建類似於創建所需語句的宏?由於搜索控件集合是耗時的 – Khemka 2011-03-02 09:13:21

0

您最好將圖片框存儲在圖片框數組中,而不是字符串數組。

PictureBox[] myPictures = {pictureBox1, pictureBox2, pictureBox3, pictureBox4}; 

foreach (PictureBox picture in myPictures) 
{ 
    picture.Image = <some Image>; 
} 

如果把它作爲一個字符串,下面的代碼可以幫助你。請注意,我沒有包含任何錯誤檢查,因爲元素不存在。你可能只是在該部分的數組中獲得一個空元素。您也可以將它包含在try/catch中。

string[] myPicturesString = {"pictureBox1", "pictureBox2", "pictureBox3", "pictureBox4"}; 
      PictureBox[] myPictures = new PictureBox[myPicturesString.Length]; 

      for (int i = 0; i < myPictures.Length; i++) 
      { 
       foreach (Control c in this.Controls) 
       { 
        if (c.Name == myPicturesString[i]) 
        { 
         myPictures[i] = (PictureBox) c; 
        } 
       } 
      } 

      MessageBox.Show(myPictures[1].Name); 
+0

代碼是在這樣的水平,現在我不能將圖片框更改爲數組。我正在使用第二種解決方案。任何其他方式? – Khemka 2011-03-02 09:16:34

0

假設這些圖片框的表單字段,可以反映(的System.Reflection)在窗體類,檢索到的圖片框領域的參考,並將它們存儲到字典中。在表單創建期間(在InitializeComponent之後)執行此操作。

下一次,你必須通過它的名稱來訪問一個圖片框,只需使用:

myDictionary["pictureboxname"].Image = blabla;