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

ASP.NET WebForm课程计数递减与GPA计算功能实现咨询

问题根因分析

  • 移除课程逻辑错误:删除课程后遍历剩余课程时做递减操作,相当于把剩余课程数按负数计算,逻辑完全颠倒,应和添加逻辑对齐,直接统计当前列表的实际数据即可
  • GPA计算缺失核心依赖:当前仅把课程展示名称存在了ListItem的Text属性,没有存储对应成绩,计算GPA时无法提取每门课的成绩权重
  • 统计判断逻辑不合理:课程数为0时没有回显初始值、GPA大于等于1才显示的规则不符合GPA计算规范,0分也需要正常展示

修复实现方案

第一步:抽离公共统计复用方法

先把统计逻辑单独封装,避免添加、删除场景重复写代码:

// 公共方法:更新所有课程统计标签
private void UpdateCourseStats()
{
    int courseCount = rblAddedCourses.Items.Count;
    int totalCredits = courseCount * 3; // 按现有逻辑每门课固定3学分,有自定义学分需求可调整
    decimal totalGradePoints = 0m;

    // 遍历所有课程计算总绩点
    foreach (ListItem course in rblAddedCourses.Items)
    {
        totalGradePoints += ConvertGradeToPoint(course.Value);
    }

    // 计算GPA:总绩点/课程数,保留2位小数,无课程时为0
    decimal gpa = courseCount > 0 ? Math.Round(totalGradePoints / courseCount, 2) : 0m;

    // 给标签赋值,兼容空值场景
    lblNumberCourses.Text = courseCount >= 1 ? courseCount.ToString() : "Unknown";
    lblTotalCredits.Text = totalCredits.ToString();
    lblCurrentGPA.Text = gpa.ToString("0.0");
}

// 成绩转绩点辅助方法,可根据你的实际计分规则调整
private decimal ConvertGradeToPoint(string grade)
{
    return grade switch
    {
        "A" => 4.0m,
        "B" => 3.0m,
        "C" => 2.0m,
        "D" => 1.0m,
        "F" => 0m,
        _ => 0m
    };
}

第二步:修改添加课程逻辑(btnSubmit_Click)

调整课程存储规则,把成绩存在ListItem的Value属性,方便后续计算:

protected void btnSubmit_Click(object sender, EventArgs e)
{
    rblAddedCourses.Visible = true;

    string strNewCourse = txtCoursePrefix.Text.ToUpper() + " " + txtCourseNumber.Text + " (" + ddlGradeEarned.SelectedItem.Text + ")";
    bool blnDuplicateCourse = false;

    foreach (ListItem liCourses in rblAddedCourses.Items)
    {
        if (liCourses.Text == strNewCourse)
        {
            blnDuplicateCourse = true;
        }
    }

    if (blnDuplicateCourse)
    {
        lblError.Text = "该课程已存在!请输入新的课程。";
        return;
    }
    
    // 添加课程时Text存展示信息,Value存对应成绩
    rblAddedCourses.Items.Add(new ListItem(strNewCourse, ddlGradeEarned.SelectedValue));
    lblError.Text = "";

    // 调用公共方法更新统计
    UpdateCourseStats();

    // 清空输入框、隐藏添加面板,可选优化
    txtCoursePrefix.Text = "";
    txtCourseNumber.Text = "";
    ddlGradeEarned.SelectedIndex = 0;
    pnlCourseAdd.Visible = false;
}

第三步:修复移除课程逻辑(btnRemoveSelected_Click)

删除原有错误的递减逻辑,直接调用公共统计方法即可:

protected void btnRemoveSelected_Click(object sender, EventArgs e)
{
    if (rblAddedCourses.SelectedIndex >= 0)
    {
        rblAddedCourses.Items.RemoveAt(rblAddedCourses.SelectedIndex);
    }
    btnRemoveSelected.Visible = false;

    // 调用公共方法更新统计
    UpdateCourseStats();
}

原有btnContinue_Click、btnCancel_Click、lbStartOver_Click逻辑无需调整,和新的统计逻辑兼容。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:06:05