版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 2012-2013學(xué)年第一學(xué)期</p><p><b> 課 程 設(shè) 計</b></p><p> 項目類別:C#程序設(shè)計II課程設(shè)計</p><p> 設(shè)計題目:物流配送管理系統(tǒng)</p><p> 班 級 :</p><p> 組長學(xué)號 :</p><
2、;p> 組長姓名 :</p><p> 校內(nèi)教師:</p><p> 企業(yè)教師:</p><p> 設(shè)計日期: 2012年12月 17 日——2012年12月 28日</p><p><b> 一、設(shè)計目標(biāo)</b></p><p> “C#程序設(shè)計II”課程設(shè)計是在系統(tǒng)的學(xué)習(xí)了《C#程序
3、設(shè)計II》課程后,綜合運用所學(xué)的知識,設(shè)計開發(fā)一個小型基于C/S模式物流配送管理系統(tǒng)。它的主要功能有:區(qū)域信息管理、顧客信息管理以及物流配送信息管理和信息查詢四大功能。通過這一具體問題的分析、設(shè)計與實現(xiàn),將理論與應(yīng)用相結(jié)合,學(xué)會如何把書本上學(xué)到的知識用于解決實際問題,培養(yǎng)動手能力。</p><p><b> 二、任務(wù)描述</b></p><p><b>
4、?。ㄒ唬┤龑蛹軜?gòu)模式</b></p><p> 三層架構(gòu)模式是有表現(xiàn)層、業(yè)務(wù)邏輯層,數(shù)據(jù)層組成的。</p><p> 表現(xiàn)層:根據(jù)需求進行界面設(shè)計,并完成基本交互代碼,能夠?qū)崿F(xiàn)將代碼提交給業(yè)務(wù)邏輯層。</p><p> 業(yè)務(wù)邏輯層:將表現(xiàn)層的數(shù)據(jù)解析成數(shù)據(jù)層的數(shù)據(jù)模型,并傳遞給數(shù)據(jù)層。同時接受數(shù)據(jù)層的返回結(jié)果給表現(xiàn)層、</p><
5、;p> 數(shù)據(jù)層:數(shù)據(jù)庫連接、接收業(yè)務(wù)邏輯層傳遞過來的數(shù)據(jù)模型,提交給數(shù)據(jù)庫進行處理,并根據(jù)實際的具體需求建立存儲過程,既數(shù)據(jù)層開發(fā)員不在負責(zé)數(shù)據(jù)庫的整體建立。</p><p><b> (二)四大功能區(qū)域</b></p><p> 物流配送系統(tǒng)一共包括區(qū)域信息管理、顧客信息管理以及物流配送信息管理和信息查詢四大功能,一下就是這四大功能之間關(guān)系的簡圖。并且這
6、四大功能與數(shù)據(jù)相連,實現(xiàn)對數(shù)據(jù)庫的增、刪、改、查操作。</p><p><b> 三、人員分工</b></p><p><b> 四、設(shè)計過程</b></p><p><b> ?。ㄒ唬┰O(shè)計思想</b></p><p> 我們小組們采用三層架構(gòu)模式,使系統(tǒng)的代碼不冗長,也
7、有利于系統(tǒng)的編譯和運行,如果系統(tǒng)出現(xiàn)錯誤就會第一時間知道問題出現(xiàn)在哪里。所以采用三層的架構(gòu)模式,不僅調(diào)理清晰,組員分工明確完成的效率也會提高。以下就是三層架構(gòu)邏輯關(guān)系圖。也是我們小組們設(shè)計設(shè)計系統(tǒng)的思想。</p><p><b> ?。ǘ?shù)據(jù)庫設(shè)計</b></p><p> 根據(jù)物流管理系統(tǒng)的需求分析,可見在功能上分為:區(qū)域信息管理、顧客信息管理、物流配送管理和信
8、息查詢。</p><p><b> 1、數(shù)據(jù)表的建立</b></p><p><b> 區(qū)域信息管理</b></p><p> 根據(jù)需求分析得到區(qū)域信息只需要記錄:區(qū)域和區(qū)域信息的描述即可,所以可以為表TArea建立如下字段:</p><p> 物流配送區(qū)域:TArea</p>
9、<p><b> 顧客信息表</b></p><p><b> TGuest</b></p><p><b> * 配送狀態(tài)表</b></p><p><b> TOrder(</b></p><p><b> 配送時間表&
10、lt;/b></p><p> TGuestOrder</p><p><b> 2、建立視圖 </b></p><p> 根據(jù)顧客表物流配送表檢索物流與顧客的關(guān)系并建立視圖V1。</p><p><b> 3、存儲過程設(shè)計</b></p><p> 為了方便
11、程序處理,我們小組們需要為每個數(shù)據(jù)庫中的表元素添加關(guān)于增、刪、改、查、的存儲過程,例如為區(qū)域增加的存儲過程(其他三個表的存儲過程也依此進行設(shè)計):</p><p><b> 插入</b></p><p> ALTER Proc [dbo].[Insert_Guest]</p><p> @GuestID uniqueidenti
12、fier,</p><p> @GuestName varchar(50),</p><p> @GuestPhone varchar(50),</p><p> @GuestAddress varchar(500),</p><p> @GuestDesc varchar (1000),</p><
13、;p> @AresID uniqueidentifier</p><p><b> As</b></p><p> INSERT INTO [TGuest] ([GuestID],[GuestName],[GuestPhone],[GuestAddress],[GuestDesc],[AresID])</p><p>
14、 VALUES (@GuestID,@GuestName,@GuestPhone,@GuestAddress,@GuestDesc,@AresID) </p><p><b> 修改</b></p><p> ALTER Proc [dbo].[Update_Guest]</p><p> @GuestID uniqueident
15、ifier,</p><p> @GuestName varchar(50),</p><p> @GuestPhone varchar(50),</p><p> @GuestAddress varchar(500),</p><p> @GuestDesc varchar(1000),</p><p>
16、 @AresID uniqueidentifier</p><p><b> As</b></p><p> Update [TGuest] set [GuestName] = @GuestName, [GuestPhone] = @GuestPhone,[GuestAddress]=@GuestAddress,[GuestDesc]=@GuestDesc wh
17、ere [GuestID]=@GuestID</p><p><b> 刪除</b></p><p> ALTER Proc [dbo].[Delete_Guest]</p><p> @GuestID uniqueidentifier</p><p><b> As</b></p&g
18、t;<p> Delete from [TGuest] where [GuestID]=@GuestID</p><p><b> 查詢</b></p><p> ALTER Proc [dbo].[Select_Guest]</p><p> @GuestID uniqueidentifier,</p&g
19、t;<p> @GuestName varchar(50),</p><p> @GuestPhone varchar(50),</p><p> @GuestAddress varchar(500),</p><p> @GuestDesc varchar(1000),</p><p> @AresI
20、D uniqueidentifier</p><p><b> As</b></p><p> select [GuestID], [GuestName], [GuestPhone],[GuestAddress],[GuestDesc],[AresID] from [TGuest] where </p><p> conve
21、rt(varchar(50),[GuestID]) like '%' + convert(varchar(50),@GuestID)+ '%' and</p><p> [GuestName ] like '%' + @GuestName + '%' and</p><p> [GuestPhone ]
22、like '%' + @GuestPhone + '%' and</p><p> [GuestAddress ] like '%' + @GuestAddress + '%' and</p><p> [GuestDesc ] like '%' + @GuestDesc + '
23、;%' and</p><p> convert (varchar(50),[AresID]) like '%' +convert(varchar(50), @AresID)+ '%'</p><p> ?。ㄈ┙?shù)據(jù)模型及代碼實現(xiàn)</p><p> 根據(jù)項目的核心思想,因此需要建立一個類庫項目,項目名稱為“Common
24、Model”,并根據(jù)數(shù)據(jù)庫表中的結(jié)構(gòu)定義類和屬性。盡量保證表名和類名相同,字段名和屬性名相同,字段類型和屬性數(shù)據(jù)類型相同。</p><p> using System;</p><p> using System.Collections.Generic;</p><p> using System.Text;</p><p> nam
25、espace CommonModel</p><p><b> {</b></p><p> public class TGuest</p><p><b> {</b></p><p> private Guid guestID = Guid.Empty;</p><p
26、> private string guestName = "";</p><p> private string guestPhone = "";</p><p> private string guestAddress = "";</p><p> private string guestD
27、esc = "";</p><p> private Guid areaID = Guid.Empty;</p><p> public Guid GuestID { get { return guestID; } set { guestID = value; } }</p><p> public string GuestName { g
28、et { return guestName; } set { guestName = value ; } }</p><p> public string GuestPhone { get { return guestPhone; } set { guestPhone = value; } }</p><p> public string GuestAddress { get { re
29、turn guestAddress; } set { guestAddress = value; } }</p><p> public string GuestDesc { get { return guestDesc; } set { guestDesc = value; } }</p><p> public Guid AreaID { get { return areaID;
30、} set { areaID= value; } }</p><p><b> }</b></p><p><b> }</b></p><p><b> 其他三個表同上</b></p><p> (四)表現(xiàn)層的設(shè)計以及代碼實現(xiàn)</p><p>
31、<b> 1、項目總攬</b></p><p> 表現(xiàn)層開發(fā)員需要了解在項目的關(guān)系:</p><p> CycleManagement項目:是項目運行的界面項目,負責(zé)與用戶交互;</p><p> CycleInterface項目:是負責(zé)與業(yè)務(wù)邏輯層之間協(xié)商的規(guī)范,負責(zé)與業(yè)務(wù)邏輯層進行交互;</p><p>
32、CommonModel項目:是負責(zé)表現(xiàn)層使用數(shù)據(jù)模型;</p><p> 當(dāng)項目開發(fā)時,表現(xiàn)層與業(yè)務(wù)邏輯層之間需要交流的便是CycleInterface項目中BLL文件夾內(nèi)的借口文件;</p><p> 2、主窗口——MainForm</p><p> 在“LogisticsManagement”項目中右擊,選擇“新建項”,在項目列表中選擇“Windows窗體
33、”,名稱為“MainForm.cs”;</p><p> 窗體建立后,設(shè)置窗體屬性:</p><p> MainForm.IsMdiContainer=true</p><p> MainForm.Text= "物流配送管理系統(tǒng)"</p><p> MainForm.StartPosition=CenterScre
34、en</p><p> 在需求分析中,物流配送管理系統(tǒng)的主要功能有:區(qū)域信息管理、顧客信息管理以及物流配送信息管理和信息查詢四大功能,因此可以為主窗體添加一個菜單欄,并設(shè)置如下菜單:</p><p> 單擊“區(qū)域管理”菜單,則調(diào)用窗體“FArea”;</p><p> 單擊“顧客管理”菜單,則調(diào)用窗體“FGuest”;</p><p>
35、 單擊“物流配送管理”菜單,則調(diào)用窗體“FLogistics”;</p><p> 單擊“信息查詢”菜單,則調(diào)用窗體“FSearch”;</p><p> 單擊“退出系統(tǒng)”菜單,則執(zhí)行Application.Exit()退出應(yīng)用程序。</p><p> 因此,為每個菜單編輯類似如下的代碼(假設(shè)FArea窗體已經(jīng)存在)</p><p>
36、 FArea form = new FArea();</p><p> form.MdiParent = this;</p><p> form.StartPosition = FormStartPosition.CenterParent;</p><p> form.WindowState = FormWindowStat
37、e.Maximized;</p><p> form.Show();</p><p> 該窗體由于屬于各個功能窗體的調(diào)用總窗體,因此不需要與業(yè)務(wù)邏輯層進行任何的交互操作。</p><p> 3、區(qū)域管理窗口——FArea</p><p><b> 窗體控件布局</b></p>
38、<p> 根據(jù)需求分析,在區(qū)域管理的功能上,只需要做到增、刪、查即可,不需要為區(qū)域管理添加其他功能,因此可將區(qū)域管理功能的界面設(shè)計如圖所示界面:</p><p><b> 業(yè)務(wù)邏輯的功能統(tǒng)計</b></p><p> 根據(jù)界面的設(shè)計,我們小組們知道該功能需要:</p><p> 查詢出目前所有區(qū)域的信息</p>
39、<p><b> 創(chuàng)建區(qū)域信息</b></p><p><b> 修改區(qū)域信息</b></p><p><b> 刪除區(qū)域信息</b></p><p><b> 操作邏輯</b></p><p> 窗體加載成功后,通過查詢功能將區(qū)域
40、信息加載到內(nèi)存,并在區(qū)域信息的數(shù)據(jù)源列表中的第一個位置新增具有“新建區(qū)域”信息的區(qū)域項目;</p><p> 單擊“創(chuàng)建”按鈕,則調(diào)用業(yè)務(wù)邏輯層的創(chuàng)建方法,并傳遞區(qū)域名和區(qū)域描述兩個文本框的內(nèi)容;</p><p> 單擊“修改”按鈕,則調(diào)用業(yè)務(wù)邏輯層的修改方法,并傳遞區(qū)域編號、區(qū)域名、區(qū)域描述;</p><p> 單擊“刪除”按鈕,則調(diào)用業(yè)務(wù)邏輯層的刪除方法,
41、并傳遞區(qū)域編號;</p><p> 單擊“取消”按鈕,則使區(qū)域信息框隱藏,既Visible=false;</p><p><b> 窗體加載時讀取數(shù)據(jù)</b></p><p> 雙擊窗體標(biāo)題欄,進入代碼編寫界面,并在FArea_Load方法內(nèi)書寫如下代碼:</p><p> IArea bll = new Are
42、aBLL();</p><p> List<TArea> list = bll.GetList();</p><p> TArea empty=new TArea ();</p><p> empty.ID=Guid.Empty;</p><p> empty.Name="新建區(qū)域&
43、quot;;</p><p> empty.Description="";</p><p> list.IndexOf(empty, 0);</p><p> lstAreaList.Items.Clear();</p><p> foreach (TArea tmp in list)&l
44、t;/p><p><b> {</b></p><p> ListViewItem lvi = new ListViewItem(tmp.Name);</p><p> lvi.SubItems.Add(tmp.ID.ToString());</p><p> lvi.SubItems.Add(tmp.Descr
45、iption);</p><p> lvi.ToolTipText = tmp.Name;</p><p> lvi.Tag = tmp;</p><p> lvi.ImageIndex=0;</p><p> lstAreaList.Items.Add(lvi);</p><p&
46、gt;<b> }</b></p><p> 雙擊ListView操作</p><p> 雙擊ListView后,可能引發(fā)的三種情況:</p><p><b> 代碼如下:</b></p><p> if (lstAreaList.SelectedItems.Count != 0)
47、</p><p><b> {</b></p><p> TArea area = (TArea)lstAreaList.SelectedItems[0].Tag;</p><p> txtAreaName.Text = area.Name;</p><p> txtAreaDesc.Text =
48、 area.Description;</p><p> if (area.ID == Guid.Empty)</p><p><b> {</b></p><p> grpAreaInfo.Visible = true;</p><p> btnCreate.Enabled = true;
49、</p><p> btnModify.Enabled = false;</p><p> btnDelete.Enabled = false;</p><p> btnCancel.Enabled = true;</p><p> grpAreaInfo.Tag = area;</p><p
50、> txtAreaName.Text = "";</p><p> txtAreaDesc.Text = "";</p><p><b> }</b></p><p><b> else</b></p><p><b> {</
51、b></p><p> grpAreaInfo.Visible = true;</p><p> btnCreate.Enabled = false;</p><p> btnModify.Enabled = true;</p><p> btnDelete.Enabled = true;</p><p>
52、; btnCancel.Enabled = true;</p><p> grpAreaInfo.Tag = area;</p><p><b> }</b></p><p><b> }</b></p><p><b> 單擊創(chuàng)建</b></p>&l
53、t;p> 單擊創(chuàng)建后,由于需要與數(shù)據(jù)庫進行交互,因此需要通過業(yè)務(wù)邏輯層的方法來創(chuàng)建。在創(chuàng)建之前,需要對數(shù)據(jù)進行簡單的驗證,例如是否為空,數(shù)據(jù)是否合法等:</p><p> if (txtAreaName.Text == "") { MessageBox.Show("區(qū)域名稱不能為空!"); return; }</p><p> IArea
54、 bll = new AreaBLL();</p><p> if (bll.Create(txtAreaName.Text, txtAreaDesc.Text))</p><p><b> {</b></p><p> MessageBox.Show("區(qū)域新建成功!");</p><p>
55、 grpAreaInfo.Visible = false;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> MessageBox.Show("區(qū)域新建失??!")
56、;</p><p><b> }</b></p><p><b> 單擊修改</b></p><p> 單擊修改后,由于需要與數(shù)據(jù)庫進行交互,因此需要通過業(yè)務(wù)邏輯層的方法來修改,在修改之前,需要對數(shù)據(jù)進行簡單的驗證,例如是否為空,數(shù)據(jù)是否有效等:</p><p> if (txtAreaNa
57、me.Text == "") { MessageBox.Show("區(qū)域名稱不能為空!"); return; }</p><p> IArea bll = new AreaBLL();</p><p> if (bll.Modify(((TArea)grpAreaInfo.Tag).ID, txtAreaName.Text, txtAreaDes
58、c.Text))</p><p><b> {</b></p><p> MessageBox.Show("區(qū)域修改成功!");</p><p> grpAreaInfo.Visible = false;</p><p><b> }</b></p><
59、;p><b> else</b></p><p><b> {</b></p><p> MessageBox.Show("區(qū)域修改失??!");</p><p><b> }</b></p><p><b> 單擊刪除</b&
60、gt;</p><p> 單擊刪除與修改相似,只是這里不再需要判斷數(shù)據(jù)是否合法,只需要將ID傳遞給業(yè)務(wù)邏輯層即可:</p><p> if (MessageBox.Show(this, "確定要刪除該區(qū)域么?", "刪除", MessageBoxButtons.OKCancel) == DialogResult.OK)</p>&l
61、t;p><b> {</b></p><p> IArea bll = new AreaBLL();</p><p> if (bll.Delete(((TArea)grpAreaInfo.Tag).ID))</p><p><b> {</b></p><p> MessageBo
62、x.Show("區(qū)域刪除成功!");</p><p> grpAreaInfo.Visible = false;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p>
63、;<p> MessageBox.Show("區(qū)域刪除失?。?quot;);</p><p><b> }</b></p><p><b> }</b></p><p><b> 單擊取消</b></p><p> 單擊取消,只需要將Group
64、Box控件隱藏即可:</p><p> grpAreaInfo.Visible = false;</p><p> 4、顧客管理窗口——FGuest</p><p> 顧客管理窗口的界面與區(qū)域管理相似,同樣應(yīng)用ListView顯示顧客數(shù)據(jù),適用GroupBox收集和顯示顧客信息數(shù)據(jù),可見右圖:</p><p> 在顧客管理窗口的顧客信
65、息GroupBox中,邏輯部分便是“顧客類型”選擇后,應(yīng)使對應(yīng)的Panel處于可用狀態(tài),以及單擊保存時,需要判斷該顧客是需要新建,還是需要保存修改。</p><p><b> 窗體加載</b></p><p> 但在窗體加載過程中,需要為區(qū)域下拉框添加數(shù)據(jù)源:</p><p> IArea area=new AreaBLL ();<
66、/p><p> cmbArea.DataSource = area.GetList();</p><p> cmbArea.DisplayMember = "Name";</p><p> 雙擊ListView項目</p><p> if (lstAreaList.SelectedItems.Count != 0)
67、</p><p><b> {</b></p><p> TArea area = (TArea)lstAreaList.SelectedItems[0].Tag;</p><p> txtAreaName.Text = area.Name;</p><p> txtAreaDesc.Text
68、 = area.Description;</p><p> if (area.ID == Guid.Empty)</p><p><b> {</b></p><p> grpAreaInfo.Visible = true;</p><p> btnCreate.Enabled = true
69、;</p><p> btnModify.Enabled = false;</p><p> btnDelete.Enabled = false;</p><p> btnCancel.Enabled = true;</p><p> grpAreaInfo.Tag = area;</p><
70、;p> txtAreaName.Text = "";</p><p> txtAreaDesc.Text = "";</p><p><b> }</b></p><p><b> else</b></p><p><b> {<
71、;/b></p><p> grpAreaInfo.Visible = true;</p><p> btnCreate.Enabled = false;</p><p> btnModify.Enabled = true;</p><p> btnDelete.Enabled = true;</p><p&
72、gt; btnCancel.Enabled = true;</p><p> grpAreaInfo.Tag = area;</p><p><b> }</b></p><p><b> }</b></p><p> 切換RadioButton</p><p>
73、 可設(shè)計為:單擊個人家庭RadioButton時,第一個Panel可用,第二個Panel不可用;單擊個體商戶RadioButton時,第一個Panel不可用,第二個Panel可用</p><p> private void rdoHome_CheckedChanged(object sender, EventArgs e)</p><p><b> {</b>&l
74、t;/p><p> pnlHome.Enabled = true;</p><p> pnlShop.Enabled = false;</p><p><b> }</b></p><p> private void rdoShop_CheckedChanged(object sender, EventArgs e)
75、</p><p><b> {</b></p><p> pnlHome.Enabled = false;</p><p> pnlShop.Enabled = true;</p><p><b> }</b></p><p><b> 單擊保存</
76、b></p><p> 首先,判斷雙擊項目是不是“新建顧客”的項目,如果是“新建顧客”的項目,則執(zhí)行業(yè)務(wù)邏輯層中新建的方法,否則需執(zhí)行修改的方法。操作成功后隱藏GroupBox控件。</p><p> IGuest bll = new CycleBLL.GuestBLL();</p><p> TGuest guest = (TGuest)grpG
77、uestInfo.Tag;</p><p> string Address = txtProvince.Text + "," +</p><p> txtCity.Text + "," +</p><p> txtCounty.Text;</p><p> if (rdoHome.Che
78、cked)</p><p> {</p><p> Address = Address + ",1," +</p><p> txtBuildingArea.Text + "," +</p><p> txtBuilding.Text + ",&quo
79、t; +</p><p> txtUnit.Text + "," +</p><p> txtLayer.Text + "," +</p><p> txtRoomNo.Text;</p><p><b> }</b></p><p><b&g
80、t; else</b></p><p><b> {</b></p><p> Address = Address + ",2," +</p><p> txtStreet.Text + "," +</p><p> txtNo.Text + ",&
81、quot; +</p><p> txtOther.Text;</p><p><b> }</b></p><p> if (guest.GuestID == Guid.Empty)</p><p><b> {</b></p><p> if (bll.
82、Create(txtName.Text,</p><p> txtPhone.Text,</p><p><b> Address,</b></p><p> txtDesc.Text,</p><p> ((TArea)cmbArea.SelectedValu</p><p>&
83、lt;b> {</b></p><p> MessageBox.Show("顧客創(chuàng)建成功!");</p><p> grpGuestInfo.Visible = false;</p><p><b> }</b></p><p><b> else</b&g
84、t;</p><p><b> {</b></p><p> MessageBox.Show("顧客創(chuàng)建失??!");</p><p><b> }</b></p><p><b> }</b></p><p> Else
85、</p><p><b> {</b></p><p> if (bll.Modify(guest.GuestID,</p><p> txtName.Text,</p><p> txtPhone.Text,</p><p><b> Address,
86、</b></p><p> txtDesc.Text,</p><p> ((TArea)cmbArea.SelectedValue).ID))</p><p><b> {</b></p><p> MessageBox.Show("顧客修改成功!");</p>&
87、lt;p> grpGuestInfo.Visible = false;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> MessageBox.Show("顧客修改
88、失??!");</p><p><b> }</b></p><p><b> }</b></p><p><b> 單擊取消</b></p><p> 隱藏GroupBox控件:grpGuest.Visibled=false;</p><p
89、> 5、物流配送管理窗口——FLogistics</p><p><b> 1 添加配送單</b></p><p> 添加時,需要收集的信息有:顧客姓名、配送單號、運費、配送日期。顧客姓名:顧客信息需要操作員手動輸入,將操作員手動輸入的文字與數(shù)據(jù)庫中的用戶進行對比,當(dāng)尋找到顧客姓名后,列在文本框下方的列表中提供操作員選擇,操作員選擇用戶后,才能繼續(xù)進行添加
90、配送單。</p><p><b> 需要定義一個接口:</b></p><p> List<TGuest> GetList(string)</p><p> 根據(jù)姓名搜索顧客,并返回滿足條件的顧客列表。</p><p> 這時,就需要在文本框的文本改變事件中書寫搜索顧客信息的代碼:</p>
91、<p> private void textBox1_TextChanged(object sender, EventArgs e)</p><p><b> {</b></p><p> listBox1.Items.Clear();</p><p> IGuest bll = new GuestBLL();</p
92、><p> List<TGuest> list = bll.GetList(textBox1.Text);</p><p> listBox1.DataSource = list;</p><p> listBox1.DisplayMember = "GuestName";</p><p><b>
93、 }</b></p><p> private void listBox1_SelectedIndexChanged(object sender, EventArgs e)</p><p><b> {</b></p><p> if (listBox1.SelectedItems.Count != 0)</p>
94、<p><b> {</b></p><p> tabControl1.Enabled = true;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></
95、p><p> tabControl1.Enabled = false;</p><p><b> }</b></p><p><b> }</b></p><p><b> 需要定義一個接口</b></p><p> List<TCycle&
96、gt; GetNoUseCycle()</p><p> 在窗體加載時,為這個Combobox添加數(shù)據(jù)源。</p><p> ICycle cyc=new CycleBLL.CycleBLL();</p><p> comboBox1.DataSource = cyc.GetNoUseCycle();</p><p> comboBo
97、x1.DisplayMember = "No";</p><p> 在信息收集完成后,單擊“添加”按鈕時,將各個數(shù)據(jù)傳遞給業(yè)務(wù)邏輯層,所以需要建立接口:</p><p> bool AddCycle(Guid, Guid, string, float, DateTime, DateTime, string)</p><p> 并在單擊添加時
98、,執(zhí)行BLL的該方法</p><p> IGuestCycle gc = new CycleBLL.GuestCycleBLL();</p><p> if (gc.AddCycle(</p><p> ((TGuest)listBox1.SelectedItems[0]).GuestID,</p><p> ((TCycle)com
99、boBox1.SelectedItem[0]).ID,</p><p> textBox3.Text,</p><p> float.Parse(textBox5.Text),</p><p> dateTimePicker1.Value,</p><p> dateTimePicker2.Value,</p><
100、p> textBox4.Text</p><p><b> ))</b></p><p><b> {</b></p><p> MessageBox.Show("添加成功!");</p><p><b> }</b></p>
101、<p><b> else</b></p><p><b> {</b></p><p> MessageBox.Show("添加失??!");</p><p><b> }</b></p><p> 6、信息查詢窗口——FSearch&l
102、t;/p><p> 在信息查詢窗口中,系統(tǒng)將完成以下功能:運單與顧客管理、物流的配送日期與送至日期等操作,由此可以看出, </p><p> 在該界面中,單擊物流與顧客管理后,可啟動FLogistics窗體,單擊搜索后,將搜索條件轉(zhuǎn)為參數(shù)傳遞給業(yè)務(wù)邏輯層,然后根據(jù)業(yè)務(wù)邏輯層所返回的泛型集合,將數(shù)據(jù)填充到列表中。</p><p> (五)業(yè)務(wù)邏輯層的建立</p
103、><p> 業(yè)務(wù)邏輯開發(fā)員的主要工作就是將表現(xiàn)層傳遞進來的數(shù)據(jù)轉(zhuǎn)換成數(shù)據(jù)模型,并交由數(shù)據(jù)層處理。因此表現(xiàn)層需要在基礎(chǔ)框架上建立三個工程:CommonModel、DAL、BLL。Public int Insert(TArea area) {return 1;}</p><p> 至于CommonModel應(yīng)該通過組長向數(shù)據(jù)層開發(fā)員索要。</p><p> 業(yè)務(wù)邏輯開
104、發(fā)員只需要將BLL實現(xiàn)即可。在業(yè)務(wù)邏輯層實現(xiàn)過程中,需要不斷的與表現(xiàn)層或組長進行溝通,得知表現(xiàn)層需要什么樣的方法,返回什么樣的數(shù)據(jù)。</p><p> 區(qū)域信息管理只涉及到增、刪、改、查,因此在區(qū)域的業(yè)務(wù)邏輯類中,只要滿足這四個要求基本就可以滿足表現(xiàn)層所需要的功能了。</p><p> 其他接口的實現(xiàn)與鋼瓶創(chuàng)建的接口原理上都是一樣的,都是將參數(shù)轉(zhuǎn)換為數(shù)據(jù)模型,最簡成增、刪、改、查的操作
105、,再傳遞給能夠完成操作的數(shù)據(jù)層方法。</p><p> (六)數(shù)據(jù)層建立及代碼實現(xiàn)</p><p> 1) 數(shù)據(jù)庫公共執(zhí)行類——DatabaseControl</p><p><b> 介紹并基本建類</b></p><p> 在框架基礎(chǔ)上,建立類庫項目:DAL,并添加對CommonModel類庫的引用。由于DA
106、L負責(zé)與數(shù)據(jù)庫的交互,為了減少代碼重寫,提高數(shù)據(jù)庫的操作,我們小組們將數(shù)據(jù)庫的操作過程寫在一個名為DatabaseControl的類中。該類是整個項目最核心的一個部分,也是相對最復(fù)雜的一個部分,該類一旦被建立,會大大減少我們小組們在其他位置所書寫的代碼和邏輯過程。</p><p> 對于數(shù)據(jù)庫的操作,除了返回“該操作共影響了 N 行”外,就是返回一個的數(shù)據(jù)集合。所以,我們小組們除了定義數(shù)據(jù)庫連接器(SqlCon
107、nection)、數(shù)據(jù)命令器(SqlCommand)和數(shù)據(jù)適配器(SqlDataAdapter)外,還需要建立公開方法:Executed方法所有需要執(zhí)行數(shù)據(jù)庫操作的,都必須調(diào)用Execute來執(zhí)行SQL語句或存儲過程。</p><p> 而Execute的返回值,則有兩種情況,一種是返回一個數(shù)字,一種是返回一個結(jié)果集,所以Execute方法得到了以下幾種重載</p><p> //執(zhí)行
108、語句或存儲過程,返回影響的行數(shù)(無參數(shù)傳遞)</p><p> Int Execute(CommandType, string)</p><p> //將參數(shù)傳遞給語句或存儲過程并執(zhí)行,返回影響的行數(shù)(有參數(shù)傳遞)</p><p> Int Execute(CommandType, string, SqlParameter[])</p><
109、p> //執(zhí)行語句或存儲過程,返回結(jié)果集(無參數(shù)傳遞)</p><p> DataCollection Execute(CommandType, string)</p><p> //將參數(shù)傳遞給語句或存儲過程并執(zhí)行,返回結(jié)果集(有參數(shù)傳遞)</p><p> DataCollection Execute(CommandType, string, Sq
110、lParameter[])</p><p> 由于數(shù)據(jù)庫的操作需要打開數(shù)據(jù)庫和關(guān)閉數(shù)據(jù)庫,因此需要建立Open和Close方法。</p><p> 截止到目前,我們小組們可以得到如下的類代碼:</p><p> public class DatabaseControl</p><p><b> {</b><
111、/p><p> private const string connstr = ""; </p><p> private SqlConnection conn = new SqlConnection(connstr); </p><p> private Sql
112、Command comm = new SqlCommand(); </p><p> private SqlParameter adap = new SqlParameter(); </p><p> public int Execute(CommandType type, string command
113、) </p><p><b> {</b></p><p> return Execute(type, command, new SqlParameter[] { }); </p><p><b> }</b></p><p> public IL
114、ist Execute(CommandType type, string command) </p><p><b> {</b></p><p> return Execute(type, command, new SqlParameter[] { }); </p><p><b> }
115、</b></p><p> public int Execute(CommandType type, string command, SqlParameter[] para) </p><p><b> { }</b></p><p> public IList Execute(CommandType type, stri
116、ng command, SqlParameter[] para) { }</p><p> private void OpenDatabase() {</p><p> if (conn.State != ConnectionState.Open)</p><p><b> {</b>&
117、lt;/p><p> conn.Open(); }</p><p> comm = new SqlCommand();</p><p> comm.Connection = conn;</p><p><b> }</b></p>
118、<p> private void Close() </p><p><b> {</b></p><p> if (conn.State == ConnectionState.Open)</p><p><b> {</b></p><p> conn
119、.Close();</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 進一步加工這個類,整合OpenDatabase方法</p><p> 根據(jù)兩個三參Execu
120、te方法,我們小組們可以看出,在建立指令對象時,需要為SqlCommand對象指定:CommandType、CommandText以及Parameter。需要注意的是SqlCommand所接受的Parameter并不是數(shù)組,而是SqlParameterCollection對象,因此我們小組們需要將SqlParameter數(shù)組對象添加到這個Collection中。所以,數(shù)據(jù)庫的打開方法:OpenDatabase將更改為:</p>
121、;<p> Private void OpenDatabase(CommandType type, string command, SqlParameter[] para)</p><p><b> {</b></p><p> if (conn.State != ConnectionState.Open)</p><
122、;p><b> {</b></p><p> conn.Open(); </p><p><b> }</b></p><p> comm = new SqlCommand();</p><p> comm.Connection = con
123、n;</p><p> comm.CommandType = type;</p><p> comm.CommandText = command;</p><p> foreach (SqlParameter tmp in para)</p><p><b> {</b></p>
124、<p> comm.Parameters.Add(tmp);</p><p><b> }</b></p><p><b> }</b></p><p> 這樣,Execute在執(zhí)行的時候,只需要將參數(shù)再次傳遞給OpenDatabase,就可以完成一系列的設(shè)置操作。</p><p&g
125、t; Public int Execute(CommandType type, string command, SqlParameter[] para)</p><p><b> {</b></p><p> OpenDatabase(type, command, para);</p><p> int rtn = comm.Execu
126、teNonQuery();</p><p><b> Close();</b></p><p> return rtn;</p><p><b> }</b></p><p> 利用泛型集合,將結(jié)果集返回到業(yè)務(wù)邏輯層</p><p> 到目前為止,我們小組們只是將E
127、xecute在執(zhí)行時,返回影響行數(shù)的這個模塊完成了,接下來,該考慮如何處理Execute返回結(jié)果集的部分。</p><p> 采用泛型集合的模式來返回結(jié)果集,主要目的是為了在邏輯層和表現(xiàn)層時的操作與數(shù)據(jù)無關(guān)而設(shè)計的,此外,也是為了減少數(shù)據(jù)層書寫更多的針對操作DataReader和DataTable的部分。</p><p> 所謂泛型是一種特殊類型,它把指定類型的工作推遲到客戶代碼并實例
128、化的類型。</p><p><b> 關(guān)于泛型:</b></p><p> 在過去,我們小組們定義數(shù)組:</p><p> int[] array = new int[]{1,2,3,4};</p><p> 當(dāng)我們小組們需要對數(shù)組長度的動態(tài)增長,對于這種定義方式是不可行的,這時就會想到Array、ArrayLi
129、st。</p><p> 但無論是Array,還是ArrayList,對數(shù)據(jù)類型都沒有要求,因此就會出現(xiàn)像下面這樣的賦值過程:</p><p> ArrayList array = new ArrayList();</p><p> array.add(2);</p><p> array.add("4");<
130、;/p><p> 如果這時對array對象中的元素進行加和,并得到結(jié)果時,就會出現(xiàn)數(shù)據(jù)類型不統(tǒng)一的異常錯誤。</p><p> 而泛型集合的出現(xiàn),便解決了這個尷尬的問題。</p><p> List<int> list = new List<int>();</p><p> list.add(1);</p&g
131、t;<p> list.add(3);</p><p> list.add("4"); //這時程序會提示語法錯誤,因為要求list的集合必須是int類型。</p><p><b> 關(guān)于泛型:</b></p><p> 在過去,我們小組們定義數(shù)組:</p><p> i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件工程課程設(shè)計報告物流配送管理系統(tǒng)
- 軟件工程課程設(shè)計報告物流配送管理系統(tǒng)
- 畢業(yè)設(shè)計-物流配送管理系統(tǒng)
- 德邦物流配送系統(tǒng)設(shè)計.
- 物流配送中心績效管理
- 物流配送管理系統(tǒng)畢業(yè)論文
- 物流配送系統(tǒng)干擾管理模型研究
- 物流配送系統(tǒng)開題報告
- 肯德基物流配送
- 物流配送概述
- 物流配送管理與作業(yè)
- 物流配送合同
- 物流配送合同
- 物流配送協(xié)議
- 物流配送系統(tǒng)的設(shè)計與實現(xiàn)
- 物流配送試題
- gps物流配送系統(tǒng)設(shè)計方案
- 信息管理系統(tǒng)課程設(shè)計—— 第三方物流配送信息系統(tǒng)
- 物流配送中心作業(yè)管理系統(tǒng)模擬.pdf
- 城市物流配送中心配送管理系統(tǒng)的研究與設(shè)計.pdf
評論
0/150
提交評論