2013-05-01 2 views
1

Я делаю калькулятор в графическом интерфейсе, и мне нужна помощь. Когда я ввожу некоторые данные в текстовое поле, мне нужно сохранить его в массиве. Вот как я думал об этом.Как отображать элементы массива, если число элементов является переменной

int numOfPackages;//used to get user input 

    private void button3_Click(object sender, EventArgs e) 
    { 
     int[] weight = new int[numOfPackages]; 

     for(int i = 0; i < numOfPackages; i++) 
     { 
      weight[i] = Convert.ToInt32(weightBox.Text); 
     } 

     foreach (int i in weight) 
      totalCostLabel.Text = "" + weight[i]; 

    } 

И когда я пытаюсь отобразить элементы, это дает мне исключение indexOutOfRange. Итак, как мне отображать элементы этого массива?

Заранее спасибо.

+3

Пожалуйста, по крайней мере, читать [док о Еогеаспе] (http://msdn.microsoft.com/en-us/library/ttw7t8t6%28v=vs.100%29.aspx). –

ответ

5

Эта линия

foreach (int i in weight) 
    totalCostLabel.Text = "" + weight[i]; 

должен быть

foreach (int w in weight) 
    totalCostLabel.Text = "" + w; 

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

Еще одна проблема заключается в первом цикле: вы устанавливаете все значения weight на тот же номер:

weight[i] = Convert.ToInt32(weightBox.Text); // That's the same for all i-s 

Если веса должны быть разными, они должны исходить от различных коробок весом, или строки из один weightBox должен обрабатываться таким образом, чтобы создавать несколько номеров (например, используя string.Split).

+0

О, я не объяснил, что numOfPackages - это номер, который должен ввести пользователь.Но я увеличил i, почему он пытается сохранить ввод в том же индексе? –

+0

@RomanGusan Вы должны объяснить это, отредактировав вопрос. Я бы ожидал, что 'numOfPackages' будет поступать из другого текстового поля или, возможно, другого элемента пользовательского интерфейса, верно? – dasblinkenlight

0

У вас здесь несколько проблем. Прежде всего это:

foreach (int i in weight) 
     totalCostLabel.Text = "" + weight[i]; 

Это итерация весового массива и использование каждого значения в этом массиве. Затем вы используете это значение как индекс. Рассмотрим следующий пример:

weight[0] = 0 
weight[1] = 1 
weight[2] = 15 

В своем коде, первые две записи будут работать, потому что есть индекс 0, а индекс 1. Но когда он доходит до последней записи, он ищет индекс 15. Вы можете исправить это двумя способами, первый - использовать обычный цикл:

for(int i=0; i < weight.Length; i++) 
{ 
    totalCostLabel.Text += weight[i]; 
} 

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

Другой способ сделать это состоит в использовании цикла Еогеасп:

foreach(int i in weight) 
{ 
    totalCostLabel.Text += i; 
} 

Это то же самое, что и выше, но вам не придется беспокоиться о индексации.

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

0

Возможно, вам понравилось что-то большее?

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     btnAdd.Enabled = false; 
    } 

    int[] weight; 
    int entriesMade; 
    int numOfPackages; 

    private void btnReset_Click(object sender, EventArgs e) 
    { 
     if (int.TryParse(numEntriesBox.Text, out numOfPackages)) 
     { 
      weight = new int[numOfPackages]; 
      entriesMade = 0; 
      btnReset.Enabled = false; 
      btnAdd.Enabled = true; 
      totalCostLabel.Text = ""; 
     } 
     else 
     { 
      MessageBox.Show("Invalid Number of Entries"); 
     } 
    } 

    private void btnAdd_Click(object sender, EventArgs e) 
    { 
     int value; 
     if (int.TryParse(weightBox.Text, out value)) 
     { 
      weight[entriesMade] = value; 
      weightBox.Clear(); 

      totalCostLabel.Text = ""; 
      int total = 0; 
      for (int i = 0; i <= entriesMade; i++) 
      { 
       total = total + weight[i]; 
       if (i == 0) 
       { 
        totalCostLabel.Text = weight[i].ToString(); 
       } 
       else 
       { 
        totalCostLabel.Text += " + " + weight[i].ToString(); 
       } 
      } 
      totalCostLabel.Text += " = " + total.ToString(); 

      entriesMade++; 
      if (entriesMade == numOfPackages) 
      { 
       btnAdd.Enabled = false; 
       btnReset.Enabled = true; 
       MessageBox.Show("Done!"); 
      } 
     } 
     else 
     { 
      MessageBox.Show("Invalid Weight"); 
     } 
    } 

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