Member 14351839 Ответов: 1

Обновление данных в списке из другой формы


I'm creating a program that maintains student scores. I've created a class called students that stores the data and displays it in a list box. Once the user clicks btnAdd a new form (frmAddStudent) loads that allows them to add the user by name and their scores and display it in the listbox in the main form. It also allows the update/delete functions. I can succesfully add students to the list and edit them, but when I press the ok button in the update students form I get the error, "System.ArgumentOutOfRangeException: 'Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index'". I know this means that the argument passed was out of range, but I'm not sure how. Any help is appreciated. Thanks! I've included my source code if you want a deeper look.

frmUpdateStudent.cs

 private void UpdateButton_Click_1(object sender, EventArgs e) //open update form for current student
 {
 Student Form1 = new Student();
 Form1.Name = StudentName.Text;
                parentForm.UpdateStudent(index, Form1);
 Close();

 }

Form1.cs

<pre>public List<Student> studentList = new List<Student>();


public Student GetStudent(int id) //получить индекс студента
{
return studentList[id];

}

public bool UpdateStudent(int originalIndex, Student studentToEdit)
{
пробовать
{
Student student = GetStudent(originalIndex); //выберите индекс студента
студент.Имя = studentToEdit.Name; //имя студента
studentList.RemoveAt(originalIndex); //удалить студента по выбранному индексу
студенческий список.Insert(originalIndex, student); //вставить нового студента в индекс.
UpdateStudentList(); //обновить список учащихся
}
catch { return false; }
вернуть true;
}


Студент.в CS

ученик открытый класс
{
общественная список<инт&ГТ; баллы = новый список<инт&ГТ;();

публичное строковое имя
{ get; set; }

public bool AddScore(int score)
{
пробовать
{
Рейтинг.Добавить(оценка);
}
catch { return false; }
вернуть true;
}

публичный список<int> GetScores()
{
вернуть баллы;
}

public int Getscore (индекс int)
{
return (int)Scores[index];
}

public int GetScoreTotal()
{
int sum = 0;
по каждому элементу (результат типа int в баллах)
{
сумма += оценка;
}
возврат суммы;
}

public int GetScoreCount()
{
возвращайте баллы.Рассчитывать;
}

GetScoreAverage общественных инт ()
{
return GetScoreTotal() / GetScoreCount();
}

общественного недействительными DestroyScores()
{
Баллы = новый список<int>();

}

Что я уже пробовал:

исходный код - GitHub - Triptonix/Студент: Приложение[^]

1 Ответов

Рейтинг:
10

Christian Graus

Вы не показываете метод updatestudent, но очевидно, что индекс, который вы передаете, является недопустимым. Почему ты думаешь, что это не так?


Member 14351839

Я добавил метод UpdateStuent и потому, что я ввожу целое число, и у меня оно установлено как целое число?

Christian Graus

Индекс-это целое число, которое вы ввели? как это может работать? Это индекс в массиве, он должен быть индексом редактируемого элемента, переданного из родительской формы

Member 14351839

GetStudent(int идентификатор) UpdateStudent = студент студент = GetStudent(originalIndex);

Member 14351839

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

Christian Graus

Именно это я и сказал

Студент студент = GetStudent(студенты.SelectedIndex); //выберите индекс из списка

студенты.SelectedIndex равен -1. Я так и думал. Это индекс списка. Сохраните это в переменной, когда вы начнете редактировать, потому что она будет снята, когда появится новое диалоговое окно.

Christian Graus

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

Member 14351839

Так почему же именно он находится вне зоны досягаемости? Итак, я должен хранить индекс в переменной в форме обновления?

Christian Graus

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

Member 14351839

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

Christian Graus

частный int _selectedIndex;

частная students_SelectedIndexChanged_1 недействительным(объект отправителя, EventArgs в электронной)
{
_selectedIndex = студенты.Свойства selectedIndex;


Теперь замените студентов.SelectedIndex с вашей новой локальной переменной

Christian Graus

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

Member 14351839

Я изменился

частная students_SelectedIndexChanged_1 недействительным(объект отправителя, EventArgs в электронной)
{
_selectedIndex = студенты.Свойства selectedIndex;
Student student = GetStudent(_selectedIndex); //выберите индекс из списка
ScoreTotalTextBox.Текст = студент.GetScoreTotal().ToString(); //показать общий балл в поле
ScoreCountTextBox.Текст = студент.GetScoreCount().ToString(); //show Score Count to box
ScoreAverageTextBox.Текст = студент.Getscore saverage().ToString(); //показать средний балл в поле
}

а также изменил метод UpdateStudent, но я все еще получаю ту же ошибку.

Christian Graus

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

Member 14351839

Это приводит меня к методу, прямо описанному выше. Если моя логика верна, то первая строка "Student student = GetStudent(студенты.SelectedIndex);" выбирает индекс из списка, который я создал в классе student и внутри класса student, который я объявил

public int Getscore (индекс int)
{
return (int)studentList[индекс];
}

Member 14351839

Наверное, я запутался в том, где установить индекс и как его назвать.

Christian Graus

студенты-это ваш список. Значение SelectedIndex равно -1. Вот почему мы сохранили его в переменной

Member 14351839

Я считаю, что я сохранил SelectionIndex, но все еще получаю ту же ошибку.

Christian Graus

Замените студентов.SelectedIndex с _selectedIndex, переменной, которую мы создали. Если этот вызов находится в другой форме, то вы можете создать новый метод в базовой форме, который предполагает, что _selectedIndex-это нужный вам индекс.

Member 14351839

Я добавил:

частная students_SelectedIndexChanged_1 недействительным(объект отправителя, EventArgs в электронной)
{
_selectedIndex = студенты.Свойства selectedIndex;
Student student = GetStudent(_selectedIndex); //выберите индекс из списка
ScoreTotalTextBox.Текст = студент.GetScoreTotal().ToString(); //показать общий балл в поле
ScoreCountTextBox.Текст = студент.GetScoreCount().ToString(); //show Score Count to box
ScoreAverageTextBox.Текст = студент.Getscore saverage().ToString(); //показать средний балл в поле
}

и создал переменную private int _selectedIndex; внутри того же класса, но с той же ошибкой.

Christian Graus

Вы сохранили его, но не использовали на другом конце!!!

Member 14351839

Что вы хотите этим сказать? Я попытался вызвать его в своем методе GetProduct, но это не сработало.

Christian Graus

Теперь я понимаю. Попробуйте добавить код, который проверяет, равен ли выбранный индекс -1, и не продолжает работу, если это так.

Member 14351839

Как бы я это сделал? Я пошел сюда https://stackoverflow.com/questions/21327931/get-the-index-of-item-selected-in-listview и добавил оператор if, но безрезультатно.

Christian Graus

если (_selectedIndex &ГТ; -1){

Student student = GetStudent(_selectedIndex); //выберите индекс из списка
....
}

Member 14351839

Что казалось, чтобы исправить это. Это сейчас

частная students_SelectedIndexChanged_1 недействительным(объект отправителя, EventArgs в электронной)
{
_selectedIndex = студенты.Свойства selectedIndex;

если (_selectedIndex &ГТ; -1)
{

Student student = GetStudent(_selectedIndex); //выберите индекс из списка

Student students = GetStudent(_selectedIndex); //выберите индекс из списка
ScoreTotalTextBox.Текст = студент.GetScoreTotal().ToString(); //показать общий балл в поле
ScoreCountTextBox.Текст = студент.GetScoreCount().ToString(); //show Score Count to box
ScoreAverageTextBox.Текст = студент.Getscore saverage().ToString(); //показать средний балл в поле
}
}

Christian Graus

Да, так что в конце концов, ваше выбранное событие изменения индекса не имело дела с отменой выбора поля, оно предполагало, что выбор всегда был. Ваш код также взрывается, если вы добавляете студента без баллов, Ваша обработка крайних случаев нуждается в работе

Member 14351839

Да, я полагал, что он автоматически сохранит индекс, основанный на моем выборе. Мне все еще нужно добавить много проверок ошибок, но я рад, что мы это сделали. Я застрял на несколько дней! лол еще раз спасибо

Christian Graus

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