基本上,我要做的是将控件添加到相应的List“row”+行,(无论行号是for循环中的当前行),但是,我似乎无法找到通过字符串获取列表引用的方法。我想知道是否有办法做到这一点。
List<PictureBox> row1 = new List<PictureBox>();
List<PictureBox> row2 = new List<PictureBox>();
List<PictureBox> row3 = new List<PictureBox>();
List<PictureBox> row4 = new List<PictureBox>();
List<PictureBox> row5 = new List<PictureBox>();
List<PictureBox> row6 = new List<PictureBox>();
List<PictureBox> row7 = new List<PictureBox>();
private void fillLists()
{
for (int col = 1; col < 7; col++)
{
for (int row = 1; row < 6; row++)
{
string name = "row_"+row+"_col_"+col;
PictureBox picture = (PictureBox)this.Controls[name];
// "row"+row.Add(picture);
}
}
}
编辑1 - 添加了这个,看它是否有效。谢谢大家的帮助!
private void fillLists()
{
for (int col = 1; col < 7; col++)
{
for (int row = 1; row < 6; row++)
{
string name = "row_" + row + "_col_" + col;
if (!rows.ContainsKey(row))
{
rows.Add(row, new List<PictureBox>());
}
rows[row].Add((PictureBox)this.Controls[name]);
}
}
答案 0 :(得分:4)
使用词典来组合所有馆藏:
var dict = new Dictionary<string, List<PictureBox>>
for(int i = 1; i < 8; i++)
{
dict.Add("row"+i, new List<PictureBox>);
}
然后访问它:
dict["row1"].Add(....);
答案 1 :(得分:1)
由于您想知道如何操作,以下是使用反射完成的方法:
class Program
{
List<object> myList1 = new List<object>();
List<object> myList2 = new List<object>();
List<object> myList3 = new List<object>();
List<object> myList4 = new List<object>();
List<object> myList5 = new List<object>();
List<object> myList6 = new List<object>();
static void Main(string[] args)
{
Program p = new Program();
p.Run();
Console.ReadLine();
}
void Run()
{
for (int i = 1; i <= 6; i++)
{
FieldInfo field = this.GetType().GetField("myList" + i, BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
{
List<object> value = field.GetValue(this) as List<object>;
if (value != null)
{
//You can use it here
}
else
{
//Wasn't found
}
}
}
}
}
请注意,这比将列表添加到字典并使用命名索引要慢得多。它确实演示了如何获得该字段,这是一个Console程序,可以复制/粘贴到任何新的控制台项目中。