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