使用多种形式在列表框中编辑数据时出现问题

Issue with editing data within a list box using multiple forms

在我的程序中,我允许用户从列表框中select 一条学生记录,当他们点击编辑按钮时,一个新的表单会打开。此表格显示他们 select 教过的学生的 ID 和分数。我需要让用户编辑该标记并更新列表框。我在让用户编辑时遇到了麻烦,如果有任何建议,我将不胜感激。 (当我在编辑表单中包含用户数据时,我不知道该怎么做)

我不被允许使用 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;
    }
}

您可以将任何类型的对象添加到列表框中,而不仅仅是字符串。创建一个学生 class 并将 Student 个对象添加到列表框。或者您可能更喜欢使用 ModuleData class。但在任何情况下,您都不需要将 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 实例,而不是使用现有的隐藏实例。

请记住,class 是引用类型,因此没有必要将学生传递回第一种形式,因为这也有对同一学生的引用。仅更新其属性

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