#c# #arrays #button #event-handling
#c# #массивы #кнопка #цикл while #обработка событий
Вопрос:
Моя программа позволяет пользователю вводить значения часов и минут в массив предопределенной длины. Я хочу, чтобы эта кнопка называлась add для формы, которую я создаю, чтобы разрешить пользователю вводить несколько значений, пока массив не будет полностью заполнен. Затем, когда это будет сделано, для вызова метода sortArray () Таким образом, как сейчас, он допускает только один ввод, а затем выдает исключение. Как мне это сделать?
private void addButton_Click(object sender, EventArgs e)
{
int index = 0;
try
{
while (index <= array.Length)
{
minutes = Int32.Parse(minutesTextBox.Text);
hours = Int32.Parse(hoursTextBox.Text);
MessageBox.Show("You have successfully entered a time!");
array[index] = new RandomClass.Time(hours, minutes);
index = index 1;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.GetType().FullName);
MessageBox.Show("Please only input integer numbers. Start again from the beginning");
hoursTextBox.Text = null;
minutesTextBox.Text = null;
array = null;
arrayLength = null;
}
MessageBox.Show("Please choose what order you want arrange the sort!");
FileA.RandomClass.sortArray(array);
}
Комментарии:
1. Итак, в чем вопрос?
2. какое исключение вы получаете?
3. Я согласен с tym32167… Я не совсем понимаю, о чем вы спрашиваете. Одна из проблем, которую я вижу, заключается в том, что это приведет к возникновению исключения в Int32.Parse(..) если пользователь вводит буквы, вы получите исключение при попытке его использования. я бы рекомендовал проверить правильность ввода. Откуда вы получаете ошибку?
4. я хочу разрешить пользователю продолжать добавлять значения с помощью кнопки добавить и после того, как массив будет полностью заполнен, вызывать метод. Как мне это сделать?
5. Звучит как цикл, который остановится, когда массив заполнится. И у вас есть часть этого, однако оба ответа указывают на проблему, выходящую за рамки, исправьте это, затем внутри этого цикла запустите цикл while, чтобы получить ДЕЙСТВИТЕЛЬНЫЕ целые числа от пользователя, продолжайте цикл, пока не получите действительные целые числа или не завершите. Как только у вас будут допустимые целые числа, поместите их в массив, не уверен, что делает RandomClass при вставке чисел в массив. Но если числа будут помещены, запустите процесс заново в течение следующих часов минут или завершите, если массив заполнен. Надеюсь, это поможет.
Ответ №1:
Вы не показали, насколько велик массив, но эта строка:
while (index <= array.Length)
вызовет проблему, когда вы дойдете до конца вашего массива, потому что индексы массива изменяются от нуля до единицы, меньшей длины массива.
Итак, вам нужно изменить эту строку на либо:
while (index < array.Length)
Возможно, безопаснее выполнять цикл следующим образом:
foreach (ver element in array)
{
// do stuff
element = new RandomClass.Time(hours, minutes);
}
таким образом, вы не сможете выполнить цикл за пределами конца массива.
Ответ №2:
Не используйте эту строку. Вы получите исключение IndexOutOfRangeException, где индекс будет равен длине массива.
while (index <= array.Length)
Вы должны использовать вот так.
while (index < array.Length)
Еще одно, что вы можете использовать int.TryParse
, чтобы избавиться от текста идентификатора исключения — null или emptry.
Ответ №3:
Я основываю свой ответ на предположении, что кнопка добавления должна быть нажата для каждого нового значения часов и минут.
В настоящее время я вижу следующие проблемы в вашем коде
int index = 0;
Вы устанавливаете индекс равным нулю при каждом нажатии кнопки добавить, из-за этого значения массива перезаписываются при каждом нажатии кнопки добавить. Инициализируйте индекс в более подходящем месте вашего кода.
while (индекс <= массив.Длина)
Давайте предположим, что массив имеет длину 5 и значение index = 5, тогда эта строка вызовет ошибку, поскольку массивы в c индексируются на ноль#
минуты = Int32.Parse(minutesTextBox.Text);
Метод Int32.Parse возвращает bool, который показывает, удалось преобразование или нет. Более подходящим способом использования int32.Parse было бы
Int32.Parse(minutesTextBox.Text, out minutes);
Теперь, поскольку новые значения добавляются при каждом нажатии кнопки Добавить, вы можете изменить while на if и else. т.е.,
if(index < array.Length)
//Parse, add to array and increment the index
else
//Reset index (if required) and Call the sortArray() method.
Комментарии:
1. Рад, что смог помочь: D