리스트뷰

sz L·2023년 4월 10일

씨샵 윈폼

목록 보기
5/7
post-thumbnail

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace wf06_listview
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            string currFolder = Environment.CurrentDirectory;      // 현재 프로그램 실행경로 ./bin/debug/
            DirectoryInfo di = new DirectoryInfo(currFolder);
            FileInfo[] files = di.GetFiles();           //현재 디렉토리내 파일 배열

            LsvFiles.BeginUpdate();             //업데이트 완료전까진 UI 갱신 중지
            LsvFiles.View = View.Details;       //리스트뷰 화면 자세히 보기
            CboView.SelectedIndex = 0;          // 뷰보기 콤보박스의 첫번째 값으로 설정

            // ListView에 사용할 아이콘 지정 // 코딩으로 해도 되고 디자이ㅣ너에서 해도 됨
            LsvFiles.LargeImageList = ImgLargeIcon;
            LsvFiles.SmallImageList = ImgSmallIcon;

            foreach (FileInfo file in files)
            {
                // 각 파일별로 ListViewItem 객체를 만들어서 하나씩 지정
                ListViewItem lvi = new ListViewItem(file.Name); // 리스트뷰 첫번째 값
                lvi.SubItems.Add(file.LastWriteTime.ToString());
                
                var ext = Path.GetExtension(file.Name);
                var extName = "";
                switch (ext){
                    case ".exe":
                        extName = "응용 프로그램";
                        break;
                    case ".config":
                        extName = "Configuration 원본 파일";
                        break;
                    case ".pdb":
                        extName = "Program Debug Database";
                        break;
                    default:
                        extName = "기타";
                        break;
                }

                if(ext == ".exe")
                {
                    lvi.ImageIndex = 0;
                }
                else
                {
                    lvi.ImageIndex = 1;
                }

                lvi.SubItems.Add(extName); // 유형
                var fileSize = file.Length / 1024;
                lvi.SubItems.Add(string.Format("{0} KB", fileSize));
                // 아이콘은 나중에

                LsvFiles.Items.Add(lvi);
            }

            LsvFiles.EndUpdate(); // 업데이트 끝났으니 UI갱신
        }

        private void CboView_SelectedIndexChanged(object sender, EventArgs e)
        {
            var indexVal = CboView.SelectedIndex;
            switch(indexVal)
            {
                case 0:
                    LsvFiles.View = View.Details;
                    break;
                case 1:
                    LsvFiles.View = View.List;
                    break;
                case 2:
                    LsvFiles.View = View.Tile;
                    break;
                case 3:
                    LsvFiles.View = View.SmallIcon;
                    break;
                case 4:
                    LsvFiles.View = View.LargeIcon;
                    break;
                default:
                    LsvFiles.View = View.Details;
                    break;
            }
        }
    }
}






파일탐색기 만들기(트리뷰까지)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace wf07_myexplorer
{
    public partial class FrmExplorer : Form
    {
        public FrmExplorer()
        {
            InitializeComponent();
        }

        private void FrmExplorer_Load(object sender, EventArgs e)
        {
            // 현재 사용자 출력
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            LblPath.Text = identity.Name;

            //현재 컴퓨터에 존재하는 드라이브 정보 검색, 트리뷰 추가
            DriveInfo[] drives = DriveInfo.GetDrives();

            //트리뷰에 전부 추가
            foreach (DriveInfo drive in drives)
            {
                if(drive.DriveType == DriveType.Fixed)
                {
                    TreeNode rootNode = new TreeNode(drive.Name);
                    rootNode.ImageIndex = 0;
                    rootNode.SelectedImageIndex = 0;
                    TrvDrive.Nodes.Add(rootNode);
                    FillNodes(rootNode);
                }
            }
            TrvDrive.Nodes[0].Expand();

            //리스트 뷰 설정
            LsvFolder.View = View.Details;
            LsvFolder.Columns.Add("이름", (LsvFolder.Width / 3), HorizontalAlignment.Left);
            LsvFolder.Columns.Add("날짜", (LsvFolder.Width / 4), HorizontalAlignment.Left);
            LsvFolder.Columns.Add("유형", (LsvFolder.Width / 5), HorizontalAlignment.Left);
            LsvFolder.Columns.Add("크기", (LsvFolder.Width / 5), HorizontalAlignment.Left);

            LsvFolder.FullRowSelect = true; // 한 행을 전부 선택
        }

        private void FillNodes(TreeNode curNode)
        {
            try
            {
                DirectoryInfo dir = new DirectoryInfo(curNode.FullPath);
                //드라이브 하위폴더
                foreach(DirectoryInfo item in dir.GetDirectories())
                {
                    TreeNode newNode = new TreeNode(item.Name);
                    newNode.ImageIndex = 1;
                    newNode.SelectedImageIndex = 2;
                    curNode.Nodes.Add(newNode);
                    newNode.Nodes.Add("*");
                }
            }
            catch (Exception)
            {

                MessageBox.Show("트리 오류발생!","오류 :",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
        }


        //sender : 자기자신 객체 내용 , e : 이벤트와 관련된 속성 포함
        private void TrvDrive_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            if (e.Node.Nodes[0].Text =="*")
            {
                e.Node.Nodes.Clear();
                e.Node.ImageIndex = 1;          // folder - normal
                e.Node.SelectedImageIndex= 2;   // folder - open
                FillNodes(e.Node);              // 하위폴더를 만들어줌

            }
        }

        /// <summary>
        ///  트리뷰 접기전 이벤트
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TrvDrive_BeforeCollapse(object sender, TreeViewCancelEventArgs e)
        {
            e.Node.ImageIndex= 1;
            e.Node.SelectedImageIndex = 1;
        }

        /// <summary>
        ///  트리노드를 마우스 클릭이벤트
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TrvDrive_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            SetLsvFolder(e.Node.FullPath);
        }

        private void SetLsvFolder(string fullPath)
        {
            try
            {
                LsvFolder.Items.Clear();        // 기존 리스트 삭제
                DirectoryInfo dir = new DirectoryInfo(fullPath);
                int dirCount = 0;
                foreach (DirectoryInfo item in dir.GetDirectories())
                {
                    ListViewItem lvi = new ListViewItem();

                    lvi.ImageIndex = 1;
                    lvi.Text = item.Name;       // 0번 인덱스

                    LsvFolder.Items.Add(lvi);
                    LsvFolder.Items[dirCount].SubItems.Add(item.CreationTime.ToString());
                    LsvFolder.Items[dirCount].SubItems.Add("폴더");
                    LsvFolder.Items[dirCount].SubItems.Add(string.Format("{0} files", item.GetFiles().Length.ToString()));

                    dirCount++;
                }   // 폴더내 디렉토리 리스트뷰에 리스트업

                // 파일 목록 리스트업
                FileInfo[] files = dir.GetFiles();
                int fileCount = dirCount;       //이전 카운트가 승계되야함

                foreach(FileInfo file in files)
                {
                    LsvFolder.Items.Add(file.Name);
                    if(file.LastAccessTime != null)
                    {
                        LsvFolder.Items[fileCount].SubItems.Add(file.LastWriteTime.ToString());
                    }
                    else
                    {
                        LsvFolder.Items[fileCount].SubItems.Add(file.CreationTime.ToString());
                    }
                    LsvFolder.Items[fileCount].SubItems.Add(file.Attributes.ToString());
                    LsvFolder.Items[fileCount].SubItems.Add(file.Length.ToString());

                    fileCount++;
                }
            }
            catch (Exception)
            {

                MessageBox.Show("리스트뷰 오류발생!", "오류 :", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
        }
    }
}



마무리

profile
가랑비는 맞는다 하지만 폭풍은 내 것이야

0개의 댓글