2014-06-06 4 views
0

Здравствуйте, я новичок в C#, и у меня есть проблема с этим кодом. В последнем обработчике событий btnClear_Click мне нужно удалить динамически выделенные элементы массива элементов, которые я создал. Таким образом, в основном у меня есть основная форма, откуда я вызываю диалоговую форму, где вы, когда пользователь может выбрать номер, и когда вы вводите число, в основной форме вы получаете несколько кнопок, которые вы ранее вводили (если вы входите 4 вы получите 4 кнопки от 0 до 3). Может кто-то помочь мне с этим, потому что я не могу найти ответ в любом месте :( СпасибоКак удалить динамически выделенный массив C#

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     private Button[] btnNums; 
     private int digits, prevNum, lastNum; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void btnSetBase_Click(object sender, EventArgs e) 
     { 
      frmDialog frmDialogInput = new frmDialog(); 
      DialogResult dResult = 
       frmDialogInput.ShowDialog(this); 
      if (dResult == DialogResult.OK) 
      { 
       digits = frmDialogInput.Base; 
       lblOutDigits.Text = digits.ToString(); 
       lastNum = int.Parse(lblOutDigits.Text); 
       CreateBaseButtons(prevNum, lastNum); 
       prevNum = lastNum; 
      } 
     } 
     private void CreateBaseButtons(int prev, int number) 
     { 
      for (int i = 0; i < prev; i++) 
       btnNums[i].Dispose(); 
      int x = 34, y = 70; 
      btnNums = new Button[number]; 
      for(int j = 0; j < number; j++) 
      { 
       btnNums[j] = new Button(); 
       btnNums[j].Location = new System.Drawing.Point(x, y); 
       btnNums[j].Name = "btn" + j; 
       btnNums[j].Size = new System.Drawing.Size(45, 23); 
       btnNums[j].Text = j.ToString(); 
       btnNums[j].UseVisualStyleBackColor = true; 
       btnNums[j].Click += new System.EventHandler(btnNums_Click); 
       this.Controls.Add(btnNums[j]); 
       x += btnNums[j].Size.Width; 
      } 
     } 
     private void btnNums_Click(object sender, EventArgs e) 
     { 
     } 
     private void btnClear_Click(object sender, EventArgs e) 
     { 
      lblOutDigits.Text = " "; 
     } 
    } 
} 
+1

... вы уже делаете, что в вашем другом методе. В частности, цикл, содержащий 'btnNums [i] .Dispose();' ... –

+0

Tx I переместил его в обработчик события btnClear_Click и его работу. У меня, вероятно, будет больше вопросов об этой программе, потому что ее программа из 4 частей и я на второй части – Zile

+0

@Zile Но, пожалуйста, тогда откройте новый вопрос. – DatRid

ответ

0

Да, вы можете сделать это в обработчике события btnClear_Click. Просто добавьте условие, чтобы проверить, является ли нулевым btnNums или нет, чтобы избежать ошибок ..

if(btnNums!=null) 
    { for (int i = 0; i < btnNums.Count; i++) 
      btnNums[i].Dispose(); 
    } 
+0

Я сделал это так, но без оператора – Zile

0

Я хотел бы посмотреть, чтобы изменить дизайн кода для использования List<Button> сохранить текущий список кнопок и упростить использование вами переменных уровня модуля

Попробуйте написать свой код следующим образом:

public partial class Form1 : Form 
{ 
    private List<Button> _buttons = new List<Button>(); 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
    private void btnSetBase_Click(object sender, EventArgs e) 
    { 
     frmDialog frmDialogInput = new frmDialog(); 
     DialogResult dResult = frmDialogInput.ShowDialog(this); 
     if (dResult == DialogResult.OK) 
     { 
      var digits = frmDialogInput.Base; 
      lblOutDigits.Text = digits.ToString(); 
      CreateBaseButtons(digits); 
      } 
    } 
    private void ClearBaseButtons() 
    { 
     _buttons.ForEach(b => 
     { 
      this.Controls.Remove(b); 
      b.Click -= btnNums_Click; 
      b.Dispose(); 
     }); 
     _buttons.Clear(); 
    } 
    private void CreateBaseButtons(int number) 
    { 
     this.ClearBaseButtons(); 
     int x = 34, y = 70; 
     for (int j = 0; j < number; j++) 
     { 
      var button = new Button() 
      { 
       Location = new System.Drawing.Point(x, y), 
       Name = "btn" + j, 
       Size = new System.Drawing.Size(45, 23), 
       Text = j.ToString(), 
       UseVisualStyleBackColor = true, 
      }; 
      button.Click += btnNums_Click; 
      this.Controls.Add(button); 
      _buttons.Add(button); 
      x += button.Size.Width; 
     } 
    } 
    private void btnNums_Click(object sender, EventArgs e) 
    { 
    } 
    private void btnClear_Click(object sender, EventArgs e) 
    { 
     lblOutDigits.Text = " "; 
     this.ClearBaseButtons(); 
    } 
} 

Это должно решить вашу проблему, а также добавить дополнительную очистку, удалив обработчик событий и явно удалив кнопки из формы.

+0

Я согласен, что это лучшее решение, но это проект, который дал нам профессор, и она сказала нам не использовать List – Zile

0

Просто написать этот код в ваш метод:

private void btnClear_Click(object sender, EventArgs e) 
    { 
     lblOutDigits.Text = " "; 

     this.btnNums = new Button[btnNums]; // or this.btnNums = new Button[1]; 
    } 
Смежные вопросы