我不确定标题是否正确,因为我不确定如何解释它。我遇到过许多情况,能够动态修改变量名称的一部分,这样的后缀整数可以节省我很多时间并保持我的代码更清晰,但我不知道该怎么做。这是我最近遇到的一个例子。
我在3 x 3网格中有9个PictureBox。每个PictureBox都有一个单元格的名称,后跟它的数字,所以cell1,cell2,cell3等等。我想得到每个单元格的背景颜色,并将它们分配给变量,同时将它们转换为字符串......像这样:
for (int i = 1; i < 10; i++)
{
string ci = celli.BackColor.ToString();
}
有没有办法让i变量只将它的数值插入占位符而不是将i附加到变量名?我可以将它包装在某种支架中吗?我尝试过Google,但我发现很难只使用关键字进行搜索。
提前致谢。
答案 0 :(得分: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();
祝你的代码好运。
答案 1 :(得分: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...
另一种方法是,当你已经拥有表单上的所有图片框时,你可以遍历所有控件,检查哪些是图片框,然后检查他们的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#,原因是转换问题)
答案 2 :(得分:0)
您打算动态引用这些控件。
为了实现这一目标,有两种选择:
第一点解释了Shyas 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();