Проблема с редактированием данных в списке с использованием нескольких форм

В моей программе я разрешаю пользователю выбирать запись студента из списка, когда он нажимает кнопку редактирования, открывается новая форма. В этой форме отображаются идентификатор и оценка учащегося, которого они выбрали. Я должен позволить пользователю редактировать эту метку и обновлять список. У меня возникли проблемы с редактированием пользователем, и я был бы признателен за любые советы по этому поводу. (У меня проблемы с выяснением, что делать, когда у меня есть данные пользователя внутри формы редактирования)

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

Основная форма:

private void btnEditMark_Click(object sender, EventArgs e) {
    string[] s_rec_arr;

    if (lstMarks.SelectedIndex == -1) {
        MessageBox.Show("please select a student");
    } else {
        ModuleData.s_rec = lstMarks.SelectedItem.ToString();
        s_rec_arr = ModuleData.s_rec.Split(':');
        ModuleData.s_id = s_rec_arr[0];
        ModuleData.s_mark = s_rec_arr[1];
        editMark myEditRecordForm = new editMark();
        this.Hide();
        myEditRecordForm.ShowDialog();
    }
}

Редактировать форму:

public partial class editMark : Form {
    public editMark() {
        InitializeComponent();
        StartPosition = FormStartPosition.CenterScreen;
        txtStudentID.Focus();
    }

    private void btnSubmit_Click(object sender, EventArgs e) {
    }

    private void btnClose_Click(object sender, EventArgs e) {
        this.Hide();
        Form1 myForm = new Form1();
        myForm.ShowDialog();
    }

    private void editMark_Load(object sender, EventArgs e) {
        txtStudentID.Text = ModuleData.s_id;
        txtMark.Text = ModuleData.s_mark;
    }
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете добавить в список любой тип объекта, а не только строки. Создайте студенческий класс и добавьте Student объектов в список. Или, может быть, вы предпочитаете использовать свой класс ModuleData. Но в любом случае вам не нужно использовать s_rec со строкой, разделенной двоеточием.

public class Student
{
    public string Id { get; set; }
    public string Mark { get; set; }

    // Required to make to have the list box display useful information about students.
    public override string ToString()
    {
        return $"Id = {Id}, Mark = {Mark}";
    }
}

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

private Student _student;

public editMark(Student student)
{
    InitializeComponent();

    // Remember the student
    _student = student;

    StartPosition = FormStartPosition.CenterScreen;

    txtStudentID.Text = student.Id;
    txtMark.Text = student.Mark;
    txtStudentID.Focus();
}

В форме редактирования, если вы сделаете Form1 myForm = new Form1();, это создаст новый экземпляр Form1 вместо использования существующего скрытого.

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

private void btnClose_Click(object sender, EventArgs e)
{
    _student.Id = txtStudentID.Text; // Only id the Id is editable.
    _student.Mark = txtMark.Text;

    Close();
}

В основной форме

private void BtnEditMark_Click(object sender, EventArgs e)
{
    if (lstMarks.SelectedIndex == -1) {
        MessageBox.Show("please select a student");
    } else {
        var student = (Student)lstMarks.SelectedItem;

        // Pass the student as to the edit form
        var myEditRecordForm = new editMark(student);
        Hide();
        myEditRecordForm.ShowDialog(); // The code pauses here until the edit form is closed.
        Show(); // Doing this here prevents you from having the edit form knowing about Form1.

        // To display the changes.
        lstMarks.Items[lstMarks.SelectedIndex] = student;
    }
}

Привет Oilver! Большое спасибо за ответ на мой вопрос! Ваше решение кажется более разумным. Хотя код работает, у него возникают проблемы с: var student = (Student)lstMarks.SelectedItem; линия. Когда я запускаю свою программу, мне нужно сначала выбрать метку в списке, а затем нажать «Изменить», когда я это делаю, она падает из-за этой строки кода.

JackC 06.04.2019 22:00

Конечно, вы должны добавить элементы типа Student в список. Например: lstMarks.Items.Add(new Student { Id = "1", Mark = "A" });. Нет ToString()! Я не знаю, как вы это сделали. Если вы присвоили DataSource, то вы должны назначить ему коллекцию типа Student.

Olivier Jacot-Descombes 06.04.2019 22:07

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

JackC 06.04.2019 22:16

Предполагая, что каждая строка файла содержит одну запись об ученике, затем преобразуйте каждую строку в запись об ученике (используя разделение, как и раньше) и сохраните их в файле List<Student>(). var studentList = new List<Student>(); Примерно так string[] rec = line.Split(";"); studentList.Add(new Student { Id = rec[0], Mark = rec[1] });.

Olivier Jacot-Descombes 06.04.2019 22:21

Другие вопросы по теме