12.2(2)

继续完成cs项目
namespace StudentGradeManagementSystem;

public partial class GradeManagementForm : Form
{
private DataGridView dgvGrades; // 成绩列表DataGridView
private TextBox txtGradeID, txtScore; // 成绩信息输入框
private ComboBox cmbStudent, cmbCourse; // 学生和课程下拉框
private DateTimePicker dtpExamDate; // 考试日期选择器
private Button btnAdd, btnUpdate, btnDelete, btnClear, btnSearch; // 功能按钮
private TextBox txtSearch; // 搜索框

public GradeManagementForm()
{
    // 设置窗口标题和大小
    this.Text = "成绩管理";
    this.Size = new Size(800, 600);
    this.StartPosition = FormStartPosition.CenterScreen;
    
    // 创建界面控件
    CreateGradeManagementControls();
    // 加载成绩数据
    LoadGradeData();
    // 填充学生下拉框
    PopulateStudentComboBox();
}

private void CreateGradeManagementControls()
{
    // 创建标题标签
    Label titleLabel = new Label();
    titleLabel.Text = "学生成绩管理";
    titleLabel.Font = new Font("宋体", 16, FontStyle.Bold);
    titleLabel.Location = new Point(300, 10);
    titleLabel.AutoSize = true;
    
    // 创建搜索部分
    Panel searchPanel = new Panel();
    searchPanel.Location = new Point(10, 50);
    searchPanel.Size = new Size(760, 40);
    searchPanel.BorderStyle = BorderStyle.FixedSingle;
    
    Label searchLabel = new Label();
    searchLabel.Text = "搜索:";
    searchLabel.Location = new Point(10, 10);
    searchPanel.Controls.Add(searchLabel);
    
    txtSearch = new TextBox();
    txtSearch.Location = new Point(60, 7);
    txtSearch.Width = 200;
    searchPanel.Controls.Add(txtSearch);
    
    btnSearch = new Button();
    btnSearch.Text = "查找";
    btnSearch.Location = new Point(270, 7);
    btnSearch.Click += new EventHandler(btnSearch_Click);
    searchPanel.Controls.Add(btnSearch);
    
    // 创建成绩列表DataGridView
    dgvGrades = new DataGridView();
    dgvGrades.Location = new Point(10, 100);
    dgvGrades.Size = new Size(760, 250);
    dgvGrades.AutoGenerateColumns = false;
    dgvGrades.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    dgvGrades.MultiSelect = false;
    dgvGrades.ReadOnly = true;
    dgvGrades.SelectionChanged += new EventHandler(dgvGrades_SelectionChanged);
    
    // 添加列
    dgvGrades.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "GradeID", HeaderText = "成绩ID", Width = 80 });
    dgvGrades.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "StudentID", HeaderText = "学号", Width = 80 });
    dgvGrades.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "StudentName", HeaderText = "学生姓名", Width = 100 });
    dgvGrades.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "CourseName", HeaderText = "课程名称", Width = 120 });
    dgvGrades.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Score", HeaderText = "成绩", Width = 80 });
    dgvGrades.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "ExamDate", HeaderText = "考试日期", Width = 120 });
    
    // 创建成绩信息输入面板
    Panel inputPanel = new Panel();
    inputPanel.Location = new Point(10, 360);
    inputPanel.Size = new Size(760, 180);
    inputPanel.BorderStyle = BorderStyle.FixedSingle;
    
    // 添加标签和输入控件
    int labelWidth = 100;
    int inputWidth = 200;
    int rowHeight = 35;
    int startX = 20;
    int startY = 15;
    
    // 成绩ID
    Label lblGradeID = new Label();
    lblGradeID.Text = "成绩ID:";
    lblGradeID.Location = new Point(startX, startY);
    lblGradeID.Width = labelWidth;
    inputPanel.Controls.Add(lblGradeID);
    
    txtGradeID = new TextBox();
    txtGradeID.Location = new Point(startX + labelWidth + 10, startY - 2);
    txtGradeID.Width = inputWidth;
    txtGradeID.Enabled = false;  // 成绩ID自动生成
    inputPanel.Controls.Add(txtGradeID);
    
    // 学生选择
    Label lblStudent = new Label();
    lblStudent.Text = "选择学生:";
    lblStudent.Location = new Point(startX + 350, startY);
    lblStudent.Width = labelWidth;
    inputPanel.Controls.Add(lblStudent);
    
    cmbStudent = new ComboBox();
    cmbStudent.Location = new Point(startX + 460, startY - 2);
    cmbStudent.Width = inputWidth;
    inputPanel.Controls.Add(cmbStudent);
    
    // 课程名称
    Label lblCourse = new Label();
    lblCourse.Text = "课程名称:";
    lblCourse.Location = new Point(startX, startY + rowHeight);
    lblCourse.Width = labelWidth;
    inputPanel.Controls.Add(lblCourse);
    
    cmbCourse = new ComboBox();
    cmbCourse.Location = new Point(startX + labelWidth + 10, startY + rowHeight - 2);
    cmbCourse.Width = inputWidth;
    cmbCourse.Items.AddRange(new string[] { "数学", "语文", "英语", "物理", "化学", "生物", "历史", "地理", "政治" });
    inputPanel.Controls.Add(cmbCourse);
    
    // 考试日期
    Label lblExamDate = new Label();
    lblExamDate.Text = "考试日期:";
    lblExamDate.Location = new Point(startX + 350, startY + rowHeight);
    lblExamDate.Width = labelWidth;
    inputPanel.Controls.Add(lblExamDate);
    
    dtpExamDate = new DateTimePicker();
    dtpExamDate.Location = new Point(startX + 460, startY + rowHeight - 2);
    dtpExamDate.Width = inputWidth;
    inputPanel.Controls.Add(dtpExamDate);
    
    // 成绩
    Label lblScore = new Label();
    lblScore.Text = "成  绩:";
    lblScore.Location = new Point(startX, startY + rowHeight * 2);
    lblScore.Width = labelWidth;
    inputPanel.Controls.Add(lblScore);
    
    txtScore = new TextBox();
    txtScore.Location = new Point(startX + labelWidth + 10, startY + rowHeight * 2 - 2);
    txtScore.Width = inputWidth;
    inputPanel.Controls.Add(txtScore);
    
    // 创建按钮面板
    Panel buttonPanel = new Panel();
    buttonPanel.Location = new Point(530, 550);
    buttonPanel.Size = new Size(240, 40);
    
    // 添加按钮
    btnAdd = new Button();
    btnAdd.Text = "添加";
    btnAdd.Location = new Point(0, 0);
    btnAdd.Click += new EventHandler(btnAdd_Click);
    buttonPanel.Controls.Add(btnAdd);
    
    btnUpdate = new Button();
    btnUpdate.Text = "更新";
    btnUpdate.Location = new Point(60, 0);
    btnUpdate.Click += new EventHandler(btnUpdate_Click);
    buttonPanel.Controls.Add(btnUpdate);
    
    btnDelete = new Button();
    btnDelete.Text = "删除";
    btnDelete.Location = new Point(120, 0);
    btnDelete.Click += new EventHandler(btnDelete_Click);
    buttonPanel.Controls.Add(btnDelete);
    
    btnClear = new Button();
    btnClear.Text = "清空";
    btnClear.Location = new Point(180, 0);
    btnClear.Click += new EventHandler(btnClear_Click);
    buttonPanel.Controls.Add(btnClear);
    
    // 添加所有控件到表单
    this.Controls.Add(titleLabel);
    this.Controls.Add(searchPanel);
    this.Controls.Add(dgvGrades);
    this.Controls.Add(inputPanel);
    this.Controls.Add(buttonPanel);
}

// 填充学生下拉框
private void PopulateStudentComboBox()
{
    cmbStudent.DisplayMember = "Name";
    cmbStudent.ValueMember = "StudentID";
    cmbStudent.DataSource = DataManager.Students;
}

// 加载成绩数据到DataGridView
private void LoadGradeData()
{
    dgvGrades.DataSource = null;
    dgvGrades.DataSource = DataManager.Grades;
}

// 清空输入框
private void ClearInputs()
{
    txtGradeID.Text = "自动生成";
    txtScore.Text = "";
    cmbStudent.SelectedIndex = -1;
    cmbCourse.SelectedIndex = -1;
    dtpExamDate.Value = DateTime.Now;
}

// 添加成绩
private void btnAdd_Click(object sender, EventArgs e)
{
    // 验证输入
    if (cmbStudent.SelectedItem == null || cmbCourse.SelectedItem == null || string.IsNullOrEmpty(txtScore.Text))
    {
        MessageBox.Show("请填写完整的成绩信息!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }

    // 验证成绩格式
    if (!decimal.TryParse(txtScore.Text, out decimal score) || score < 0 || score > 100)
    {
        MessageBox.Show("成绩必须是0-100之间的数字!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }

    // 获取选中的学生并进行空值检查
    if (cmbStudent.SelectedItem is Student selectedStudent && cmbCourse.SelectedItem is string courseNameObj)
    {
        string courseName = courseNameObj;
        
        // 检查是否已存在相同的成绩记录
        var existingGrade = DataManager.Grades.FirstOrDefault(g => g.StudentID == selectedStudent.StudentID && g.CourseName == courseName);
        if (existingGrade != null)
        {
            DialogResult result = MessageBox.Show("该学生已有此课程的成绩记录,是否更新?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (result == DialogResult.Yes)
            {
                // 更新现有成绩
                existingGrade.Score = score;
                existingGrade.ExamDate = dtpExamDate.Value;
                LoadGradeData();
                ClearInputs();
                
                // 显示成功消息
                using (SuccessForm successForm = new SuccessForm())
                {
                    successForm.ShowDialog();
                }
            }
            return;
        }

        // 生成新的成绩ID
        int newGradeID = DataManager.Grades.Count > 0 ? DataManager.Grades.Max(g => g.GradeID) + 1 : 1;
        
        // 添加新成绩
        Grade newGrade = new Grade
        {
            GradeID = newGradeID,
            StudentID = selectedStudent.StudentID,
            StudentName = selectedStudent.Name ?? "",
            CourseName = courseName,
            Score = score,
            ExamDate = dtpExamDate.Value
        };

        DataManager.Grades.Add(newGrade);
        LoadGradeData();  // 重新加载数据
        ClearInputs();  // 清空输入框
        
        // 显示成功消息
        using (SuccessForm successForm = new SuccessForm())
        {
            successForm.ShowDialog();
        }
    }
}

// 更新成绩
private void btnUpdate_Click(object sender, EventArgs e)
{
    if (dgvGrades.SelectedRows.Count == 0)
    {
        MessageBox.Show("请先选择要更新的成绩记录!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        return;
    }

    // 验证成绩格式
    if (!decimal.TryParse(txtScore.Text, out decimal score) || score < 0 || score > 100)
    {
        MessageBox.Show("成绩必须是0-100之间的数字!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }

    // 获取选中的成绩记录并进行空值检查
    if (dgvGrades.SelectedRows[0].DataBoundItem is Grade selectedGrade)
    {
        // 更新成绩信息
        selectedGrade.Score = score;
        selectedGrade.ExamDate = dtpExamDate.Value;

        LoadGradeData();  // 重新加载数据
        ClearInputs();  // 清空输入框
        
        // 显示成功消息
        using (SuccessForm successForm = new SuccessForm())
        {
            successForm.ShowDialog();
        }
    }
}

// 删除成绩
private void btnDelete_Click(object sender, EventArgs e)
{
    if (dgvGrades.SelectedRows.Count == 0)
    {
        MessageBox.Show("请先选择要删除的成绩记录!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        return;
    }

    // 确认删除
    DialogResult result = MessageBox.Show("确定要删除选中的成绩记录吗?", "确认删除", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    if (result == DialogResult.Yes)
    {
        // 获取选中的成绩记录并进行空值检查
        if (dgvGrades.SelectedRows[0].DataBoundItem is Grade selectedGrade)
        {
            // 删除成绩
            DataManager.Grades.Remove(selectedGrade);
            LoadGradeData();  // 重新加载数据
            ClearInputs();  // 清空输入框
            
            // 显示成功消息
            using (SuccessForm successForm = new SuccessForm())
            {
                successForm.ShowDialog();
            }
        }
    }
}

// 清空输入框
private void btnClear_Click(object sender, EventArgs e)
{
    ClearInputs();
}

// 搜索成绩
private void btnSearch_Click(object sender, EventArgs e)
{
    string searchText = txtSearch.Text.Trim().ToLower();
    
    if (string.IsNullOrEmpty(searchText))
    {
        LoadGradeData();  // 如果搜索框为空,加载所有数据
        return;
    }

    // 按学生姓名、课程名称或学号搜索
    var searchResult = DataManager.Grades.Where(g => 
        g.StudentName.ToLower().Contains(searchText) || 
        g.CourseName.ToLower().Contains(searchText) ||
        g.StudentID.ToString().Contains(searchText)
    ).ToList();

    dgvGrades.DataSource = null;
    dgvGrades.DataSource = searchResult;
}

// 选中行变化时填充输入框
private void dgvGrades_SelectionChanged(object sender, EventArgs e)
{
    if (dgvGrades.SelectedRows.Count > 0 && dgvGrades.SelectedRows[0].DataBoundItem is Grade selectedGrade)
    {
        txtGradeID.Text = selectedGrade.GradeID.ToString();
        txtScore.Text = selectedGrade.Score.ToString();
        
        // 设置学生选择
        for (int i = 0; i < cmbStudent.Items.Count; i++)
        {
            if (cmbStudent.Items[i] is Student student && student.StudentID == selectedGrade.StudentID)
            {
                cmbStudent.SelectedIndex = i;
                break;
            }
        }
        
        cmbCourse.Text = selectedGrade.CourseName ?? "";
        dtpExamDate.Value = selectedGrade.ExamDate;
    }
}

}

posted @ 2025-12-02 23:40  山蚯  阅读(4)  评论(0)    收藏  举报