版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 2012-2013學(xué)年第一學(xué)期</p><p><b> 課 程 設(shè) 計(jì)</b></p><p> 項(xiàng)目類別:C#程序設(shè)計(jì)II課程設(shè)計(jì)</p><p> 設(shè)計(jì)題目:物流配送管理系統(tǒng)</p><p> 班 級(jí) :</p><p> 組長(zhǎng)學(xué)號(hào) :</p><
2、;p> 組長(zhǎng)姓名 :</p><p> 校內(nèi)教師:</p><p> 企業(yè)教師:</p><p> 設(shè)計(jì)日期: 2012年12月 17 日——2012年12月 28日</p><p><b> 一、設(shè)計(jì)目標(biāo)</b></p><p> “C#程序設(shè)計(jì)II”課程設(shè)計(jì)是在系統(tǒng)的學(xué)習(xí)了《C#程序
3、設(shè)計(jì)II》課程后,綜合運(yùn)用所學(xué)的知識(shí),設(shè)計(jì)開(kāi)發(fā)一個(gè)小型基于C/S模式物流配送管理系統(tǒng)。它的主要功能有:區(qū)域信息管理、顧客信息管理以及物流配送信息管理和信息查詢四大功能。通過(guò)這一具體問(wèn)題的分析、設(shè)計(jì)與實(shí)現(xiàn),將理論與應(yīng)用相結(jié)合,學(xué)會(huì)如何把書(shū)本上學(xué)到的知識(shí)用于解決實(shí)際問(wèn)題,培養(yǎng)動(dò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ù)需求進(jìn)行界面設(shè)計(jì),并完成基本交互代碼,能夠?qū)崿F(xiàn)將代碼提交給業(yè)務(wù)邏輯層。</p><p> 業(yè)務(wù)邏輯層:將表現(xiàn)層的數(shù)據(jù)解析成數(shù)據(jù)層的數(shù)據(jù)模型,并傳遞給數(shù)據(jù)層。同時(shí)接受數(shù)據(jù)層的返回結(jié)果給表現(xiàn)層、</p><
5、;p> 數(shù)據(jù)層:數(shù)據(jù)庫(kù)連接、接收業(yè)務(wù)邏輯層傳遞過(guò)來(lái)的數(shù)據(jù)模型,提交給數(shù)據(jù)庫(kù)進(jìn)行處理,并根據(jù)實(shí)際的具體需求建立存儲(chǔ)過(guò)程,既數(shù)據(jù)層開(kāi)發(fā)員不在負(fù)責(zé)數(shù)據(jù)庫(kù)的整體建立。</p><p><b> (二)四大功能區(qū)域</b></p><p> 物流配送系統(tǒng)一共包括區(qū)域信息管理、顧客信息管理以及物流配送信息管理和信息查詢四大功能,一下就是這四大功能之間關(guān)系的簡(jiǎn)圖。并且這
6、四大功能與數(shù)據(jù)相連,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增、刪、改、查操作。</p><p><b> 三、人員分工</b></p><p><b> 四、設(shè)計(jì)過(guò)程</b></p><p><b> (一)設(shè)計(jì)思想</b></p><p> 我們小組們采用三層架構(gòu)模式,使系統(tǒng)的代碼不冗長(zhǎng),也
7、有利于系統(tǒng)的編譯和運(yùn)行,如果系統(tǒng)出現(xiàn)錯(cuò)誤就會(huì)第一時(shí)間知道問(wèn)題出現(xiàn)在哪里。所以采用三層的架構(gòu)模式,不僅調(diào)理清晰,組員分工明確完成的效率也會(huì)提高。以下就是三層架構(gòu)邏輯關(guān)系圖。也是我們小組們?cè)O(shè)計(jì)設(shè)計(jì)系統(tǒng)的思想。</p><p><b> ?。ǘ?shù)據(jù)庫(kù)設(shè)計(jì)</b></p><p> 根據(jù)物流管理系統(tǒng)的需求分析,可見(jiàn)在功能上分為:區(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> 配送時(shí)間表&
10、lt;/b></p><p> TGuestOrder</p><p><b> 2、建立視圖 </b></p><p> 根據(jù)顧客表物流配送表檢索物流與顧客的關(guān)系并建立視圖V1。</p><p><b> 3、存儲(chǔ)過(guò)程設(shè)計(jì)</b></p><p> 為了方便
11、程序處理,我們小組們需要為每個(gè)數(shù)據(jù)庫(kù)中的表元素添加關(guān)于增、刪、改、查、的存儲(chǔ)過(guò)程,例如為區(qū)域增加的存儲(chǔ)過(guò)程(其他三個(gè)表的存儲(chǔ)過(guò)程也依此進(jìn)行設(shè)計(jì)):</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ù)模型及代碼實(shí)現(xiàn)</p><p> 根據(jù)項(xiàng)目的核心思想,因此需要建立一個(gè)類庫(kù)項(xiàng)目,項(xiàng)目名稱為“Common
24、Model”,并根據(jù)數(shù)據(jù)庫(kù)表中的結(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> 其他三個(gè)表同上</b></p><p> ?。ㄋ模┍憩F(xiàn)層的設(shè)計(jì)以及代碼實(shí)現(xiàn)</p><p>
31、<b> 1、項(xiàng)目總攬</b></p><p> 表現(xiàn)層開(kāi)發(fā)員需要了解在項(xiàng)目的關(guān)系:</p><p> CycleManagement項(xiàng)目:是項(xiàng)目運(yùn)行的界面項(xiàng)目,負(fù)責(zé)與用戶交互;</p><p> CycleInterface項(xiàng)目:是負(fù)責(zé)與業(yè)務(wù)邏輯層之間協(xié)商的規(guī)范,負(fù)責(zé)與業(yè)務(wù)邏輯層進(jìn)行交互;</p><p>
32、CommonModel項(xiàng)目:是負(fù)責(zé)表現(xiàn)層使用數(shù)據(jù)模型;</p><p> 當(dāng)項(xiàng)目開(kāi)發(fā)時(shí),表現(xiàn)層與業(yè)務(wù)邏輯層之間需要交流的便是CycleInterface項(xiàng)目中BLL文件夾內(nèi)的借口文件;</p><p> 2、主窗口——MainForm</p><p> 在“LogisticsManagement”項(xiàng)目中右擊,選擇“新建項(xiàng)”,在項(xiàng)目列表中選擇“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ū)域信息管理、顧客信息管理以及物流配送信息管理和信息查詢四大功能,因此可以為主窗體添加一個(gè)菜單欄,并設(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> 因此,為每個(gè)菜單編輯類似如下的代碼(假設(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> 該窗體由于屬于各個(gè)功能窗體的調(diào)用總窗體,因此不需要與業(yè)務(wù)邏輯層進(jìn)行任何的交互操作。</p><p> 3、區(qū)域管理窗口——FArea</p><p><b> 窗體控件布局</b></p>
38、<p> 根據(jù)需求分析,在區(qū)域管理的功能上,只需要做到增、刪、查即可,不需要為區(qū)域管理添加其他功能,因此可將區(qū)域管理功能的界面設(shè)計(jì)如圖所示界面:</p><p><b> 業(yè)務(wù)邏輯的功能統(tǒng)計(jì)</b></p><p> 根據(jù)界面的設(shè)計(jì),我們小組們知道該功能需要:</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> 窗體加載成功后,通過(guò)查詢功能將區(qū)域
40、信息加載到內(nèi)存,并在區(qū)域信息的數(shù)據(jù)源列表中的第一個(gè)位置新增具有“新建區(qū)域”信息的區(qū)域項(xiàng)目;</p><p> 單擊“創(chuàng)建”按鈕,則調(diào)用業(yè)務(wù)邏輯層的創(chuàng)建方法,并傳遞區(qū)域名和區(qū)域描述兩個(gè)文本框的內(nèi)容;</p><p> 單擊“修改”按鈕,則調(diào)用業(yè)務(wù)邏輯層的修改方法,并傳遞區(qū)域編號(hào)、區(qū)域名、區(qū)域描述;</p><p> 單擊“刪除”按鈕,則調(diào)用業(yè)務(wù)邏輯層的刪除方法,
41、并傳遞區(qū)域編號(hào);</p><p> 單擊“取消”按鈕,則使區(qū)域信息框隱藏,既Visible=false;</p><p><b> 窗體加載時(shí)讀取數(shù)據(jù)</b></p><p> 雙擊窗體標(biāo)題欄,進(jìn)入代碼編寫(xiě)界面,并在FArea_Load方法內(nèi)書(shū)寫(xiě)如下代碼:</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ù)庫(kù)進(jìn)行交互,因此需要通過(guò)業(yè)務(wù)邏輯層的方法來(lái)創(chuàng)建。在創(chuàng)建之前,需要對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單的驗(yàn)證,例如是否為空,數(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ù)庫(kù)進(jìn)行交互,因此需要通過(guò)業(yè)務(wù)邏輯層的方法來(lái)修改,在修改之前,需要對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單的驗(yàn)證,例如是否為空,數(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, "確定要?jiǎng)h除該區(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ù),可見(jiàn)右圖:</p><p> 在顧客管理窗口的顧客信
65、息GroupBox中,邏輯部分便是“顧客類型”選擇后,應(yīng)使對(duì)應(yīng)的Panel處于可用狀態(tài),以及單擊保存時(shí),需要判斷該顧客是需要新建,還是需要保存修改。</p><p><b> 窗體加載</b></p><p> 但在窗體加載過(guò)程中,需要為區(qū)域下拉框添加數(shù)據(jù)源:</p><p> IArea area=new AreaBLL ();<
66、/p><p> cmbArea.DataSource = area.GetList();</p><p> cmbArea.DisplayMember = "Name";</p><p> 雙擊ListView項(xiàng)目</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è)計(jì)為:?jiǎn)螕魝€(gè)人家庭RadioButton時(shí),第一個(gè)Panel可用,第二個(gè)Panel不可用;單擊個(gè)體商戶RadioButton時(shí),第一個(gè)Panel不可用,第二個(gè)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> 首先,判斷雙擊項(xiàng)目是不是“新建顧客”的項(xiàng)目,如果是“新建顧客”的項(xiàng)目,則執(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í),需要收集的信息有:顧客姓名、配送單號(hào)、運(yùn)費(fèi)、配送日期。顧客姓名:顧客信息需要操作員手動(dòng)輸入,將操作員手動(dòng)輸入的文字與數(shù)據(jù)庫(kù)中的用戶進(jìn)行對(duì)比,當(dāng)尋找到顧客姓名后,列在文本框下方的列表中提供操作員選擇,操作員選擇用戶后,才能繼續(xù)進(jìn)行添加
90、配送單。</p><p><b> 需要定義一個(gè)接口:</b></p><p> List<TGuest> GetList(string)</p><p> 根據(jù)姓名搜索顧客,并返回滿足條件的顧客列表。</p><p> 這時(shí),就需要在文本框的文本改變事件中書(shū)寫(xiě)搜索顧客信息的代碼:</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> 需要定義一個(gè)接口</b></p><p> List<TCycle&
96、gt; GetNoUseCycle()</p><p> 在窗體加載時(shí),為這個(gè)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í),將各個(gè)數(shù)據(jù)傳遞給業(yè)務(wù)邏輯層,所以需要建立接口:</p><p> bool AddCycle(Guid, Guid, string, float, DateTime, DateTime, string)</p><p> 并在單擊添加時(shí)
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("添加失?。?quot;);</p><p><b> }</b></p><p> 6、信息查詢窗口——FSearch&l
102、t;/p><p> 在信息查詢窗口中,系統(tǒng)將完成以下功能:運(yùn)單與顧客管理、物流的配送日期與送至日期等操作,由此可以看出, </p><p> 在該界面中,單擊物流與顧客管理后,可啟動(dòng)FLogistics窗體,單擊搜索后,將搜索條件轉(zhuǎn)為參數(shù)傳遞給業(yè)務(wù)邏輯層,然后根據(jù)業(yè)務(wù)邏輯層所返回的泛型集合,將數(shù)據(jù)填充到列表中。</p><p> ?。ㄎ澹I(yè)務(wù)邏輯層的建立</p
103、><p> 業(yè)務(wù)邏輯開(kāi)發(fā)員的主要工作就是將表現(xiàn)層傳遞進(jìn)來(lái)的數(shù)據(jù)轉(zhuǎn)換成數(shù)據(jù)模型,并交由數(shù)據(jù)層處理。因此表現(xiàn)層需要在基礎(chǔ)框架上建立三個(gè)工程:CommonModel、DAL、BLL。Public int Insert(TArea area) {return 1;}</p><p> 至于CommonModel應(yīng)該通過(guò)組長(zhǎng)向數(shù)據(jù)層開(kāi)發(fā)員索要。</p><p> 業(yè)務(wù)邏輯開(kāi)
104、發(fā)員只需要將BLL實(shí)現(xiàn)即可。在業(yè)務(wù)邏輯層實(shí)現(xiàn)過(guò)程中,需要不斷的與表現(xiàn)層或組長(zhǎng)進(jìn)行溝通,得知表現(xiàn)層需要什么樣的方法,返回什么樣的數(shù)據(jù)。</p><p> 區(qū)域信息管理只涉及到增、刪、改、查,因此在區(qū)域的業(yè)務(wù)邏輯類中,只要滿足這四個(gè)要求基本就可以滿足表現(xiàn)層所需要的功能了。</p><p> 其他接口的實(shí)現(xiàn)與鋼瓶創(chuàng)建的接口原理上都是一樣的,都是將參數(shù)轉(zhuǎn)換為數(shù)據(jù)模型,最簡(jiǎn)成增、刪、改、查的操作
105、,再傳遞給能夠完成操作的數(shù)據(jù)層方法。</p><p> ?。?shù)據(jù)層建立及代碼實(shí)現(xiàn)</p><p> 1) 數(shù)據(jù)庫(kù)公共執(zhí)行類——DatabaseControl</p><p><b> 介紹并基本建類</b></p><p> 在框架基礎(chǔ)上,建立類庫(kù)項(xiàng)目:DAL,并添加對(duì)CommonModel類庫(kù)的引用。由于DA
106、L負(fù)責(zé)與數(shù)據(jù)庫(kù)的交互,為了減少代碼重寫(xiě),提高數(shù)據(jù)庫(kù)的操作,我們小組們將數(shù)據(jù)庫(kù)的操作過(guò)程寫(xiě)在一個(gè)名為DatabaseControl的類中。該類是整個(gè)項(xiàng)目最核心的一個(gè)部分,也是相對(duì)最復(fù)雜的一個(gè)部分,該類一旦被建立,會(huì)大大減少我們小組們?cè)谄渌恢盟鶗?shū)寫(xiě)的代碼和邏輯過(guò)程。</p><p> 對(duì)于數(shù)據(jù)庫(kù)的操作,除了返回“該操作共影響了 N 行”外,就是返回一個(gè)的數(shù)據(jù)集合。所以,我們小組們除了定義數(shù)據(jù)庫(kù)連接器(SqlCon
107、nection)、數(shù)據(jù)命令器(SqlCommand)和數(shù)據(jù)適配器(SqlDataAdapter)外,還需要建立公開(kāi)方法:Executed方法所有需要執(zhí)行數(shù)據(jù)庫(kù)操作的,都必須調(diào)用Execute來(lái)執(zhí)行SQL語(yǔ)句或存儲(chǔ)過(guò)程。</p><p> 而Execute的返回值,則有兩種情況,一種是返回一個(gè)數(shù)字,一種是返回一個(gè)結(jié)果集,所以Execute方法得到了以下幾種重載</p><p> //執(zhí)行
108、語(yǔ)句或存儲(chǔ)過(guò)程,返回影響的行數(shù)(無(wú)參數(shù)傳遞)</p><p> Int Execute(CommandType, string)</p><p> //將參數(shù)傳遞給語(yǔ)句或存儲(chǔ)過(guò)程并執(zhí)行,返回影響的行數(shù)(有參數(shù)傳遞)</p><p> Int Execute(CommandType, string, SqlParameter[])</p><
109、p> //執(zhí)行語(yǔ)句或存儲(chǔ)過(guò)程,返回結(jié)果集(無(wú)參數(shù)傳遞)</p><p> DataCollection Execute(CommandType, string)</p><p> //將參數(shù)傳遞給語(yǔ)句或存儲(chǔ)過(guò)程并執(zhí)行,返回結(jié)果集(有參數(shù)傳遞)</p><p> DataCollection Execute(CommandType, string, Sq
110、lParameter[])</p><p> 由于數(shù)據(jù)庫(kù)的操作需要打開(kāi)數(shù)據(jù)庫(kù)和關(guān)閉數(shù)據(jù)庫(kù),因此需要建立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> 進(jìn)一步加工這個(gè)類,整合OpenDatabase方法</p><p> 根據(jù)兩個(gè)三參Execu
120、te方法,我們小組們可以看出,在建立指令對(duì)象時(shí),需要為SqlCommand對(duì)象指定:CommandType、CommandText以及Parameter。需要注意的是SqlCommand所接受的Parameter并不是數(shù)組,而是SqlParameterCollection對(duì)象,因此我們小組們需要將SqlParameter數(shù)組對(duì)象添加到這個(gè)Collection中。所以,數(shù)據(jù)庫(kù)的打開(kāi)方法: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í)候,只需要將參數(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í),返回影響行數(shù)的這個(gè)模塊完成了,接下來(lái),該考慮如何處理Execute返回結(jié)果集的部分。</p><p> 采用泛型集合的模式來(lái)返回結(jié)果集,主要目的是為了在邏輯層和表現(xiàn)層時(shí)的操作與數(shù)據(jù)無(wú)關(guān)而設(shè)計(jì)的,此外,也是為了減少數(shù)據(jù)層書(shū)寫(xiě)更多的針對(duì)操作DataReader和DataTable的部分。</p><p> 所謂泛型是一種特殊類型,它把指定類型的工作推遲到客戶代碼并實(shí)例
128、化的類型。</p><p><b> 關(guān)于泛型:</b></p><p> 在過(guò)去,我們小組們定義數(shù)組:</p><p> int[] array = new int[]{1,2,3,4};</p><p> 當(dāng)我們小組們需要對(duì)數(shù)組長(zhǎng)度的動(dòng)態(tài)增長(zhǎng),對(duì)于這種定義方式是不可行的,這時(shí)就會(huì)想到Array、ArrayLi
129、st。</p><p> 但無(wú)論是Array,還是ArrayList,對(duì)數(shù)據(jù)類型都沒(méi)有要求,因此就會(huì)出現(xiàn)像下面這樣的賦值過(guò)程:</p><p> ArrayList array = new ArrayList();</p><p> array.add(2);</p><p> array.add("4");<
130、;/p><p> 如果這時(shí)對(duì)array對(duì)象中的元素進(jìn)行加和,并得到結(jié)果時(shí),就會(huì)出現(xiàn)數(shù)據(jù)類型不統(tǒng)一的異常錯(cuò)誤。</p><p> 而泛型集合的出現(xiàn),便解決了這個(gè)尷尬的問(wè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"); //這時(shí)程序會(huì)提示語(yǔ)法錯(cuò)誤,因?yàn)橐髄ist的集合必須是int類型。</p><p><b> 關(guān)于泛型:</b></p><p> 在過(guò)去,我們小組們定義數(shù)組:</p><p> i
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件工程課程設(shè)計(jì)報(bào)告物流配送管理系統(tǒng)
- 軟件工程課程設(shè)計(jì)報(bào)告物流配送管理系統(tǒng)
- 畢業(yè)設(shè)計(jì)-物流配送管理系統(tǒng)
- 德邦物流配送系統(tǒng)設(shè)計(jì).
- 物流配送中心績(jī)效管理
- 物流配送管理系統(tǒng)畢業(yè)論文
- 物流配送系統(tǒng)干擾管理模型研究
- 物流配送系統(tǒng)開(kāi)題報(bào)告
- 肯德基物流配送
- 物流配送概述
- 物流配送管理與作業(yè)
- 物流配送合同
- 物流配送合同
- 物流配送協(xié)議
- 物流配送系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 物流配送試題
- gps物流配送系統(tǒng)設(shè)計(jì)方案
- 信息管理系統(tǒng)課程設(shè)計(jì)—— 第三方物流配送信息系統(tǒng)
- 物流配送中心作業(yè)管理系統(tǒng)模擬.pdf
- 城市物流配送中心配送管理系統(tǒng)的研究與設(shè)計(jì).pdf
評(píng)論
0/150
提交評(píng)論