0

New Game と Exit の上部にあるメニュー ストリップを除いて、私のフォームは空白です。フォームが読み込まれると、App.config ファイルから寸法が読み取られるボタンのグリッドが取り込まれます。新しいゲームのフォームに配置されたすべてのボタンをクリアする最良の方法は何ですか?

this.Controls.Clear();

フォームの上部にあるメニューストリップも削除され、フォームからしか呼び出せないため、上記は機能しません。プログラムの Gameboard クラス内で実行する関数もあります

    public void ClearButtons()
    {

        for (int q = 0; q < buttonArray.Length; q++)
        {
            buttonArray[q].Text = "";
            buttonArray[q].Enabled = true;
            buttonArray[q].BackColor = Color.LightGray;
        }
    }

しかし、これを行うにはもっと良い方法が必要です。フォームを再ロードできれば、必要なボタンが再入力されますが、特に Gameboard クラスからはそれを理解できないようです。皆さんありがとう。

4

4 に答える 4

2

1)クリアの代わりに、すべてのボタンを削除する次のコードを使用できます。

  public void ClearButtons()
  {
    for (int i = 0; i < this.Controls.Count; i++)
    {
       if (Controls[i] is Button)
       {
         Controls.RemoveAt(i);
         i--;
       }
    }
  }

2)このコードを別のクラスから呼び出したい場合は、フォームのインスタンスを、たとえばコンストラクターパラメーターとして渡す必要があります。

3)public void MyInits()関数を作成し、Form1_Loadそこからコードを移動します。次に、Form1_Load

4)コンストラクターを編集して

public Gameboard(int numberofButtons, Form1 frm)

パスしthisてからインスタンス化します。frm.MyInits();コンストラクターを呼び出すより

于 2013-03-02T20:14:38.653 に答える
0

これが私のGameboardコンストラクターであり、フォームがどのように呼び出して下部にボタンを配置するかを示します。

public Gameboard(int numberofButtons) //Constructor method that is referencing the App.config for the dimensions value to make the board
    {
        if (numberofButtons <= 0) 
            throw new ArgumentOutOfRangeException("Invalid Grid"); //throws an exception for an invalid grid size if dimensions is equal to or less than zero

        buttonArray = new Button[numberofButtons]; //creating an array the size of numberofButtons which is the dimensions value from App.config
        Font font = new Font("Times New Roman", 36.0f); //creates an instance of the Font class
        int sqrtY = (int) Math.Sqrt(numberofButtons);
        int z = 0; //Counter for array

        //Create the buttons for the form
        //Adds the buttons to the form first with null values then changes the .Text to ""
        for (int x = 0; x < sqrtY; x++)
        {
            for (int y = 0; y < sqrtY; y++)
            {
                buttonArray[z] = new Button();
                buttonArray[z].Font = font;
                buttonArray[z].Size = new System.Drawing.Size(100, 100);
                buttonArray[z].Location = new System.Drawing.Point(100*y, 100*x);
                buttonArray[z].Click += new EventHandler(button_click);
                z++; 
            }
        }//At the end of this loop, buttonArray contains a number of buttons equal to Dimensions all of which have a .Text property of ""
    }

フォームが読み込まれるときは次のようになります。

    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            //Read the App.Config file to get the dimensions of the grid
            int dimensions = Convert.ToInt16(ConfigurationManager.AppSettings["dimensions"]);

            //Create the gameboard object with all the buttons needed
            Gameboard gb = new Gameboard(dimensions); //Calls the Gameboad constructor method

            //Add buttons to the form
            for (int x = 0; x < gb.buttonArray.Length; x++)
            {
                this.Controls.Add(gb.buttonArray[x]);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

フォームからボタンをクリアした後、Form_Loadを再実行して再入力するには、何を呼び出す必要がありますか?

于 2013-03-02T20:40:04.573 に答える
0

this.Controls.Clearを使用する代わりに

this.Controlsをループして、ボタンであるかどうかをテストしてから削除することができます。

ただし、より良い方法は、コンテナやパネルなどを作成し、その中にボタンを作成して使用することです。

this.Controls.Remove(myPanel);
myPanel.Dispose();
于 2013-03-02T20:11:04.513 に答える