【问题标题】:Button Array - which one is pressed? c#Button Array - 按下了哪一个? C#
【发布时间】:2013-11-04 09:57:57
【问题描述】:

我尝试动态创建一个按钮数组,但我不知道如何让函数知道实际按下了哪个按钮。我尝试过这种方式,但似乎没有成功。有什么想法吗?

    public void game_setup(int columns, int rows, int mines)
    {
        //game_destroy();

        //Set Window Size
        this.Height = 50 + Options.y_ini + rows * (Options.size + Options.space);
        this.Width = 20 + 2 * Options.x_ini + columns * (Options.size + Options.space);

        //Setup the playing field
        Button[,] field = new Button[columns,rows];

        for (int i = 0; i < columns; i++)
        {
            for (int j = 0; j < rows; j++)
            {
                field[i, j] = new Button();

                //Button Size
                field[i, j].Width  = Options.size;
                field[i, j].Height = Options.size;

                //Button Position
                int x = Options.x_ini + i * (Options.size + Options.space);
                int y = Options.y_ini + j * (Options.size + Options.space);
                field[i, j].Location = new Point(x, y);                   

                //Event Handler
                int send_i = i;
                int send_j = j;
                field[i, j].Click += (sender, args) =>
                {
                    field_Click(send_i, send_j);
                };

                //Add the Button to the GameBoard
                Controls.Add(field[i, j]);

            }
        }

        //Distribute the Mines
        //...
    }

    public void field_Click(int x, int y) 
    {
        MessageBox.Show("X:" + x + " Y:" + y);
        field[1, 2].Text = "hi";

    }

【问题讨论】:

    标签: c# winforms button


    【解决方案1】:

    您想要做的只是在点击发生时有 X 和 Y。你不需要做太多事情。 首先使用一个非常标准的点击事件。

    然后替换这个:

    int send_i = i;
    int send_j = j;
    field[i, j].Click += (sender, args) =>
    {
        field_Click(send_i, send_j);
    };
    

    有了这个

    field[i, j].Tag = i.ToString() + "|" + j.ToString();
    field[i, j].Click += new EventHandler(field_Click);
    

    现在将事件处理程序更改为以下

    private void field_Click(object sender, EventArgs e)
    {
        string[] sSplitTag = ((Button)sender).Tag.ToString().Split('|');
        int i = Convert.ToInt32(sSplitTag[0]);
        int j = Convert.ToInt32(sSplitTag[1]);
    }
    

    始终尝试使用标签来了解您的控件是谁的详细信息。这就是该属性的用途...标记您的控件,以便您再次见到他时可以认出他。

    【讨论】:

      【解决方案2】:
      field[i, j].Name = i +j';
      field[i, j].Click += (sender, args) =>
                  {
                      field_Click(sender, send_i, send_j);
                  };
      
      
      
      public void field_Click(object theButton, int x, int y) 
      {
          var currentButton = (Button) sender;
      
         if ( currentButton.Name == YOUR CODE HERE IF YOU WANT TO CHECK SOMETHING)
          {
            MessageBox.Show("X:" + x + " Y:" + y);
            field[1, 2].Text = "hi";
          }
      }
      

      【讨论】:

        【解决方案3】:

        更改您的事件处理程序以传递 sender 参数。这是对被点击按钮的引用。

        field[i, j].Click += (sender, args) =>
        {
           field_Click(sender, send_i, send_j);
        };
        
        public void field_Click(object sender, int x, int y) 
        {
            Button btn = sender as Button;
            MessageBox.Show(btn.Name + "X:" + x + " Y:" + y);
            field[x, y].Text = "hi";
        
        }
        

        【讨论】:

        • 这听起来像是我的问题的解决方案,是的。但恐怕我没有完全说出这个问题。我需要能够访问此方法中的所有字段 [x,y]。有没有办法做到这一点?
        • 即我想知道我按下了哪个按钮(例如 field[1,2]),然后将其与其他 field[] 进行比较。
        • @Timme 您需要将field 变量设为类变量。这样,类中的所有方法都可以访问它。
        【解决方案4】:
         field[i, j].Tag = new Point(send_i, send_j);
         field[i, j].Click += (sender, args) => {
            Button button = sender as Button;      
            Point p = (Point) button.Tag;
            field_Click(p.X, p.Y);
         };
        

        注意:重点是您可以通过sender 访问实际点击的Button,只需将其转换为Button,您就可以使用点击的Button 进行任何操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多