学委助手是面向班级学习委员的实用工具,核心目标是简化学生信息管理、作业统计、考勤记录等日常事务。使用C#开发这类工具,可依托.NET框架的丰富类库快速搭建功能,同时借助WinForms实现直观的可视化交互界面。

核心功能需求梳理
学委助手需要覆盖学委的日常工作场景,核心功能可分为以下几类:
- 学生信息管理:支持添加、修改、删除学生基本信息,包括学号、姓名、专业、联系方式等
- 作业管理:记录每次作业的发布时间、截止时间,统计各学生的提交状态
- 考勤管理:记录学生的出勤、迟到、早退、请假状态,支持按日期查询
- 数据导出:将统计结果导出为Excel或CSV格式,方便学委上报数据
开发环境准备
开发前需要准备以下环境:
- Visual Studio 2019及以上版本,安装.NET桌面开发工作负载
- SQLite数据库,用于轻量级本地数据存储
- EPPlus库,用于Excel文件导出操作,可通过NuGet包管理器安装
数据库设计
使用SQLite存储数据,需要设计三张核心表:
| 表名 | 字段说明 |
|---|---|
| Student | Id(主键)、StudentNo(学号)、Name(姓名)、Major(专业)、Phone(联系方式) |
| Homework | Id(主键)、Title(作业标题)、PublishTime(发布时间)、Deadline(截止时间) |
| Attendance | Id(主键)、StudentId(学生Id)、Date(考勤日期)、Status(出勤状态) |
创建数据库的代码如下:
using System.Data.SQLite;
public class DatabaseHelper
{
private string connectionString = "Data Source=student_helper.db;Version=3;";
// 初始化数据库,创建表
public void InitDatabase()
{
using (SQLiteConnection conn = new SQLiteConnection(connectionString))
{
conn.Open();
string createStudentTable = @"
CREATE TABLE IF NOT EXISTS Student (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
StudentNo TEXT NOT NULL UNIQUE,
Name TEXT NOT NULL,
Major TEXT,
Phone TEXT
)";
string createHomeworkTable = @"
CREATE TABLE IF NOT EXISTS Homework (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
Title TEXT NOT NULL,
PublishTime TEXT NOT NULL,
Deadline TEXT NOT NULL
)";
string createAttendanceTable = @"
CREATE TABLE IF NOT EXISTS Attendance (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
StudentId INTEGER NOT NULL,
Date TEXT NOT NULL,
Status TEXT NOT NULL,
FOREIGN KEY(StudentId) REFERENCES Student(Id)
)";
using (SQLiteCommand cmd = new SQLiteCommand(createStudentTable, conn))
{
cmd.ExecuteNonQuery();
}
using (SQLiteCommand cmd = new SQLiteCommand(createHomeworkTable, conn))
{
cmd.ExecuteNonQuery();
}
using (SQLiteCommand cmd = new SQLiteCommand(createAttendanceTable, conn))
{
cmd.ExecuteNonQuery();
}
}
}
}
学生信息管理模块实现
界面设计
在WinForms窗体中添加DataGridView控件用于展示学生列表,添加TextBox、Button控件用于输入和提交操作,界面布局可通过拖拽控件快速完成。
添加学生功能代码
private void btnAddStudent_Click(object sender, EventArgs e)
{
string studentNo = txtStudentNo.Text.Trim();
string name = txtName.Text.Trim();
string major = txtMajor.Text.Trim();
string phone = txtPhone.Text.Trim();
// 基础校验
if (string.IsNullOrEmpty(studentNo) || string.IsNullOrEmpty(name))
{
MessageBox.Show("学号和姓名不能为空");
return;
}
using (SQLiteConnection conn = new SQLiteConnection(connectionString))
{
conn.Open();
string insertSql = "INSERT INTO Student (StudentNo, Name, Major, Phone) VALUES (@StudentNo, @Name, @Major, @Phone)";
using (SQLiteCommand cmd = new SQLiteCommand(insertSql, conn))
{
cmd.Parameters.AddWithValue("@StudentNo", studentNo);
cmd.Parameters.AddWithValue("@Name", name);
cmd.Parameters.AddWithValue("@Major", major);
cmd.Parameters.AddWithValue("@Phone", phone);
try
{
cmd.ExecuteNonQuery();
MessageBox.Show("学生信息添加成功");
LoadStudentData(); // 刷新列表
ClearStudentInput(); // 清空输入框
}
catch (SQLiteException ex)
{
MessageBox.Show("添加失败,学号可能已存在:" + ex.Message);
}
}
}
}
// 加载学生数据到DataGridView
private void LoadStudentData()
{
using (SQLiteConnection conn = new SQLiteConnection(connectionString))
{
conn.Open();
string querySql = "SELECT * FROM Student";
using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(querySql, conn))
{
DataTable dt = new DataTable();
adapter.Fill(dt);
dgvStudent.DataSource = dt;
}
}
}
作业提交统计模块实现
作业统计需要关联学生和作业记录,核心逻辑是记录每个学生对应作业的提交状态,以下为提交状态更新的代码示例:
// 更新作业提交状态
public void UpdateHomeworkStatus(int studentId, int homeworkId, string status)
{
using (SQLiteConnection conn = new SQLiteConnection(connectionString))
{
conn.Open();
// 先查询是否已存在记录
string checkSql = "SELECT COUNT(*) FROM HomeworkSubmit WHERE StudentId = @StudentId AND HomeworkId = @HomeworkId";
using (SQLiteCommand checkCmd = new SQLiteCommand(checkSql, conn))
{
checkCmd.Parameters.AddWithValue("@StudentId", studentId);
checkCmd.Parameters.AddWithValue("@HomeworkId", homeworkId);
int count = Convert.ToInt32(checkCmd.ExecuteScalar());
if (count > 0)
{
// 更新已有记录
string updateSql = "UPDATE HomeworkSubmit SET Status = @Status WHERE StudentId = @StudentId AND HomeworkId = @HomeworkId";
using (SQLiteCommand updateCmd = new SQLiteCommand(updateSql, conn))
{
updateCmd.Parameters.AddWithValue("@Status", status);
updateCmd.Parameters.AddWithValue("@StudentId", studentId);
updateCmd.Parameters.AddWithValue("@HomeworkId", homeworkId);
updateCmd.ExecuteNonQuery();
}
}
else
{
// 插入新记录
string insertSql = "INSERT INTO HomeworkSubmit (StudentId, HomeworkId, Status) VALUES (@StudentId, @HomeworkId, @Status)";
using (SQLiteCommand insertCmd = new SQLiteCommand(insertSql, conn))
{
insertCmd.Parameters.AddWithValue("@StudentId", studentId);
insertCmd.Parameters.AddWithValue("@HomeworkId", homeworkId);
insertCmd.Parameters.AddWithValue("@Status", status);
insertCmd.ExecuteNonQuery();
}
}
}
}
}
数据导出功能实现
使用EPPlus库将考勤或作业统计数据导出为Excel文件,以下为导出学生考勤记录的代码示例:
using OfficeOpenXml;
private void btnExportAttendance_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Excel文件|*.xlsx";
saveFileDialog.Title = "导出考勤记录";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string filePath = saveFileDialog.FileName;
using (ExcelPackage package = new ExcelPackage())
{
ExcelWorksheet worksheet = package.Worksheets.Add("考勤记录");
// 设置表头
worksheet.Cells[1, 1].Value = "学号";
worksheet.Cells[1, 2].Value = "姓名";
worksheet.Cells[1, 3].Value = "考勤日期";
worksheet.Cells[1, 4].Value = "出勤状态";
// 查询数据
using (SQLiteConnection conn = new SQLiteConnection(connectionString))
{
conn.Open();
string querySql = @"
SELECT s.StudentNo, s.Name, a.Date, a.Status
FROM Attendance a
JOIN Student s ON a.StudentId = s.Id
ORDER BY a.Date DESC";
using (SQLiteCommand cmd = new SQLiteCommand(querySql, conn))
{
using (SQLiteDataReader reader = cmd.ExecuteReader())
{
int row = 2;
while (reader.Read())
{
worksheet.Cells[row, 1].Value = reader["StudentNo"].ToString();
worksheet.Cells[row, 2].Value = reader["Name"].ToString();
worksheet.Cells[row, 3].Value = reader["Date"].ToString();
worksheet.Cells[row, 4].Value = reader["Status"].ToString();
row++;
}
}
}
}
// 保存文件
FileInfo fileInfo = new FileInfo(filePath);
package.SaveAs(fileInfo);
MessageBox.Show("考勤记录导出成功");
}
}
}
总结
以上是用C#编写学委助手的核心实现思路与代码示例,实际开发中还可以根据需求扩展更多功能,比如添加用户登录、数据备份、作业提醒等。整体开发过程遵循界面与逻辑分离的原则,数据库操作封装为独立类,便于后续维护和功能迭代。对于C#初学者来说,这类工具开发是练习WinForms、数据库操作、文件处理等基础技能的良好实践场景。