You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用用户选择的索引更新列表中的对象(WinForm场景)

如何通过索引更新列表中的学生对象属性

我需要实现以下功能:

  • 通过用户选择的索引更新列表中的学生对象
  • 调用更新方法时修改窗体标题为“更新学生信息”
  • 将选中对象的内容填充到文本框中
  • 禁用studentname和studentID文本框,仅允许修改成绩

请问如何通过输入的索引引用列表中的对象并修改其特定属性?


相关代码

frmAddStudent 窗体代码

namespace C03
{
    public partial class frmAddStudent : Form
    {
        public frmAddStudent()
        {
            InitializeComponent();
        }

        private Student student = null;
        // 新增属性:接收要更新的学生对象
        public Student StudentToUpdate { get; set; }

        public Student GetNewStudent()
        {
            this.ShowDialog();
            return student;
        }

        public void UpdateStudent()
        {
            this.Text = "Update Student Information";
            // 将选中学生的信息填充到对应文本框
            txtStudentID.Text = StudentToUpdate.StudentID;
            txtStudentName.Text = StudentToUpdate.StudentName;
            txtScore.Text = StudentToUpdate.Score.ToString();
            
            // 禁用学号、姓名输入框,仅开放成绩编辑
            txtStudentID.Enabled = false;
            txtStudentName.Enabled = false;
            txtScore.Enabled = true;
        }

        // 保存按钮点击事件(需自行绑定到窗体按钮)
        private void btnSave_Click(object sender, EventArgs e)
        {
            if (StudentToUpdate != null && int.TryParse(txtScore.Text, out int newScore))
            {
                // 直接修改对象的成绩属性(List是引用类型,修改会同步到原列表)
                StudentToUpdate.Score = newScore;
                student = StudentToUpdate;
            }
            this.Close();
        }
    }
}

frmStudentScores 窗体代码

namespace C03
{
    public partial class frmStudentScores : Form
    {
        public frmStudentScores()
        {
            InitializeComponent();
        }

        private List<Student> students = null;

        private void frmStudentScores_Load(object sender, EventArgs e)
        {
            students = StudentDB.GetStudent();
            if (students.Count == 0)
            {
                MessageBox.Show("当前没有学生记录");
            }
            else
            {
                FillStudentListBox();
            }
        }

        private void FillStudentListBox()
        {
            lstStudentsScores.Items.Clear();
            foreach (Student s in students)
            {
                lstStudentsScores.Items.Add(s.DisplayStudInfo(4));
            }
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            frmAddStudent addStudent = new frmAddStudent();
            Student student = addStudent.GetNewStudent();
            if (student != null)
            {
                students.Add(student);
                StudentDB.SaveStudents(students);
                FillStudentListBox();
            }
        }

        private void btnUpdate_Click(object sender, EventArgs e)
        {
            int selectedIndex = lstStudentsScores.SelectedIndex;
            if (selectedIndex != -1)
            {
                // 通过索引直接获取列表中的学生对象(引用类型,修改属性会同步到原列表)
                Student targetStudent = students[selectedIndex];
                
                frmAddStudent updateForm = new frmAddStudent();
                updateForm.StudentToUpdate = targetStudent;
                updateForm.UpdateStudent();
                
                updateForm.ShowDialog();
                
                // 保存修改后的学生列表并刷新显示
                StudentDB.SaveStudents(students);
                FillStudentListBox();
            }
            else
            {
                MessageBox.Show("请选择一个学生");
                lstStudentsScores.Focus();
            }
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            int i = lstStudentsScores.SelectedIndex;
            if (i != -1)
            {
                Student student = students[i];
                string message = "确定要删除 " + student.DisplayStudInfo() + " 吗?";
                DialogResult button = MessageBox.Show(message, "确认删除", MessageBoxButtons.YesNo);
                if (button == DialogResult.Yes)
                {
                    students.Remove(student);
                    StudentDB.SaveStudents(students);
                    FillStudentListBox();
                }
            }
            else
            {
                MessageBox.Show("请选择一个学生。");
                lstStudentsScores.Focus();
            }
        }
    }
}

核心实现逻辑

  1. 引用对象修改:List存储的是Student对象的引用,通过students[selectedIndex]获取到对象后,直接修改其Score属性会同步更新列表中的实例,无需重新添加到列表。
  2. 更新界面初始化:在frmAddStudent的UpdateStudent方法中,将选中学生的信息填充到控件,并禁用学号、姓名输入框,限制仅能修改成绩。
  3. 流程闭环:主窗体点击更新按钮时,传递选中的学生对象到更新窗体,用户修改完成后保存列表并刷新显示。

内容的提问来源于stack exchange,提问作者mason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:20:33