如何按名称

时间:2015-05-15 19:35:16

标签: c# forms list rows picturebox

基本上,我要做的是将控件添加到相应的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]);
            }


        }

2 个答案:

答案 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程序,可以复制/粘贴到任何新的控制台项目中。