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

时间:2022-03-16 20:43:13

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

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

界面

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

菜单栏的各个子目录:
C#:办公用品管理软件项目总结
C#:办公用品管理软件项目总结
C#:办公用品管理软件项目总结
C#:办公用品管理软件项目总结
C#:办公用品管理软件项目总结

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

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

    点击“选择”按钮,弹出“数据整合对话框”,如下:
    C#:办公用品管理软件项目总结

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

读数据

为了从数据库读数据,我首先创建了一个物品的实体类Article_Model,它有六个属性,分别对应XML文件中的六个属性,下图是XML文件中数据的格式:
C#:办公用品管理软件项目总结

接着创建专门读取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.示例图:
C#:办公用品管理软件项目总结
C#:办公用品管理软件项目总结
C#:办公用品管理软件项目总结
C#:办公用品管理软件项目总结

读完数据之后,点击“显示”按钮,便可把全部商品的信息显示出来,这需要四个表联合查询,用ListView控件显示信息。效果如下图:
C#:办公用品管理软件项目总结

数据的增删改

对三个小表: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没多大区别,可能是接触的不深。不过计算机语言是相通的,认真掌握了一门,其他的也就好上手了。