C#:办公用品管理软件项目总结

本学期.net课的课程设计是做一个办公用品管理的软件,课堂上只给了五次课十个小时,由于老师给的需求文档也不是太全面,基本上是课下写,遇到问题上课再问老师,功能不对的地方再改。这个软件本身功能不复杂,毕竟是学校的作业而不是公司的产品,除去界面部分剩下的就是对数据库的操作。database里的表是老师建好的,总共也才四个表,不过老师建表时相关联的表并没有设置外键,主键也没有设成自增的,所以在增加和删除操作时,总是感觉很别扭,删除的时候不能级联删除,要一个一个表依次删除,费时费力,还好只有四个表。这种情况到公司肯定不会有的。

这篇文章就是想把我写这个小软件的过程再捋一捋,把过程中遇到的一些问题,学到的一些知识记录下来,以便以后需要时方便查看。

界面

主界面:
这里写图片描述

菜单栏的各个子目录:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

这是法语版的界面,介绍一下:

  • Fichier:File 文件
  • Article:物品
  • Marque:品牌
  • Famille:种类
  • Sous-Famille:子种类
  • Sélectionner:选择
  • Afficher:显示
  • Ajouter:添加
  • Modifier:修改
  • Supprimer:删除

    点击“选择”按钮,弹出“数据整合对话框”,如下:
    这里写图片描述

    左上方的按钮点击之后弹出一个文件选择对话框,可以选择一个XML文件,所有的数据都是以XML文件格式保存。右上方的单选框是确定数据的整合方式:上方的选择是将数据库里原有的数据全部删除,将新的XML文件的数据存进数据库;下方的选择是更新数据库。点击“Integration”按钮开始读数据,如果遇到什么异常和错误,显示在Exception窗口里,数据读完该窗口自动消失。

读数据

为了从数据库读数据,我首先创建了一个物品的实体类Article_Model,它有六个属性,分别对应XML文件中的六个属性,下图是XML文件中数据的格式:
这里写图片描述

接着创建专门读取XML文件数据的类:XML_Read,该类只有一个方法:

public List<Article_Model> Read_XML(string FileName) {
    XmlDocument Doc = new XmlDocument();
    Doc.Load(FileName);

    XmlElement RootElem = Doc.DocumentElement;//root element
    XmlNodeList ArticleNodes = RootElem.GetElementsByTagName("article");//all articles

    List<Article_Model> Atl_Model_List = new List<Article_Model>();

    //get datas
    foreach (XmlNode Node in ArticleNodes) {
        XmlNodeList Childs = Node.ChildNodes;
        string Description = Childs.Item(0).InnerText;
        string RefArticle = Childs.Item(1).InnerText;
        string Marque = Childs.Item(2).InnerText;
        string Famille = Childs.Item(3).InnerText;
        string SousFamille = Childs.Item(4).InnerText;
        string StrPrixHT = Childs.Item(5).InnerText;
        string[] Str = StrPrixHT.Split(new char[] { ','});
        string TempPrix = Str[0] + "." + Str[1];
        float PrixHT = float.Parse(TempPrix);

        Article_Model AM = new Article_Model(Description, RefArticle, Marque,
            Famille, SousFamille, PrixHT);
        Atl_Model_List.Add(AM);
    }
    return Atl_Model_List;    
}

由于数据里商品价格一栏的数据小数点是逗号(老师你为什么要用逗号!!!!),所有又做了一次转换,将该值转成float类型。

打开文件选择对话框是时,由于只能选XML格式的文件,所以我加了一个过滤器:

OpenFileDialog Ofd = new OpenFileDialog();
Ofd.Filter = "xml files(*.xml)|*.xml";
Ofd.ShowDialog();


当把数据从XML文件存到List里再往数据库存时,有一个问题就是,数据可能重复。比如XML文件里有50条商品目录,但是它们可能属于30个不同的品牌,也就是说品牌,种类,子种类有可能有重复的,而且这些表的主键还不是自增的,这就需要在往数据库插数据之前先检查数据库中是否存在该数据,不存在则插入。因为要求用MVC模式,所以我把对数据库的操作的函数全封装到了一个类里:DB_Controller。以Marques表为例,解决方法:

DB_Controller DataBase = new DB_Controller();
//insert data to table Marques
if (DataBase.SelectMarquesTable(ArtModelList[i].marque) == -1)
{
    DataBase.InsertMarquesTable(MarqueId++, ArtModelList[i].marque);
}

查询函数和插入函数如下:

public void InsertMarquesTable(int RefMarque,string Nom)
 {
     SQLiteConnection DB_Conn = new SQLiteConnection("Data Source=Mercure.SQLite;");
     DB_Conn.Open();
     string Sql = "INSERT INTO Marques (RefMarque,Nom) VALUES (" + RefMarque +
         ",'" + Nom + "')";
     SQLiteCommand Command = new SQLiteCommand(Sql, DB_Conn);
     Command.ExecuteNonQuery();

     DB_Conn.Close();
 }

 public int SelectMarquesTable(string Nom) {
     SQLiteConnection DB_Conn = new SQLiteConnection("Data Source=Mercure.SQLite;");
     DB_Conn.Open();
     string Sql = "SELECT RefMarque FROM Marques WHERE Nom = '" + Nom +"'";
     SQLiteCommand Command = new SQLiteCommand(Sql, DB_Conn);

     SQLiteDataReader Date = Command.ExecuteReader();
     int I = -1;
     if (Date.Read())
     {
         I = int.Parse(Date["RefMarque"].ToString());
     }
     else
     {
         I = -1;
     }
     Date.Close();
     DB_Conn.Close();
     return I;
 }


数据库里一共有四张表,Articles,Marques,Familles,SousFamilles.示例图:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

读完数据之后,点击“显示”按钮,便可把全部商品的信息显示出来,这需要四个表联合查询,用ListView控件显示信息。效果如下图:
这里写图片描述

数据的增删改

对三个小表:Marques,Familles,SousFamilles的增加操作很简单,点击“添加”按钮,直接弹出一个对话框,用户输入名字即可。添加SousFamille时,用户要选择一个已经存在的Famille,所以在添加窗口上Famille用下拉列表ComboBox显示以供用户选择。对Articles的增加操作,也是一个窗口,窗口上的Marque,SousFamille也是用下拉列表ComboBox显示以供用户选择。

修改和删除三个小表:Marques,Familles,SousFamilles的数据时,相应的Articles表里的内容也要更新,并且显示窗口里的数据也要实时更新。

以Marques表为例,修改和删除函数:

public void UpdateMarquesTable(string DeNom,string Nom)
{
     SQLiteConnection DB_Conn = new SQLiteConnection("Data Source=Mercure.SQLite;");
     DB_Conn.Open();
     string Sql = "UPDATE Marques SET Nom = '" + Nom + "' WHERE Nom = '" + DeNom + "'";
     SQLiteCommand Command = new SQLiteCommand(Sql, DB_Conn);
     Command.ExecuteNonQuery();

     DB_Conn.Close();
 }

 public void DeleteMarqueByName(string Nom)
 {
     SQLiteConnection DB_Conn = new SQLiteConnection("Data Source=Mercure.SQLite;");
     DB_Conn.Open();
     string Sql = "DELETE FROM Marques WHERE Nom = '" + Nom + "'";
     SQLiteCommand Command = new SQLiteCommand(Sql, DB_Conn);
     Command.ExecuteNonQuery();

     DB_Conn.Close();
 }


总结

总的来说,这个课程设计并不难,界面的话在VS2015里拖拽一下就画好了,数据的话主要还是操作数据库,只要控制好各个功能之间的逻辑问题,一切自然而然就成了。这是我第一次用C#,感觉和C++,java没多大区别,可能是接触的不深。不过计算机语言是相通的,认真掌握了一门,其他的也就好上手了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值