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

#c# #forms #editing

#c# #формы #редактирование

Вопрос:

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

Мне не разрешено использовать 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;
    }
}
  

Ответ №1:

Вы можете добавить любой тип объекта в поле списка, а не только строки. Создайте класс student и добавьте Student объекты в поле listbox. Или, может быть, вы предпочитаете использовать свой 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();
}
  

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

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

 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;
    }
}
  

Комментарии:

1. Привет, Ойлвер, большое спасибо за ответ на мой вопрос! Ваше решение, похоже, имеет гораздо больше смысла, хотя код выполняется, у него возникают проблемы с: var student = (Student)lstMarks. Выбранный элемент; строка. Когда я запускаю свою программу, я должен сначала выбрать метку в списке, а затем нажать Редактировать, когда я это делаю, она вылетает из-за этой строки кода

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

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

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