C# WinForms 制作简易在线答题系统源码

木白
木白
发布时间:2026-10-16 | 4人浏览过
原创

本文分享如何使用 C# WinForms 快速构建一个具备倒计时、自动判分功能的考试答题系统。文中详细解析了从起始页到答题界面的逻辑跳转,以及如何利用 Timer 和控件遍历实现核心业务,适合初学者理解 Windows 桌面应用的基础开发流程。

系统效果展示

本示例系统包含四个主要交互阶段,整体界面简洁,功能明确:

1. 起始页:用户点击按钮进入答题流程,关闭选项位于此页面。

2. 答题界面:显示题目与选项,右上角设有倒计时时钟,顶部可导航返回起始页。

3. 时间截止提示:当倒计时归零时,系统自动停止计时并弹出提示信息。

4. 提交与结算:考生主动点击交卷或时间耗尽后,系统计算得分并显示正确率。

核心逻辑与代码实现

第1步:构建起始页(Start)

目的:作为程序入口,处理初始化及界面跳转逻辑。
关键动作:实例化考试窗体并隐藏当前窗口。

public partial class Start : Form
{
    public Start()
    {
        InitializeComponent();
    }

    // 退出应用程序
    private void button2_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }

    // 进入考试主界面
    private void button1_Click(object sender, EventArgs e)
    {
        Test t = new Test(); // 实例化考试类
        t.Show();            // 显示考试窗体
        this.Hide();         // 隐藏当前起始页,保持后台驻留
    }
}

第2步:实现考试主界面(Test)

目的:管理答题状态、倒计时逻辑及分数统计。
关键参数:currentTime 记录剩余秒数,num 记录答对题数。

初始化设置:加载窗体时启用定时器,设定间隔为 1000 毫秒(1秒)。

public partial class Test : Form
{
    public int currentTime = 20; // 假设初始时间为20秒
    public int num = 0;          // 答对数量

    public Test()
    {
        InitializeComponent();
        button2.Visible = false; // 初始隐藏“重新答题”按钮
    }

    private void Test_Load(object sender, EventArgs e)
    {
        timer1.Interval = 1000; // 设定每秒触发一次
        timer1.Start();       // 启动倒计时
    }
}

第3步:倒计时与超时处理

操作逻辑:每次 Tick 事件减少秒数,若归零则锁定界面并播放提示音。

private void timer1_Tick(object sender, EventArgs e)
{
    // 获取标签中显示的剩余时间
    currentTime = Convert.ToInt32(label2.Text);
    currentTime -= 1;
    label2.Text = Convert.ToString(currentTime);

    if (currentTime == 0)
    {
        timer1.Stop();                // 停止计时
        System.Media.SystemSounds.Asterisk.Play(); // 播放系统提示音
        MessageBox.Show("时间到!", "提示", 
            MessageBoxButtons.OK, 
            MessageBoxIcon.Information);
    }
}

第4步:主观题判分机制

原理:利用 foreach 遍历 GroupBox 容器内的所有控件,检查 RadioButton 的选中状态及其文本内容是否匹配预设答案标识(如 “✔”)。

// 提交答卷按钮逻辑
private void button1_Click(object sender, EventArgs e)
{
    // 对所有题目组进行批阅
    Check(groupBox1, "✔");
    Check(groupBox2, "✔");
    Check(groupBox3, "✔");
    Check(groupBox4, "✔");
    Check(groupBox5, "✔");

    // 禁用所有选项防止篡改
    DisableAllRadioButtons(); 

    // 更新得分显示
    label6.Text = "答对题数: " + num;
    label7.Text = "总分: " + (num * 20).ToString(); // 假设每题20分

    this.timer1.Stop();           // 停止计时器
    button2.Visible = true;       // 显示重做/查看结果按钮
}

// 批阅单个题组的通用方法
public void Check(GroupBox s, String db)
{
    foreach(Control D in s.Controls)
    {
        // 仅处理 RadioButton 控件
        if (D is RadioButton rb)
        {
            // 判断是否被选中且为首字母匹配正确答案
            if (rb.Checked && rb.Text.Substring(0, 1) == db)
            {
                num++;
            }
        }
    }
}

private void DisableAllRadioButtons()
{
    // 此处应遍历所有 groupBox 禁用相关控件
    // 为节省篇幅,省略具体每个 radioButton 的 .Enabled = false 代码
    a.Enabled = b.Enabled = false;
    // ...其他控件同理
}

第5步:重置答题环境

场景:用户点击“重新开始”或完成上一轮后,清空勾选状态并恢复计时器。

public void Clean(GroupBox s)
{
    foreach(Control D in s.Controls)
    {
        if (D is RadioButton rb && rb.Checked)
        {
            rb.Checked = false; // 清除选中状态
        }
    }
}

private void button2_Click(object sender, EventArgs e)
{
    // 重置时间与分数显示
    label2.Text = "20";
    label6.Text = "0";
    label7.Text = "0";
    
    // 重新启动计时器
    timer1.Start();
    timer1.Interval = 1000;
    
    // 清理所有题目的选择状态
    Clean(groupBox1);
    Clean(groupBox2);
    Clean(groupBox3);
    Clean(groupBox4);
    Clean(groupBox5);

    // 重新激活选项输入
    EnableAllRadioButtons();
    button2.Visible = false;
    num = 0;
}

应用图标配置

为了使生成的 .exe 程序更具专业性,建议修改项目属性中的图标设置。可在 Visual Studio 项目属性面板中找到 “应用程序” 选项卡,指定 .ico 格式的图标文件。

在发布前确认图标资源已嵌入,避免运行程序时显示默认齿轮图标。

以上就是基于 C# 制作简易考试答题系统的详细内容,更多关于 C# 窗口程序开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表