阿宽

Nothing is more powerful than habit!
posts - 692, comments - 385, trackbacks - 19, articles - 4
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

c# ListView控件學習

Posted on 2008-01-16 14:42 宽田 阅读(...) 评论(...) 编辑 收藏

TreeView 使用方法:(在View.Details模式下)
         1、建立TreeView的標題
         2、建立TreeView的Item
         3、在TreeView的Item中的建立SubItem
         
         如果將各部分拆分開來的方法為:
         1、建立TreeView的標題
         2、建立Item
         3、建立SubItem
         4、將SubItem加入到Item中
         5、將Item加入到TreeView中
         
         注:
         在View.Details模式下,Item相當於建立主列中的資料;SubItem相當於建立其它列中的資料。
         其它模式可以不用建立SubItem。

下邊用例子來學習。如實現下圖功能。
代碼:
namespace ListViewExercise
{
    
public partial class Form1 : Form
    {
        
public Form1()
        {
            InitializeComponent();
            ListViewSet();
            CreateViewItemMethodOne();
            
//CreateViewItemMethodTow();
        }

        
/// <summary>
        
/// ListView 設置
        
/// </summary>
        private void ListViewSet()
        {
            
//ListView顯示方式
            listViewControl.View = View.Details;
        }      


        
/// <summary>
        
/// //手動填加ListView方法1
        
/// </summary>
        private void CreateViewItemMethodOne()
        {
            listViewControl.BeginUpdate();
            
#region 增加Item的標題,共有三個列
            
//1、創建標題
            listViewControl.Columns.Add("文件名");
            listViewControl.Columns.Add(
"大小");
            listViewControl.Columns.Add(
"創建日期");
            
#endregion

            
#region 手動填加ListView方法

            
//2、增加第一個Item,在View.Details模式下,有點像第一列中一個值
            listViewControl.Items.Add("folder1","文件夾1",0);
            
//3、增加第一個Item的第一個SubItem,在View.Details模式下,有點像第一列中一個值
            listViewControl.Items["folder1"].SubItems.Add("11");
            
//增加第一個Item的第二個SubItem,在View.Details模式下,有點像第一列中一個值
            listViewControl.Items["folder1"].SubItems.Add("20080114");

            listViewControl.Items.Add(
"folder2","文件夾2",0);
            listViewControl.Items[
"folder2"].SubItems.Add("21");
            listViewControl.Items[
"folder2"].SubItems.Add("20080115");

            listViewControl.Items.Add(
"文件夾3");
            listViewControl.Items.Add(
"文件夾4");

            
#endregion

            listViewControl.EndUpdate();
        }

        
/// <summary>
        
///  手動填加ListView方法2
        
/// </summary>
        private void CreateViewItemMethodTow()
        {
            
#region 增加Item的標題,共有三個列
            
//1、創建標題,共三列
            listViewControl.Columns.Add("文件名");
            listViewControl.Columns.Add(
"大小");
            listViewControl.Columns.Add(
"創建日期");
            
#endregion
            listViewControl.BeginUpdate();

            
#region 增加第一個Item
            
//2、定義一個ListViewItem,在View.Details模式下,有點像第一列中一個值
            ListViewItem lvItem;
            
//3、定義ListViewSubItem,在View.Details模式下,有點像第二列中一個值
            ListViewItem.ListViewSubItem lvSubItem;

            
//實列化一個Item,在View.Details模式下,有點像加第一行的第一個值
            lvItem = new ListViewItem();
            
//Item的顯示的文字
            lvItem.Text = "文件夾1";
            
//4、Item增加到ListView控件中,即增加第一行。在View.Details模式下,有點像增加了第一個項目的第一列的第一個值
            listViewControl.Items.Add(lvItem);
            
            
//實例化SubItem
            lvSubItem = new ListViewItem.ListViewSubItem();
            lvSubItem.Text 
= "10";
            
//5、將SubItem增加到第一個Item中,在View.Details模式下,有點像增加了第一個項目的第二列的第一個值
            lvItem.SubItems.Add(lvSubItem);

            lvSubItem 
= new ListViewItem.ListViewSubItem();
            lvSubItem.Text 
= "20080114";
            
//將SubItem增加到第一個Item中,在View.Details模式下,有點像增加了第一個項目的第三列的第一個值
            lvItem.SubItems.Add(lvSubItem);
            
#endregion

            
#region  增加第二個Item
            lvItem 
= new ListViewItem();
            lvItem.Text 
= "文件夾2";            
            lvSubItem 
= new ListViewItem.ListViewSubItem();
            lvSubItem.Text 
= "20";
            lvItem.SubItems.Add(lvSubItem);
            lvSubItem 
= new ListViewItem.ListViewSubItem();
            lvSubItem.Text 
= "20080115";
            lvItem.SubItems.Add(lvSubItem);
            listViewControl.Items.Add(lvItem);
            
#endregion

            listViewControl.EndUpdate();
        }

    }
}

例2:
     得到指定文件夾下的文件夾及文件名列表。如下圖:

代碼:
using System.IO;

namespace ListViewExercise
{
    
public partial class Form1 : Form
    {
        
public Form1()
        {
            InitializeComponent();
            ListViewSet();
            GetFolderTreeView(
@"c:\");
        }

        
/// <summary>
        
/// ListView 設置
        
/// </summary>
        private void ListViewSet()
        {
            
//ListView顯示方式
            listViewControl.View = View.Details;

     
            
//項目的雙擊事件
            listViewControl.ItemActivate += new EventHandler(listViewControl_ItemActivate);
            
//返回按鈕的事件
            btnReturn.Click+=new EventHandler(btnReturn_Click);
        }

        
/// <summary>
        
/// 得到目錄中的內容
        
/// </summary>
        private void GetFolderTreeView(string asPath)
        {
            listViewControl.Clear();
            
#region 增加Item的標題,共有三個列
            
//創建標題,共三列
            listViewControl.Columns.Add("文件名");
            listViewControl.Columns.Add(
"大小");
            listViewControl.Columns.Add(
"創建日期");
            
#endregion

            
//開始更新
            listViewControl.BeginUpdate();

            DirectoryInfo diInfo 
= new DirectoryInfo(asPath);
            DirectoryInfo[] dirs 
= diInfo.GetDirectories();
            FileInfo[] fiInfo 
= diInfo.GetFiles();

            ListViewItem lviItem;
            ListViewItem.ListViewSubItem lviSubItem;

            
foreach (DirectoryInfo di in dirs)
            {
                lviItem 
= new ListViewItem();
                lviItem.Text 
= di.Name;
                
//得到文件夾的路徑
                lviItem.Tag = di.FullName;

                lviSubItem 
= new ListViewItem.ListViewSubItem();                 
                //文件夾沒有大小
                lviSubItem.Text = "";
                lviItem.SubItems.Add(lviSubItem);

                lviSubItem 
= new ListViewItem.ListViewSubItem();
                lviSubItem.Text 
= di.CreationTime.ToString();
                lviItem.SubItems.Add(lviSubItem);

                listViewControl.Items.Add(lviItem);
            }

            
foreach (FileInfo fi in fiInfo)
            {
                lviItem 
= new ListViewItem();
                lviItem.Text 
= fi.Name;

                lviSubItem 
= new ListViewItem.ListViewSubItem();
                lviSubItem.Text 
= fi.Length.ToString();
                lviItem.SubItems.Add(lviSubItem);

                lviSubItem 
= new ListViewItem.ListViewSubItem();
                lviSubItem.Text 
= fi.CreationTime.ToString();
                lviItem.SubItems.Add(lviSubItem);

                listViewControl.Items.Add(lviItem);
            }
            
//結束更新
            listViewControl.EndUpdate();
        }


        
/// <summary>
        
/// 定義變量存放路徑
        
/// </summary>
        string sfileName = "";

        
/// <summary>
        
/// 項目的雙擊事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        void listViewControl_ItemActivate(object sender, EventArgs e)
        {
            ListView lvControl 
= (ListView)sender;
            sfileName 
= lvControl.SelectedItems[0].Tag.ToString();
            
if (lvControl.SelectedItems[0].Tag.ToString() == "")
            {
                
try
                {
                    System.Diagnostics.Process.Start(sfileName);
                }
                
catch
                {
                    
return;
                }
            }
            
else
            {

                GetFolderTreeView(sfileName);
            }
        }


        
/// <summary>
        
/// 返回上一級
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void btnReturn_Click(object sender, EventArgs e)
        {
            
/*
             原理:得到路徑,然后截取最后一個"\"之前的路徑,並將其路徑賦給你路徑變量。
             再次單擊返回時,截取此變量中最后一個"\"之前的路徑。
             當獲得不到"\"的位置時說明到達頂層。
             
*/
            
int iPosition = sfileName.LastIndexOf("\\"+ 1;
            
if (iPosition > 0)
            {
                
string sA = sfileName.Substring(0, iPosition);
                GetFolderTreeView(sA);
                sfileName 
= sfileName.Substring(0, iPosition - 1); ;
            }
        }

    }
}