2014-05-01 113 views
0

我不確定標題是否正確,因爲我不確定如何解釋它。我遇到過很多場景,能夠動態修改部分變量名稱,例如後綴整數可以爲我節省大量時間,並使代碼更清晰,但我不知道如何去做。這是我最近遇到的一個例子。在C中修改變量名稱#

我有9個PictureBox的3 x 3網格。每個PictureBox都有一個單元格的名稱,後面跟着它的編號,例如cell1,cell2,cell3等等。我想獲得每個單元格的背景顏色,並將它們分配給一個變量,同時將它們轉換爲字符串......類似這樣的內容:

 for (int i = 1; i < 10; i++) 
     { 
      string ci = celli.BackColor.ToString(); 
     } 

有沒有一種方法,我可以讓我的變量只插入它的數字值的佔位符,而不是將我附加到變量名?我可以將它包裹在某種托架中嗎?我試過谷歌這一點,但我發現很難搜索使用關鍵字。

在此先感謝。

+1

使用數組或集合... – rene

+0

C#是強類型語言,到目前爲止,所有強類型語言做的是,他們嚴格限制動態創建變量,一個變量可以是'動態'類型的,但是該名稱在編譯時必須預先定義,否則它將不起作用。 其他腳本和動態語言如JS或Python或PHP支持它,但不支持C#,Java,C++等 –

+0

您可以越靠近使用'HashMap'或'Dictionary'來保存值並輕鬆訪問它們,或者您總是可以使用'數組'。 –

回答

1

你可能正在使用一個可視化的表單編輯器,最好的方法可能是通過代碼(而不是直觀地)生成網格。

另一種解決方案是讓一個矩陣:

PictureBox[,] cell = new PictureBox[,] { 
    { cell1, cell2, cell3 }, 
    { cell4, cell5, cell6 }, 
    { cell7, cell8, cell9 } 
}; 

string[,] c = new string[3, 3]; 

for(int y=0; y<3; y++) 
    for(int x=0; x<3; x++) 
     c[x, y] = cell[x, y].BackColor.ToString(); 

祝您的代碼。

0

您想要生成所有圖片框的列表或集合,以便通過指定它們的索引來訪問它們。一種方法是產生在運行時PictureBoxes:

像這樣:

List<PictureBox> myPics = new List<PictureBox>(); 
int picWidth = 100; 
int picHeight = 100; 
for (x = 0; x <= this.Width; x += picWidth) { 
    for (y = 0; y <= this.Height; y += picHeight) { 
     PictureBox pic = new PictureBox(); 
     pic.Image = pic.Image; 
     // Your image 
     pic.Location = new Point(x, y); 
     this.Controls.Add(pic); 
     myPics.Add(pic); 
    } 
} 

// Do something with myPics... 

另一種方法是,當你有你的窗體上的所有pictureboxes已經,您可以通過所有的控制循環,檢查哪些是picturebox,然後檢查他們的Name屬性來確定他們的索引。然後對他們做一些相應的事情。

foreach (void ctrl_loopVariable in this.Controls) { 
    ctrl = ctrl_loopVariable; 
    if (ctrl.GetType() == typeof(PictureBox)) { 
     if (ctrl.Name == "your picture box name to test") { 
      // Do something here with ctrl 
     } 
    } 
} 

(以上代碼從VB轉換爲C#,藉口轉換問題)

0

你打算這裏是動態地引用這些控件。

爲了實現這一點,有兩個選項:

  • 動態創建這些控件
  • 你創建你的表單設計器創建控件動態引用

第一這一點是由Shreyas Kapur的回答解釋的。 第二個可能是錐形這樣,

readonly Dictionary<Point,PictureBox> _dynamicMappedBoxes = 
     new Dictionary<Point,PictureBox>(); 

// Call this once in the beginning ofr your program 
void createDynamicMapping() 
{ 
    foreach(PictureBox box in Controls.OfType<PictureBox>()) 
    { 
     Point coords = getCoordinatesFromName(box); 
     _dynamicMappedBoxes.Add(coords, box); 
    } 
} 

Point getCoordinatesFromName(PictrueBox box) 
{ 
    int x = int.Parse(box.Name.SubString(IdontKnow); 
    int y = int.Parse(box.Name.SubString(IdontKnow); 
    retrun new Point(x,y); 
} 

//usage 
string colorName = dynamicMappedBoxes[new Point(x,y)].BackColor.ToString();