課程設(shè)計(jì)---物流配送管理系統(tǒng)_第1頁(yè)
已閱讀1頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論