C# 系统应用之ListView控件 (二).加载选中节点文件夹下文件信息
在項(xiàng)目中的前面一篇文章"C# 系統(tǒng)應(yīng)用之TreeView控件 (一).顯示樹(shù)狀磁盤文件目錄及加載圖標(biāo)"中我講述了如何使用TreeView控件樹(shù)狀實(shí)現(xiàn)顯示"我的電腦"所有磁盤路徑下的文件夾,并加載圖標(biāo)如下圖所示.
此篇文章我需要講述的是當(dāng)鼠標(biāo)點(diǎn)擊左邊的TreeView控件中的文件夾時(shí),如何實(shí)現(xiàn)在右邊的ListView控件中顯示相應(yīng)的文件,并顯示文件的名稱、大小、類型屬性.主要運(yùn)用的知識(shí)是如何實(shí)現(xiàn)ListView顯示信息,Subitems()函數(shù)增加子項(xiàng),如何設(shè)置列表頭等信息.運(yùn)行結(jié)果如下圖所示:
一.Load函數(shù)中加載ListView列標(biāo)題頭
在前篇文章基礎(chǔ)上,把控件filesList(ListView控件)拉長(zhǎng),并設(shè)置Form1的屬性FormBorderStyle(窗體邊框和標(biāo)題欄外觀)為FixedSingle,此時(shí)該窗體不能拖動(dòng)拉長(zhǎng).通過(guò)Form1_Load()函數(shù)初始加載ListView的標(biāo)題頭(名稱、大小、類型).代碼如下:
/// <summary> /// 窗體加載Load事件 初始化 /// </summary> private void Form1_Load(object sender, EventArgs e) {....//調(diào)用SetListView()函數(shù)初始化設(shè)置ListViewSetListView(); } /// <summary> /// 自定義函數(shù)設(shè)置ListView控件初始屬性 /// </summary> private void SetListView() {//行和列是否顯示網(wǎng)格線this.filesList.GridLines = false;//顯示方式(注意View是Details詳細(xì)顯示)this.filesList.View = View.Details;//是否可編輯this.filesList.LabelEdit = true;//沒(méi)有足夠的空間顯示時(shí),是否添加滾動(dòng)條this.filesList.Scrollable = true;//對(duì)表頭進(jìn)行設(shè)置this.filesList.HeaderStyle = ColumnHeaderStyle.Clickable;//是否可以選擇行this.filesList.FullRowSelect = true;//設(shè)置listView列標(biāo)題頭 寬度為9/13 2/13 2/13 //其中設(shè)置標(biāo)題頭自動(dòng)適應(yīng)寬度,-1根據(jù)內(nèi)容設(shè)置寬度,-2根據(jù)標(biāo)題設(shè)置寬度this.filesList.Columns.Add("名稱", 9 * filesList.Width / 13); this.filesList.Columns.Add("大小", 2 * filesList.Width / 13);this.filesList.Columns.Add("類型", 2 * filesList.Width / 13); }二.AfterSelect事件實(shí)現(xiàn)ListView加載數(shù)據(jù)
現(xiàn)在需要在"解決方案"中點(diǎn)擊directoryTree(TreeView控件,左邊的樹(shù)狀圖控件)添加AfterSelect事件,當(dāng)選中某個(gè)節(jié)點(diǎn)后,通過(guò)該事件顯示該文件夾下的所有文件信息.代碼如下:
#region ListView顯示選中文件夾中文件內(nèi)容 /// <summary> /// 獲取節(jié)點(diǎn)的路徑:遞歸調(diào)用產(chǎn)生節(jié)點(diǎn)對(duì)應(yīng)文件夾的路徑 /// </summary> /// <param name="node"></param> /// <returns></returns> private string GetPathFromNode(TreeNode node) {//注意:樹(shù)形控件中我只賦值Tag\Name,使用Text時(shí)賦值即可使用if (node.Parent == null){return node.Name;}//Path.Combine組合產(chǎn)生路徑 如 Path.Combine("A","B")則生成"A\\B"return Path.Combine(GetPathFromNode(node.Parent), node.Name); }/// <summary> /// 更改選定內(nèi)容后發(fā)生 后去當(dāng)前節(jié)點(diǎn)名字 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void directoryTree_AfterSelect(object sender, TreeViewEventArgs e) {try{//定義變量long length; //文件大小string path; //文件路徑TreeNode clickedNode = e.Node; //獲取當(dāng)前選中結(jié)點(diǎn)//移除ListView所有項(xiàng) this.filesList.Items.Clear(); //獲取路徑賦值path if (clickedNode.Tag.ToString() == "我的文檔"){//獲取計(jì)算機(jī)我的文檔文件夾path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);}else{//通過(guò)自定義函數(shù)GetPathFromNode獲取結(jié)點(diǎn)路徑path = GetPathFromNode(clickedNode);}//由于"我的電腦"為空結(jié)點(diǎn),無(wú)需處理,否則會(huì)出現(xiàn)路徑獲取錯(cuò)誤或沒(méi)有找到"我的電腦"路徑if (clickedNode.Tag.ToString() != "我的電腦"){//數(shù)據(jù)更新 UI暫時(shí)掛起直到EndUpdate繪制控件,可以有效避免閃爍并大大提高加載速度this.filesList.BeginUpdate();//實(shí)例目錄與子目錄DirectoryInfo dir = new DirectoryInfo(path);//獲取當(dāng)前目錄文件列表FileInfo[] fileInfo = dir.GetFiles();//循環(huán)輸出獲取文件信息for (int i = 0; i < fileInfo.Length; i++){ListViewItem listItem = new ListViewItem();//listItem.SubItems[0].Text = fileInfo[i].Name; //文件名(方法二)listItem.Text = "[" + (i + 1) + "] " + fileInfo[i].Name; //顯示文件名listItem.ForeColor = Color.Blue; //設(shè)置行顏色//length/1024轉(zhuǎn)換為KB字節(jié)數(shù)整數(shù)值 Ceiling返回最小整數(shù)值 Divide除法length = fileInfo[i].Length; //獲取當(dāng)前文件大小listItem.SubItems.Add(Math.Ceiling(decimal.Divide(length, 1024)) + " KB");//獲取文件最后訪問(wèn)時(shí)間//listItem.SubItems.Add(fileInfo[i].LastWriteTime.ToString());//獲取文件擴(kuò)展名時(shí)可用Substring除去點(diǎn) 否則顯示".txt文件"listItem.SubItems.Add(fileInfo[i].Extension + "文件");//加載數(shù)據(jù)至filesListthis.filesList.Items.Add(listItem);}//結(jié)束數(shù)據(jù)處理,UI界面一次性繪制 否則可能出現(xiàn)閃動(dòng)情況this.filesList.EndUpdate(); }}catch (Exception msg) //異常處理{MessageBox.Show(msg.Message);} } #endregion三.遇到的問(wèn)題
這篇文章看似簡(jiǎn)單,其實(shí)過(guò)程遇到很多問(wèn)題還是值得學(xué)習(xí)的.
1.遇到的第一個(gè)問(wèn)題就是為什么使用ListView控件總是只顯示第一列數(shù)據(jù)呢?為什么設(shè)置了列標(biāo)題Columns沒(méi)有顯示出來(lái)呢?
因?yàn)槲以诔绦蛑谐跏蓟笥痔砑右欢未afilesList.View = View.List;設(shè)置了View顯示的視圖為L(zhǎng)ist.而View屬性包括五種顯示方式:Details(詳細(xì)信息)、List(列表)、LargeIcon(大圖標(biāo))、SmallIcon(小圖標(biāo))、Tile.默認(rèn)時(shí)LargeIcon此時(shí)顯示為亂序,如果想顯示詳細(xì)信息一行一行的需要設(shè)置為Details.
這里推薦大家閱讀夜之子的"C# ListView用法詳解",真心神作!此處引用他文章中的4張圖區(qū)別View不同屬性顯示情況.
?
?
2.遇到的第二個(gè)問(wèn)題主要是如何添加數(shù)據(jù)?如何添加列標(biāo)題頭?
可以采用listItem.SubItems[0].Text添加,但是listItem.SubItems[1]時(shí)會(huì)報(bào)錯(cuò)"InvalidArgument="1"的值對(duì)于"Index"無(wú)效.參數(shù):index".估計(jì)原因是tem沒(méi)有填入123,所以我采用的方法是listItem.SubItems.Add添加.
3.使用"this.filesList.BeginUpdate()"和"this.filesList.EndUpdate()"數(shù)據(jù)更新時(shí)UI暫時(shí)掛起直到EndUpdate繪制控件,可以有效避免閃爍并大大提高加載速度.否則由于加載數(shù)據(jù)較大時(shí)會(huì)出現(xiàn)閃爍或空白遮擋等問(wèn)題.
四.總結(jié)
最后希望該文章對(duì)大家有所幫助,感謝上面提到的文章及作者.同時(shí)如果文章中有錯(cuò)誤或不足之處請(qǐng)?jiān)?有問(wèn)題或建議者亦可提出.希望尊重作者勞動(dòng)果實(shí).接下來(lái)想實(shí)現(xiàn)的是使用API函數(shù)添加文件圖標(biāo)和實(shí)現(xiàn)右鍵打開(kāi)文件和刪除文件的操作.僅以此篇文章紀(jì)念自己在CSDN發(fā)表50篇博客.
文件免費(fèi)下載地址:http://download.csdn.net/detail/eastmount/7041767
MFC實(shí)現(xiàn)該功能類似文章:http://blog.csdn.net/eastmount/article/details/19120567
(By:Eastmount 2014-3-14 下午6點(diǎn) 原創(chuàng)CSDNhttp://blog.csdn.net/eastmount/)
總結(jié)
以上是生活随笔為你收集整理的C# 系统应用之ListView控件 (二).加载选中节点文件夹下文件信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# 系统应用之透明罩MyOpaqueL
- 下一篇: C# 系统应用之使用Pancel控件同一