在C#中修改变量名称

时间:2014-05-01 10:23:11

标签: c# variables

我不确定标题是否正确,因为我不确定如何解释它。我遇到过许多情况,能够动态修改变量名称的一部分,这样的后缀整数可以节省我很多时间并保持我的代码更清晰,但我不知道该怎么做。这是我最近遇到的一个例子。

我在3 x 3网格中有9个PictureBox。每个PictureBox都有一个单元格的名称,后跟它的数字,所以cell1,cell2,cell3等等。我想得到每个单元格的背景颜色,并将它们分配给变量,同时将它们转换为字符串......像这样:

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

有没有办法让i变量只将它的数值插入占位符而不是将i附加到变量名?我可以将它包装在某种支架中吗?我尝试过Google,但我发现很难只使用关键字进行搜索。

提前致谢。

3 个答案:

答案 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();