2013-03-02 2 views
0

Моя форма пуста, за исключением полосы меню вверху для новой игры и выхода. Когда форма загружается, она заполняется сеткой кнопок, размеры которых считываются из файла App.config. Каков наилучший способ удалить все кнопки, которые были добавлены в форму для новой игры?Как очистить элементы управления Button от формы

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. Спасибо всем.

+0

Winforms? WebForms? WPF? – Oded

+0

Проект Windows Forms в VS 2012 – BackDoorNoBaby

ответ

0

Вместо использования this.Controls.Clear

Вы можете сделать петлю через this.Controls и тест, чтобы увидеть, если это была кнопка, а затем удалить его.

Лучший способ хотя бы создать контейнер, панель или некоторые такие, и создавать кнопки внутри, что и использовать

this.Controls.Remove(myPanel); 
myPanel.Dispose(); 
+0

Я пробовал ваш код, но не удалял панель в форме. Это все еще существует, поскольку оно было создано. – Shaharyar

+0

А, вы вызвали myPanel.Dispose() после его удаления, мой плохой ... –

+0

Основываясь на коде, который вы только что опубликовали, не делайте этого. Я думал, что вы создаете и добавляете кнопки на лету. Что вы делаете, создавая их, а затем добавляя или удаляя на лету. –

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(); в конструкторе

+0

Как насчет повторного заполнения формы кнопками? Посмотрите на код ниже, который я опубликовал для заполнения моей формы. – BackDoorNoBaby

+0

@BackDoorNoBaby см. Мое редактирование – VladL

0

Так что это мой конструктор Gameboard, и Ill покажет вам, как Form называет его заполнять кнопками внизу.

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 так, чтобы она вновь заполнит? ?

+0

Ahhh. Посмотрите на UserControl. Вы можете обернуть все это в свой собственный пользовательский компонент. и не нужно все это добавлять и удалять вещи. –

-1
int n = 0; 
while (n < number) 
{ 
    btnArray[n].Name = "" + (n + 1); 
    tablePanel.Controls.Remove(btnArray[n]); 
    n++; 
} 
+0

Хотя этот код может решить проблему, хороший ответ должен всегда содержать объяснение. – BDL

Смежные вопросы