程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#:辦公用品管理軟件項目總結

C#:辦公用品管理軟件項目總結

編輯:C#入門知識

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 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 Atl_Model_List = new List();

    //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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved