【Windows Form 实战】学生成绩管理系统(五) 学生模块设计

学生Form

1、界面设计

很简单,就是3个表格,分别显示个人信息、各科目成绩、可选课程。
一个TabControl容器里加了3个tabPage,中间那个黑框是DataGridView,每个tabPage各有一个DataGridView。设置TabControl的Dock属性为Fill,就会自动充满窗口。由于显示的内容不多,窗口和DataGridView的大小自己调整。

DataGridView设置如下:

2、frmStudent.cs

using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data;

namespace SSMS
{
    public partial class frmStudent : Form
    {
        frmLogin myLoginForm;
        public frmStudent(frmLogin afrmLogin = null)
        {
            myLoginForm = afrmLogin;
            InitializeComponent();
        }

        private void frmStudent_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (myLoginForm != null)
            {
                myLoginForm.Close();
            }
        }

        private void frmStudent_Load(object sender, System.EventArgs e)
        {
            string sqlStrPersonalInfo = @"select * from {0} where {1}='{2}'";
            sqlStrPersonalInfo = string.Format(sqlStrPersonalInfo, Data.t_student, Data.c_student_snum, Data.loginID);

            string sqlStrScore = @"select * from {0} where {1}='{2}'";
            sqlStrScore = string.Format(sqlStrScore, Data.t_sc, Data.c_sc_snum, Data.loginID);

            SqlDataAdapter sda = new SqlDataAdapter(sqlStrPersonalInfo,Data.connectionString);
            DataSet ds = new DataSet();
            sda.Fill(ds, "table1");

            sda = new SqlDataAdapter(sqlStrScore,Data.connectionString);
            sda.Fill(ds, "table2");

            dataGridView1.DataSource = ds.Tables["table1"];
            dataGridView2.DataSource = ds.Tables["table2"];
        }
    }
}

SqlDataAdapter: using System.Data.SqlClient;
DataSet: using System.Data;
给frmStudent绑定frmStudent_Load事件,这个事件是在窗口加载的时候做的事情。此后事件绑定操作无需再叙述,相信大家都已经掌握了:

运行一下,用一个学生的账号密码登录一下,101吧,先看看显示效果:

看起来不错,但是我们想把个人信息表格的列名显示成学号,姓名,班级,而且个人成绩只想显示课程名称和成绩。这就涉及到了多表查询了,需要有一定的数据库SQL知识基础。修改如下:

private void frmStudent_Load(object sender, System.EventArgs e)
{
    string sqlStrPersonalInfo = @"select * from {0} where {1}='{2}'";
    sqlStrPersonalInfo = string.Format(sqlStrPersonalInfo, Data.t_student, Data.c_student_snum, Data.loginID);

    string sc_cnum = Data.t_sc + "." + Data.c_sc_cnum;
    string course_cnum = Data.t_course + "." + Data.c_course_cnum;

    string sqlStrScore = @"select {0},{1} from {2},{3} where {4}='{5}' and {6}={7}";
    sqlStrScore = string.Format(sqlStrScore,
        Data.c_course_cname, Data.c_sc_score,
        Data.t_sc, Data.t_course,
        Data.c_sc_snum, Data.loginID,
        sc_cnum, course_cnum
        );


    SqlDataAdapter sda = new SqlDataAdapter(sqlStrPersonalInfo,Data.connectionString);
    DataSet ds = new DataSet();
    sda.Fill(ds, "table1");

    sda = new SqlDataAdapter(sqlStrScore,Data.connectionString);
    sda.Fill(ds, "table2");

    dataGridView1.DataSource = ds.Tables["table1"];
    dataGridView2.DataSource = ds.Tables["table2"];

    dataGridView1.Columns[Data.c_student_snum].HeaderText = "学号";
    dataGridView1.Columns[Data.c_student_sname].HeaderText = "姓名";
    dataGridView1.Columns[Data.c_student_sclass].HeaderText = "班级";

    dataGridView2.Columns[Data.c_course_cname].HeaderText = "课程名称";
    dataGridView2.Columns[Data.c_sc_score].HeaderText = "分数";

}

显示如下:

似乎好了,但是新的问题又来了,个人成绩这个表格由于少了一列又显示不太美观了,别担心,办法总是有的:

1、Data.cs中columnAutoAdapter函数就是解决这个问题的

/// <summary>
/// 自动调整列宽,以适应表格大小
/// </summary>
/// <param name="dv">需要被调整的DataGridView对象</param>
public static void columnAutoAdapter(DataGridView dv)
{
    int totalWidth = 0;
    for (int i = 0; i < dv.Columns.Count; i++)
    {
        totalWidth += dv.Columns[i].Width;//记录整个DataGridView的宽度
    }
    for (int i = 0; i < dv.Columns.Count; i++)
    {
        dv.Columns[i].FillWeight = (dv.Columns[i].Width * 100) / totalWidth;
    }
    dv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}

2、frmStudent.cs加两句方法调用:

private void frmStudent_Load(object sender, System.EventArgs e)
{
    ...

    dataGridView2.Columns[Data.c_course_cname].HeaderText = "课程名称";
    dataGridView2.Columns[Data.c_sc_score].HeaderText = "分数";

    Data.columnAutoAdapter(dataGridView1);
    Data.columnAutoAdapter(dataGridView2);
}

再看看效果,虽然不是很完美,但比之前的好多了,不是吗。

最终代码

using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data;
using System.Collections;

namespace SSMS
{
    public partial class frmStudent : Form
    {
        frmLogin myLoginForm;
        const int CASEINFO = 1, CASESCORE = 2, CASEENROLL = 3;
        DataTable dtInfo, dtScore, dtEnroll;
        ArrayList selectAll;
        public frmStudent(frmLogin afrmLogin = null)
        {
            myLoginForm = afrmLogin;
            InitializeComponent();
        }

        private void frmStudent_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (myLoginForm != null)
            {
                myLoginForm.Close();
            }
        }

        void freshTable(int cas)
        {
            string selectStr = (string)selectAll[cas];
            switch (cas)
            {
                case CASEINFO:
                    dtInfo.Clear();
                    Data.fillDataTable(selectStr, dtInfo);
                    dgvInfo.DataSource = dtInfo;
                    dgvInfo.Columns[Data.c_student_snum].HeaderText = "学号";
                    dgvInfo.Columns[Data.c_student_sname].HeaderText = "姓名";
                    dgvInfo.Columns[Data.c_student_sclass].HeaderText = "班级";
                    Data.columnAutoAdapter(dgvInfo);
                    break;
                case CASESCORE:
                    dtScore.Clear();
                    Data.fillDataTable(selectStr, dtScore);
                    dgvScore.DataSource = dtScore;
                    dgvScore.Columns[Data.c_course_cname].HeaderText = "课程名称";
                    dgvScore.Columns[Data.c_sc_score].HeaderText = "分数";
                    Data.columnAutoAdapter(dgvScore);
                    break;
                case CASEENROLL:
                    dtEnroll.Clear();
                    Data.fillDataTable(selectStr, dtEnroll);
                    dgvEnroll.DataSource = dtEnroll;
                    for (int i = 1; i < dgvEnroll.Columns.Count; ++i)
                    {
                        dgvEnroll.Columns[i].ReadOnly = true;
                    }
                    Data.columnAutoAdapter(dgvEnroll);
                    break;

                default: break;
            }
        }

        private void frmStudent_Load(object sender, System.EventArgs e)
        {

            dtInfo = new DataTable();
            dtScore = new DataTable();
            dtEnroll = new DataTable();

            string sqlStrPersonalInfo = @"select * from {0} where {1}='{2}'";
            sqlStrPersonalInfo = string.Format(sqlStrPersonalInfo, Data.t_student, Data.c_student_snum, Data.loginID);

            string sc_cnum = Data.t_sc + "." + Data.c_sc_cnum;
            string course_cnum = Data.t_course + "." + Data.c_course_cnum;

            string sqlStrSelectedCourse = @"select {0},{1} from {2},{3} where {4}='{5}' and {6}={7}";
            sqlStrSelectedCourse = string.Format(sqlStrSelectedCourse,
                Data.c_course_cname, Data.c_sc_score,
                Data.t_sc, Data.t_course,
                Data.c_sc_snum, Data.loginID,
                sc_cnum, course_cnum
                );

            string sqlStrToBeSelectedCourse = @"select * from {0} B where B.{1} not in ( select A.{2} from {3} A where A.{4} = '{5}' )";
            sqlStrToBeSelectedCourse = string.Format(sqlStrToBeSelectedCourse, Data.t_course, Data.c_course_cnum, Data.c_sc_cnum, Data.t_sc, Data.c_sc_snum, Data.loginID);

            selectAll = new ArrayList();
            selectAll.Add("");
            selectAll.Add(sqlStrPersonalInfo);
            selectAll.Add(sqlStrSelectedCourse);
            selectAll.Add(sqlStrToBeSelectedCourse);


            freshTable(CASEINFO);
            freshTable(CASESCORE);


            string sqlStr = @"select * from {0}";
            sqlStr = string.Format(sqlStr, Data.t_enroll);

            DataTable dt = new DataTable();
            Data.fillDataTable(sqlStr, dt);

            if (dt.Rows[0][0].ToString().Equals("True"))
            {
                DataGridViewCheckBoxColumn dc = new DataGridViewCheckBoxColumn();
                dc.Name = "colSelect";
                dgvEnroll.Columns.Add(dc);
                freshTable(CASEENROLL);
            }
            else
            {
                tabControl1.TabPages.Remove(tabPage3);
            }

        }

        private void btnAdd_Click(object sender, System.EventArgs e)
        {

            for (int i = 0; i < dgvEnroll.Rows.Count; ++i)
            {
                if (dgvEnroll.Rows[i].Cells["colSelect"].EditedFormattedValue.ToString() == "True")
                {
                    string sqlStr = @"insert into {0} values('{1}', '{2}', NULL)";
                    sqlStr = string.Format(sqlStr, Data.t_sc, Data.loginID, dgvEnroll.Rows[i].Cells[Data.c_sc_cnum].Value.ToString());

                    SqlConnection con = new SqlConnection(Data.connectionString);
                    con.Open();
                    SqlCommand cmd = new SqlCommand(sqlStr, con);
                    cmd.ExecuteNonQuery();
                    con.Close();
                    MessageBox.Show("选课成功!");
                }
            }
        }

        private void button2_Click(object sender, System.EventArgs e)
        {
            freshTable(CASEENROLL);
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            freshTable(CASESCORE);
        }
    }
}

源代码文件下载地址

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 读取保存App.config配置文件的完整源码参考(转) http://smartsoft.5d6d.com/thread-6550-1-1.html C# 读取保存App.config配置文件的完整源码参考 最近出差在北京做一个小项目,项目里需要读取配置文件的小功能,觉得挺有参考意义的就把代码发上来给大家参考一下。我们选择了直接用微软的读取配置文件的方法。 这个是程序的运行设计效果,就是把这些参数可以进行灵活设置,灵活保存设置状态。 程序编译后自动会产生相应的配置文件,是跟项目的名称一样的配置文件。 读取配置文件及保存配置的具体代码参考如下,希望能给你节省一些时间,直接复制粘贴这个代码就可以用了: //------------------------------------------------------------ // All Rights Reserved , Copyright (C) 2010 , CDPF , Ltd. //------------------------------------------------------------ using System; using System.Configuration; using System.Windows.Forms; using Utilities; namespace DirectSeeding { /// /// FrmConfig /// 读取配置文件 /// /// 修改纪录 /// /// 2011.01.14 版本: 1.0 JiRiGaLa 完善程序的注释等、从新整理代码。 /// /// 版本:1.0 /// /// /// JiRiGaLa /// 2011.01.14 /// /// public partial class FrmConfig : Form { public FrmConfig() { InitializeComponent(); } /// /// 读取配置文件 /// private void GetConfig() { this.txtWriteFileName.Text = ConfigurationManager.AppSettings["WriteFileName"]; this.txtWritePath.Text = ConfigurationManager.AppSettings["WritePath"].Replace("|", Environment.NewLine); this.txtPostMessageURL.Text = ConfigurationManager.AppSettings["PostMessageURL"]; this.txtLeasedLineURL.Text = ConfigurationManager.AppSettings["LeasedLineURL"]; } private void FrmDirectSeeding_Load(object sender, EventArgs e) { this.GetConfig(); } /// /// 保存配置文件 /// private void SaveConfig() { // 写入参数设置 Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); configuration.AppSettings.Settings["WriteFileName"].Value = this.txtWriteFileName.Text; configuration.AppSettings.Settings["Wri
为实现用户需求,从需求分析阶段的数据流图出发,根据小组讨论后确定的最佳方案。本系统主要包括两大功能模块学生信息和成绩信息两个系统。其中学生信息系统划分为七个模块学生成绩划分为四个模块。然后在需求分析阶段所确定的系统数据需求的基础上,进一步设计数据结构。在测试过程中,先对单个模块进行测试,然后把模块连接起来进行测试。测试完成后书写文档,最后小组成员和用户在一块审查和复审。 1、 课题陈述 一方面,在时下这个飞速发展的信息社会中,直到今天仍然没有一套完善可行的学生信息管理系统出现在学校里。每年,从大专生、本科生到硕士生、博士生,几千人的入学、升学、毕业,全要由教务处和各系老师人工管理。信息量之巨大,工作量之繁重,是难以想象的。因此,学校和各个系都要安排多名教师专门负责学生学籍管理,浪费了大量的人力资源。然而,即使这样,管理仍然谈不上井井有条。举一个最简单的真实例子,一个同学的姓名在花名册里印错了,就一错错了三年,一直没能改正。同学想去改,却不知道是应该找系里,还是去找教务处。还有,当学生的基本信息,比如家庭住址、电话等变更后,无法及时在档案中修改,使得老师与同学无法联系沟通。 另一方面,从社会这方面讲,随着计算机的普及,越来越多的学校利用计算机来处理日常事务。面对众多的数据资料,很多管理者常常感到无从下手。在数字化的今天,我们需要一个学生管理系统,使我们的整体管理水平上一个档次,与如今这个高科技的信息社会接轨。 因此,如何有效的管理学生信息,帮助学校和老师管理和掌握这些情况,这就是学生信息管理系统需要完成的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值