【问题标题】:C# create 3x3 2d map with labelsC# 创建带有标签的 3x3 2d 地图
【发布时间】:2010-01-23 17:59:14
【问题描述】:

有没有一种方法可以创建 3 行和 3 个带有标签(或类似)的列,以创建带有数据的 2d“地图”,以便以简单的方式进行操作?

只放置 9 个标签很容易,但我希望每个标签都可以使用相同的数组进行访问。

表格中的样子:

标签1 标签2 标签3
标签4 标签5 标签6
标签7 标签8 标签9

如果我需要更改 label5 的属性,我想像这样访问它:
labelarray[1][1].Text = "测试"; (labelarray[row][column].Property)

我该怎么做?

或者这可以通过其他方式实现吗?

【问题讨论】:

    标签: c# multidimensional-array


    【解决方案1】:
    class Data
    {
        private string text;
        public string Text
        {
            get { return text; }
            set { text = value; }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Data[,] map = new Data[3, 3];
            map[1, 1] = new Data();
            map[1, 1].Text = "Test";
        }
    }
    

    编辑:修复错误。

    【讨论】:

      【解决方案2】:
       private void button1_Click(object sender, EventArgs e)
          {
              string[] nine_labels = { "a", "b", "c", "d", "e", "f", "g", "h", "i" };
      
              var labelarray= new Label[3,3];
      
              // putting labels into matrix form
      
              int c = 0;
      
              for (int i = 0; i < 3; i++)
              {
                  for (int j = 0; j < 3; j++)
                  {
                      var lbl = new Label();
      
                      lbl.Text = nine_labels[c];
      
                      lbl.Top = i * 100;
                      lbl.Left = j * 100;
      
                      labelarray[i, j] = lbl; 
      
                      c++;
                  }
              }
      
              // adding labels to form
              foreach (var item in labelarray)
              {
                  this.Controls.Add(item);
              }
      
              // test
      
              labelarray[1, 1].Text = "test";
          }
      

      注意:您需要添加一个按钮并在该按钮的Click 上调用此函数。

      【讨论】:

        【解决方案3】:

        tehMick 的回答实际上导致了 .NET 2.0 中的运行时异常,但除此之外,示例直截了当。

        二维数组的类型必须有一个公共可访问的属性,所以你可以直接访问它:

        public class DTO
        {
            private String myStrProperty;
            public String MyStrProperty
            {
                get {return myStrProperty; }
                set { myStrProperty = value; }
            }
        
            public DTO(string myStrProperty)
            {
                this.myStrProperty = myStrProperty;
            }
        }
        
        class Program
        {
            private static Logger logger;
            static void Main(string[] args)
            {
                DTO[,] matrix = 
                {
                    {new DTO("label1"), new DTO("label2")},
                    {new DTO("label3"), new DTO("label4")}
                };
        
                matrix[0, 1].MyStrProperty = "otherValue";
            }
        }
        

        【讨论】:

          【解决方案4】:

          这是一个特定于 winform 的示例。希望它能更好地回答这个问题:

              const int spacing = 50;
              Label[][] map = new Label[3][];
              for (int x = 0; x < 3; x++)
              {
                  map[x] = new Label[3];
                  for (int y = 0; y < 3; y++)
                  {
                      map[x][y] = new Label();
                      map[x][y].AutoSize = true;
                      map[x][y].Location = new System.Drawing.Point(x * spacing, y * spacing);
                      map[x][y].Name = "map" + x.ToString() + "," + y.ToString();
                      map[x][y].Size = new System.Drawing.Size(spacing, spacing);
                      map[x][y].TabIndex = 0;
                      map[x][y].Text = x.ToString() + y.ToString();
                  }
                  this.Controls.AddRange(map[x]);
              }
              map[1][1].Text = "Test";
          

          【讨论】:

          • 在带有 .NET 4.0 的 Visual Studio 2010 中完美运行。我如何使这个公众可以访问,以便我可以使用 map[XPOS][YPOS].Text = "Test";我的代码中的任何地方?
          • 只需在适当的范围内定义地图。最好让它成为包含标签的表单的成员。您也可以将其设为公开,以便外部访问。
          • Brilliant Piece of code, +1 如果我要使用它在地图上导航某些东西,使用左、右等按钮。我会使用 if Left 之类的东西来编码按下后,X 的当前位置变为 -1 但我的问题是我找不到一种方法来声明我目前在地图上的位置,你知道我该怎么做吗?任何帮助表示赞赏,谢谢!
          • 更新:没关系,我现在已经想通了,不过感谢您提供的代码,对我正在尝试做的事情有很大帮助!
          猜你喜欢
          • 2018-01-14
          • 2018-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-29
          相关资源
          最近更新 更多