□段莎莉
( 山西國(guó)際商務(wù)職業(yè)學(xué)院 信息系,山西 太原 030031)
高等職業(yè)教育具有“高等教育”和“職業(yè)教育”的雙重屬性,是高等教育發(fā)展中的一個(gè)類型,不是其中一個(gè)層次,具有不可替代的作用,其培養(yǎng)的目標(biāo)定位明確為培養(yǎng)一線的勞動(dòng)者、操作者、服務(wù)者和管理者。有了職業(yè)技能,就能獲得企業(yè)運(yùn)作的基層經(jīng)驗(yàn),再加上高職院校不同于職業(yè)培訓(xùn)機(jī)構(gòu)的綜合素質(zhì)的培養(yǎng),才能進(jìn)一步提升就業(yè)空間,實(shí)現(xiàn)人才的可持續(xù)發(fā)展。計(jì)算機(jī)與應(yīng)用技術(shù)作為高職教育設(shè)置的傳統(tǒng)專業(yè),我們秉承“工學(xué)結(jié)合,以能力為本位、以職業(yè)實(shí)踐為主線”的高職教育理念制定人才培養(yǎng)方案,設(shè)置課程體系,開(kāi)設(shè)課程時(shí)充分考慮學(xué)生的就業(yè),適當(dāng)選取時(shí)下熱門(mén)實(shí)用的語(yǔ)言。基于這種考慮,將《C#程序設(shè)計(jì)》作為專業(yè)核心課程,C#是微軟公司專門(mén)為.net平臺(tái)設(shè)計(jì)的完全面向?qū)ο蟮恼Z(yǔ)言,從C,C++和Java等多種語(yǔ)言繼承發(fā)展而來(lái),博采眾長(zhǎng),簡(jiǎn)言之,綜合了圖形化可視操作和C++的高運(yùn)行效率,以其強(qiáng)大的操作能力、優(yōu)雅的語(yǔ)法風(fēng)格、創(chuàng)新的語(yǔ)言特性和便捷的面向組件編程的支持成為.net開(kāi)發(fā)平臺(tái)的首選語(yǔ)言,是學(xué)生就業(yè)時(shí)必備殺手锏之一。該課程緊跟企業(yè)技術(shù)應(yīng)用和人才需求崗位而開(kāi)設(shè),教學(xué)中以項(xiàng)目開(kāi)發(fā)過(guò)程為導(dǎo)向,采用案例教學(xué)法,目的是培養(yǎng)學(xué)生具備應(yīng)用管理軟件底層代碼的能力,職業(yè)定位是企業(yè)Visual C#.net程序員,注重核心職業(yè)技能和職業(yè)素質(zhì)的培養(yǎng)。
我國(guó)自上世紀(jì)引入案例教學(xué)法,在各個(gè)學(xué)科深入開(kāi)展廣泛應(yīng)用,取得了較好的教學(xué)效果。它是在教師的指導(dǎo)下,根據(jù)教學(xué)目的要求,組織學(xué)生對(duì)案例的調(diào)查、閱讀、思考、分析、討論和交流等活動(dòng),教給他們分析問(wèn)題和解決問(wèn)題的方法或道理,進(jìn)而提高分析問(wèn)題和解決問(wèn)題的能力,加深學(xué)生對(duì)基本原理和概念的理解的一種特定的教學(xué)方法。這個(gè)過(guò)程中案例的選取是關(guān)鍵,案例內(nèi)容應(yīng)具有一定的代表性和普遍性,涉及的知識(shí)多且全面,通過(guò)學(xué)習(xí)能讓學(xué)生舉一反三,從多角度對(duì)所學(xué)理論加以驗(yàn)證,從中得出正確結(jié)論。有了這樣的思路,我們加大了《C#程序設(shè)計(jì)》課程案例選取的深度和廣度,向步入準(zhǔn)職業(yè)領(lǐng)域方向過(guò)渡,擴(kuò)大案例所涉及知識(shí)范圍,加長(zhǎng)讀寫(xiě)代碼篇幅,通過(guò)合適的項(xiàng)目引導(dǎo),激發(fā)學(xué)習(xí)興趣,進(jìn)而把理論教學(xué)與實(shí)踐教學(xué)有機(jī)地結(jié)合起來(lái),充分發(fā)掘?qū)W生的創(chuàng)造潛能。
(一)界面設(shè)計(jì)
界面為帶有標(biāo)題欄、菜單欄、工具欄、地址欄、狀態(tài)欄和用splitCotainer容器分割控件分成左右兩部分的TreeView樹(shù)形結(jié)構(gòu)控件和ListView列表視圖控件,左邊用splitContainer分成上下兩部分,上面放置“文件夾”工具條用于轉(zhuǎn)換“資源管理器”視圖,下面放置TreeView樹(shù)形結(jié)構(gòu)控件,為了讓程序適應(yīng)窗體大小的改變,設(shè)置splitCotainer和內(nèi)置控件??繉傩詃ock為fill,且分割控件的固定面板設(shè)置為panel1,當(dāng)窗體調(diào)整大小時(shí)panel1能保持不變。另外,讀者可能頭疼按鈕圖標(biāo),可以采用系統(tǒng)默認(rèn)的圖標(biāo)。
在設(shè)計(jì)階段縱然讓地址欄上的各個(gè)按鈕布滿工具欄的寬度,由于放置地址組合框的工具欄的dock屬性為top,所以隨著窗體大小改變,工具欄的寬度是會(huì)隨著放寬,并且“地址”標(biāo)簽和“轉(zhuǎn)到”按鈕是左、右對(duì)齊,造成在地址組合框和“轉(zhuǎn)到”按鈕之間留下了間隙,故在工具欄的Resize事件中重新計(jì)算并調(diào)整地址組合框的寬度,通過(guò)foreach循環(huán)將除地址組合框以外的項(xiàng)目的寬度相加,用工具欄的新寬度將其減去再減一定的數(shù)值,為的是調(diào)整完寬度不讓其它項(xiàng)目溢出。
(二)功能實(shí)現(xiàn)
仿真設(shè)計(jì)的功能實(shí)現(xiàn)完全參考windows資源管理器的瀏覽功能設(shè)計(jì)。
1.加載本地磁盤(pán)列表。窗體加載時(shí)調(diào)用ListDrivers()加載本地磁盤(pán)列表,首先將treeview中的結(jié)點(diǎn)清空,再用treeview的add(“結(jié)點(diǎn)名稱”)方法動(dòng)態(tài)添加名為“我的電腦”根結(jié)點(diǎn)nodes[0]并使其成為selectednode,由于窗體加載和選擇根結(jié)點(diǎn)時(shí)都要加載本地磁盤(pán)列表,清空結(jié)點(diǎn)避免本地磁盤(pán)列表重復(fù)添加,動(dòng)態(tài)添加避免清空在設(shè)計(jì)階段添加的根結(jié)點(diǎn)后找不到nodes[0],無(wú)法將本地磁盤(pán)列表作為“我的電腦”的子結(jié)點(diǎn)添加進(jìn)去。
有了根結(jié)點(diǎn)后通過(guò)代碼將本地磁盤(pán)列表作為其子結(jié)點(diǎn)動(dòng)態(tài)地加入treeview中,使用DriveInfo類的GetDrives()方法提取本地邏輯磁盤(pán)盤(pán)符(如C:等)到字符串?dāng)?shù)組中,采取循環(huán)方法將數(shù)組元素生成treenode添加到treeview1.nodes[0],同時(shí)生成listviewitem添加到listview中,一是為了正確顯示結(jié)點(diǎn)名稱,通過(guò)判斷drivetype來(lái)區(qū)別“本地磁盤(pán)、CDROM和可移動(dòng)磁盤(pán)”,并修改結(jié)點(diǎn)的text屬性;二是為了正確顯示結(jié)點(diǎn)圖標(biāo),將treeview調(diào)整為小圖標(biāo)視圖并與imagelist1相關(guān)聯(lián),listview調(diào)整為大圖標(biāo)視圖與imagelist2相關(guān)聯(lián)。
2.加載邏輯磁盤(pán)資源。該功能在treeView_BeforeExpand事件中實(shí)現(xiàn),結(jié)點(diǎn)即將展開(kāi)前觸發(fā)事件,通過(guò)事件參數(shù)e定位到每個(gè)即將展開(kāi)的結(jié)點(diǎn),也就是即將被單擊“+”號(hào)的結(jié)點(diǎn),只要分配給當(dāng)前結(jié)點(diǎn)的集合不為空,通過(guò)調(diào)用NodeUpdate(e.node)[1]就能將各級(jí)結(jié)點(diǎn)的子目錄作為子結(jié)點(diǎn)添加到其集合中。首先調(diào)用自定義GetFilePath(e.node)[2]獲取當(dāng)前結(jié)點(diǎn)絕對(duì)路徑,用它生成操作文件夾的目錄對(duì)象,用GetDirectories()方法提取該對(duì)象的子目錄集合,由于每個(gè)結(jié)點(diǎn)子目錄集合的元素個(gè)數(shù)不定,故循環(huán)的次數(shù)不定,只能采用foreach循環(huán)將集合中的對(duì)象生成treenode作為當(dāng)前結(jié)點(diǎn)e的子結(jié)點(diǎn)添加到treeview中,由于treeview控件和imagelist1相關(guān)聯(lián),所以將新加下結(jié)點(diǎn)的圖標(biāo)設(shè)置為imaglist1中索引為4的文件夾圖標(biāo),將其選擇后的圖標(biāo)設(shè)置為索引為5即呈打開(kāi)狀態(tài)的文件夾圖標(biāo)。首次加入時(shí)顯示為文件夾關(guān)閉圖標(biāo),當(dāng)單擊成為所選對(duì)象后顯示為文件夾打開(kāi)圖標(biāo)。
GetFilePath(TreeNode node) 方法和系統(tǒng)提供的node.fullpath屬性實(shí)現(xiàn)的功能一樣,但是由于在加載磁盤(pán)列表時(shí)修改了其text屬性,fullpath屬性得不到結(jié)點(diǎn)的絕對(duì)路徑,故改寫(xiě)其實(shí)現(xiàn)過(guò)程為GetFilePath(),通過(guò)判斷所選結(jié)點(diǎn)的text屬性,如果選擇根結(jié)點(diǎn)“我的電腦”,則返回空字符路徑,表示沒(méi)有合法路徑;如果選擇“本地磁盤(pán)”結(jié)點(diǎn),則返回node.name即drive.name,這就解決了name和text不一致的問(wèn)題;如果選擇“本地磁盤(pán)的子目錄”結(jié)點(diǎn),則遞歸調(diào)用GetFilePath(),層層向上直至遍歷到“本地磁盤(pán)”,從而得到該結(jié)點(diǎn)的fullpath。
3.瀏覽邏輯磁盤(pán)資源。該功能分為正向和反向兩部分來(lái)實(shí)現(xiàn),正向?yàn)g覽是單擊treeview結(jié)點(diǎn)在listview中加載相應(yīng)資源,反向?yàn)g覽是激活listview中資源結(jié)點(diǎn)的同時(shí)在treeview中相應(yīng)結(jié)點(diǎn)處于被選擇狀態(tài)。
正向?yàn)g覽功能在treeView1_ AfterSelect事件中實(shí)現(xiàn),結(jié)點(diǎn)被選擇后觸發(fā)事件,通過(guò)事件參數(shù)e提供數(shù)據(jù)且能定位到當(dāng)前被選擇的結(jié)點(diǎn),調(diào)用ListUpdate(GetFilePath(e.node))[3]就能將當(dāng)前結(jié)點(diǎn)的子目錄和子文件添加到listview控件中。首先,將listview清空,因?yàn)槊窟x擇一個(gè)結(jié)點(diǎn)就會(huì)加載其子目錄和子文件,如果不清空l(shuí)istview,就會(huì)將新增listitem添加到原來(lái)加載的項(xiàng)目之后,出現(xiàn)不合理的邏輯結(jié)構(gòu)。
其次,該方法調(diào)用當(dāng)前結(jié)點(diǎn)的路徑即GetFilePath(e.node)作參數(shù),在加載listview項(xiàng)目時(shí)如果選擇“我的電腦”根結(jié)點(diǎn)則返回空字符串的無(wú)效路徑,此時(shí)調(diào)用ListDrivers()方法用大圖標(biāo)的形式加載本地磁盤(pán)列表;否則,先創(chuàng)建當(dāng)前有效結(jié)點(diǎn)e.node文件夾對(duì)象DirectoryInfo currentDir = new DirectoryInfo(newPath),獲取子目錄集合currentDir.GetDirectories()和子文件集合currentDir.GetFiles()分別生成treenode結(jié)點(diǎn)和listviewitem項(xiàng)目,用foreach循環(huán)將其依次添加到treeview和listview中,并統(tǒng)計(jì)其count更新到狀態(tài)欄中。
第三,添加子文件時(shí)關(guān)鍵問(wèn)題是圖標(biāo)的獲取,用GetSystemIcon[4]類GetIconByFileName方法獲取后將其添加到與之關(guān)聯(lián)的小圖標(biāo)顯示控件Imagelist1集合中以備后用。
需注意的兩個(gè)問(wèn)題:(1)由于系統(tǒng)中擴(kuò)展名為exe的文件圖標(biāo)不盡相同,故添加exe圖標(biāo)時(shí)不能用擴(kuò)展名作關(guān)鍵字,而是用文件名作關(guān)鍵字,且每次添加新的子文件前先將與之關(guān)聯(lián)的Imagelist1中的exe圖標(biāo)清除,防止套用不正確的exe圖標(biāo);(2)非exe文件的圖標(biāo)用其擴(kuò)展名作關(guān)鍵字將其圖標(biāo)添加到Imagelist1中,故添加非exe文件時(shí)先根據(jù)擴(kuò)展名判斷Imagelist1中有無(wú)這類文件的圖標(biāo),有就直接用,沒(méi)有就先添加后再使用。
反向?yàn)g覽功能在listView1_ItemActivate事件中實(shí)現(xiàn),雙擊激活listview中的項(xiàng)目后發(fā)生。實(shí)現(xiàn)時(shí),首先將TreeView的HideSelection屬性設(shè)為False,意味著即使TreeView失去焦點(diǎn),先前所選擇的結(jié)點(diǎn)依舊將以灰色背景被顯示出來(lái),這樣可以保留訪問(wèn)TreeView結(jié)點(diǎn)的路徑痕跡;其次在加載本地磁盤(pán)列表時(shí)將“我的電腦”根結(jié)點(diǎn)列為SelectedNode,這樣初始運(yùn)行程序時(shí)相當(dāng)于單擊了我的電腦,也能為后續(xù)查找listview中被激活項(xiàng)目時(shí)提供父結(jié)點(diǎn);(3)在listView1_ItemActivate事件中添加代碼,通過(guò)foreach循環(huán)在TreeView.SelectedNode的集合中查找與ListView被激活項(xiàng)目Text一致的結(jié)點(diǎn),讓其成為新的被選結(jié)點(diǎn)。
4.僅展開(kāi)被選結(jié)點(diǎn)。該功能在Treeview1_AfterExpand事件中實(shí)現(xiàn),該事件在treeview控件中的結(jié)點(diǎn)展開(kāi)后觸發(fā),用來(lái)控制展開(kāi)當(dāng)前結(jié)點(diǎn)的同時(shí),折疊上次打開(kāi)的兄弟結(jié)點(diǎn),判斷當(dāng)前結(jié)點(diǎn)的PreNode和NextNode同級(jí)樹(shù)結(jié)點(diǎn),如果存在就將其折疊,通過(guò)循環(huán),層層深入取得其所有的PreNode和NextNode,將其折疊,直到其不存在為止。
案例教學(xué)法的優(yōu)勢(shì)在于:
第一,引導(dǎo)學(xué)生將所學(xué)課本知識(shí)轉(zhuǎn)化為解決問(wèn)題的實(shí)際應(yīng)用能力;大多數(shù)計(jì)算機(jī)專業(yè)的畢業(yè)生在回答能干什么時(shí),往往列舉一堆課程名稱卻舉不出自己已完成的有代表性的案例項(xiàng)目,而案例教學(xué)法的實(shí)施過(guò)程中,學(xué)生拿到案例后,先進(jìn)行消化,再主動(dòng)搜索腦海中的知識(shí),利用圖書(shū)館、網(wǎng)絡(luò)等途徑查閱資料,相互交流等多種渠道獲取補(bǔ)充新內(nèi)容,這無(wú)形中加深了對(duì)知識(shí)的理解,充分發(fā)揮學(xué)習(xí)主體自身的能動(dòng)性,將知識(shí)轉(zhuǎn)換為能力,這給自身的發(fā)展提供了上升的空間。
第二,促使學(xué)生養(yǎng)成獨(dú)立思考的習(xí)慣,學(xué)生給出的解決方案都是經(jīng)過(guò)獨(dú)立思考、反復(fù)驗(yàn)證而得出的,幾番討論下來(lái)學(xué)生之間相互競(jìng)爭(zhēng),相互激勵(lì),從內(nèi)心深處激發(fā)學(xué)生積極進(jìn)取、刻苦學(xué)習(xí)的信心。
第三,多方交流,教學(xué)相長(zhǎng),在軟件工程中測(cè)試人員和開(kāi)發(fā)人員要相互避開(kāi),就是為了打破開(kāi)發(fā)者的思維定勢(shì),從中找出破綻,完善軟件功能,通過(guò)在課堂上討論,驗(yàn)證,同學(xué)們可以提出自己的見(jiàn)解并質(zhì)疑現(xiàn)有方案,本身就是一個(gè)相互交流,相互提高的過(guò)程。課堂討論是教師直接管理案例教學(xué)的重要階段,筆者認(rèn)為針對(duì)待解決的問(wèn)題讓學(xué)生各抒己見(jiàn),求大同、存小異,通過(guò)具體的代碼驗(yàn)證來(lái)挑選最佳的實(shí)現(xiàn)方案,讓學(xué)生體會(huì)到成功喜悅的同時(shí)引入下一個(gè)問(wèn)題,讓學(xué)生的大腦持續(xù)處于新鮮興奮的狀態(tài),調(diào)動(dòng)其學(xué)習(xí)的積極性。實(shí)踐證明,隨著案例教學(xué)的深入,解決問(wèn)題的周期在逐漸縮短,這表明學(xué)生自主尋求理論知識(shí)來(lái)支撐論點(diǎn)的能力和拓展思維的能力均得到了提高。
通過(guò)該案例的制作,讓學(xué)生們很好地掌握了.net平臺(tái)窗體設(shè)計(jì)程序的全過(guò)程,約700多行的代碼閱讀、代碼改錯(cuò)、規(guī)范化檢查,引領(lǐng)學(xué)生體驗(yàn)程序員的職業(yè)生涯。在此基礎(chǔ)上,提出新思考方向:得到文件路徑和名稱是完成管理文件的第一步,那如何利用.net框架提供的System.IO命名控件中的文件操作類實(shí)現(xiàn)路徑的后退、前進(jìn)、向上,如何對(duì)文件剪切、復(fù)制和粘貼等編輯操作和讀取、寫(xiě)入、查看屬性等操作呢?[5]有了新的思考方向,鼓勵(lì)學(xué)生大膽想象設(shè)計(jì)、查閱資料、編寫(xiě)代碼、運(yùn)行查錯(cuò)、提出解決思路和可行性的實(shí)施方案,讓學(xué)生反復(fù)提煉、歸納總結(jié)自己的經(jīng)驗(yàn),有了這個(gè)成功的教學(xué)案例,今后可在高職層次《C#程序設(shè)計(jì)》案例化教學(xué)進(jìn)程中走得更遠(yuǎn)。
參考文獻(xiàn):
[1][3][4]資源管理器 [EB/OL].CSDN網(wǎng)站, http://download.csdn.net/detail/ZhengZhiRen/1013102.
[2]王平華.C#.NET程序設(shè)計(jì)項(xiàng)目教程[M].北京:中國(guó)鐵道出版社,2008.
[5]楊學(xué)全.C#技術(shù)基礎(chǔ)[M].北京:高等教育出版社,2008.