첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

TestProject.zip
다운로드

▶ FileSystemItem.cs

namespace TestProject
{
    /// <summary>
    /// 파일 시스템 항목
    /// </summary>
    public class FileSystemItem
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 항목명 - ItemName

        /// <summary>
        /// 항목명
        /// </summary>
        public string ItemName { get; set; }

        #endregion
        #region 항목 타입 - ItemType

        /// <summary>
        /// 항목 타입
        /// </summary>
        public string ItemType { get; set; }

        #endregion
        #region 항목 크기 - ItemSize

        /// <summary>
        /// 항목 크기
        /// </summary>
        public string ItemSize { get; set; }

        #endregion
        #region 항목 완전한 명칭 - ItemFullName

        /// <summary>
        /// 항목 완전한 명칭
        /// </summary>
        public string ItemFullName { get; set; }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - FileSystemItem(itemName, itemType, itemSize, itemFullName)
    
        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="itemName">항목명</param>
        /// <param name="itemType">항목 타입</param>
        /// <param name="itemSize">항목 크기</param>
        /// <param name="itemFullName">항목 완전한 명칭</param>
        public FileSystemItem(string itemName, string itemType, string itemSize, string itemFullName)
        {
            ItemName     = itemName;
            ItemType     = itemType;
            ItemSize     = itemSize;
            ItemFullName = itemFullName;
        }

        #endregion
    }
}

 

728x90

 

▶ FileSystemDataProvider.cs

using System.IO;

namespace TestProject
{
    /// <summary>
    /// 파일 시스템 데이타 제공자
    /// </summary>
    public static class FileSystemDataProvider
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region 논리 드라이브 배열 구하기 - GetLogicalDriveArray()

        /// <summary>
        /// 논리 드라이브 배열 구하기
        /// </summary>
        /// <returns>논리 드라이브 배열</returns>
        public static string[] GetLogicalDriveArray()
        {
            return Directory.GetLogicalDrives();
        }

        #endregion
        #region 하위 폴더 배열 구하기 - GetSubfolders(folderPath)

        /// <summary>
        /// 하위 폴더 배열 구하기
        /// </summary>
        /// <param name="folderPath">폴더 경로</param>
        /// <returns>하위 폴더 배열</returns>
        public static string[] GetSubfolderArray(string folderPath)
        {
            return Directory.GetDirectories(folderPath);
        }

        #endregion
        #region 하위 파일 배열 구하기 - GetSubfiles(folderPath)

        /// <summary>
        /// 하위 파일 배열 구하기
        /// </summary>
        /// <param name="folderPath">폴더 경로</param>
        /// <returns>하위 파일 배열</returns>
        public static string[] GetSubfileArray(string folderPath)
        {
            return Directory.GetFiles(folderPath);
        }

        #endregion
        #region 폴더명 구하기 - GetFolderName(folderPath)

        /// <summary>
        /// 폴더명 구하기
        /// </summary>
        /// <param name="folderPath">폴더 경로</param>
        /// <returns>폴더명</returns>
        public static string GetFolderName(string folderPath)
        {
            return new DirectoryInfo(folderPath).Name;
        }

        #endregion
        #region 파일명 구하기 - GetFileName(filePath)

        /// <summary>
        /// 파일명 구하기
        /// </summary>
        /// <param name="filePath">파일 경로</param>
        /// <returns>파일명</returns>
        public static string GetFileName(string filePath)
        {
            return new FileInfo(filePath).Name;
        }

        #endregion
        #region 파일 크기 구하기 - GetFileSize(filePath)

        /// <summary>
        /// 파일 크기 구하기
        /// </summary>
        /// <param name="filePath">파일 경로</param>
        /// <returns>파일 크기</returns>
        public static long GetFileSize(string filePath)
        {
            return new FileInfo(filePath).Length;
        }

        #endregion
    }
}

 

300x250

 

▶ MainWindow.xaml

<Window x:Class="TestProject.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
    Width="800"
    Height="600"
    Title="GridControl 클래스 : NodeExpanding 이벤트를 사용해 동적 데이터 로딩하기"
    FontFamily="나눔고딕코딩"
    FontSize="16">
    <Grid>
        <dxg:GridControl Name="gridControl">
            <dxg:GridControl.Columns>
                <dxg:GridColumn FieldName="ItemName"     />
                <dxg:GridColumn FieldName="ItemType"     />
                <dxg:GridColumn FieldName="ItemSize"     />
                <dxg:GridColumn FieldName="ItemFullName" />
            </dxg:GridControl.Columns>
            <dxg:GridControl.View>
                <dxg:TreeListView Name="treeListView"
                    AutoWidth="True" 
                    NodeExpanding="treeListView_NodeExpanding"/>
            </dxg:GridControl.View>
        </dxg:GridControl>
    </Grid>
</Window>

 

▶ MainWindow.xaml.cs

using System.Windows;

using DevExpress.Utils;
using DevExpress.Xpf.Grid;
using DevExpress.Xpf.Grid.TreeList;

namespace TestProject
{
    /// <summary>
    /// 메인 윈도우
    /// </summary>
    public partial class MainWindow : Window
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainWindow()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainWindow()
        {
            InitializeComponent();

            PrepareDriveNodes();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private
        //////////////////////////////////////////////////////////////////////////////// Event

        #region 트리 리스트 뷰 노드 확장시 처리하기 - treeListView_NodeExpanding(sender, e)

        /// <summary>
        /// 트리 리스트 뷰 노드 확장시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void treeListView_NodeExpanding(object sender, TreeListNodeAllowEventArgs e)
        {
            TreeListNode node = e.Node;

            if(node.Tag == null || (bool)node.Tag == false)
            {
                PrepareChildNodes(node);

                node.Tag = true;
            }
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////// Function

        #region 드라이브 노드들 준비하기 - PrepareDriveNodes()

        /// <summary>
        /// 드라이브 노드들 준비하기
        /// </summary>
        public void PrepareDriveNodes()
        {
            this.gridControl.BeginDataUpdate();

            try
            {
                string[] driveArray = FileSystemDataProvider.GetLogicalDriveArray();

                foreach(string drive in driveArray)
                {
                    TreeListNode node = new TreeListNode() { Content = new FileSystemItem(drive, "Drive", "<Drive>", drive) };

                    this.treeListView.Nodes.Add(node);

                    node.IsExpandButtonVisible = DefaultBoolean.True;
                }
            }
            catch
            {
            }

            this.gridControl.EndDataUpdate();
        }

        #endregion
        #region 자식 파일/폴더 소유 여부 조사하기 - HasChildFileOrFolder(folderPath)

        /// <summary>
        ///  자식 파일/폴더 소유 여부 조사하기
        /// </summary>
        /// <param name="folderPath">폴더 경로</param>
        /// <returns>자식 파일/폴더 소유 여부</returns>
        private bool HasChildFileOrFolder(string folderPath)
        {
            string[] filePathArray = FileSystemDataProvider.GetSubfileArray(folderPath);

            if(filePathArray.Length > 0)
            {
                return true;
            }

            string[] folderPathArray = FileSystemDataProvider.GetSubfolderArray(folderPath);

            if(folderPathArray.Length > 0)
            {
                return true;
            }

            return false;
        }

        #endregion
        #region 자식 폴더 노드 준비하기 - PrepareChildFolderNodes(parentNode)

        /// <summary>
        /// 자식 폴더 노드 준비하기
        /// </summary>
        /// <param name="parentNode">부모 노드</param>
        private void PrepareChildFolderNodes(TreeListNode parentNode)
        {
            FileSystemItem parentFileSystemItem = parentNode.Content as FileSystemItem;

            if(parentFileSystemItem == null)
            {
                return;
            }

            try
            {
                string[] subfolderArray = FileSystemDataProvider.GetSubfolderArray(parentFileSystemItem.ItemFullName);

                foreach(string subfolder in subfolderArray)
                {
                    try
                    {
                        TreeListNode childNode = new TreeListNode()
                        {
                            Content = new FileSystemItem
                            (
                                FileSystemDataProvider.GetFolderName(subfolder),
                                "Folder",
                                "<Folder>",
                                subfolder
                            )
                        };

                        parentNode.Nodes.Add(childNode);

                        childNode.IsExpandButtonVisible = HasChildFileOrFolder(subfolder) ? DefaultBoolean.True : DefaultBoolean.False;
                    }
                    catch
                    {
                    }
                }
            }
            catch
            {
            }
        }

        #endregion
        #region 자식 파일 노드 준비하기 - PrepareChildFileNodes(parentNode)

        /// <summary>
        /// 자식 파일 노드 준비하기
        /// </summary>
        /// <param name="parentNode">부모 노드</param>
        private void PrepareChildFileNodes(TreeListNode parentNode)
        {
            FileSystemItem parentFileSystemItem = parentNode.Content as FileSystemItem;

            if(parentFileSystemItem == null)
            {
                return;
            }

            TreeListNode childNode;

            try
            {
                string[] filePathArray = FileSystemDataProvider.GetSubfileArray(parentFileSystemItem.ItemFullName);

                foreach(string filePath in filePathArray)
                {
                    childNode = new TreeListNode()
                    {
                        Content = new FileSystemItem
                        (
                            FileSystemDataProvider.GetFileName(filePath),
                            "File",
                            FileSystemDataProvider.GetFileSize(filePath).ToString(),
                            filePath
                        )
                    };

                    childNode.IsExpandButtonVisible = DefaultBoolean.False;

                    parentNode.Nodes.Add(childNode);
                }
            }
            catch
            {
            }
        }

        #endregion
        #region 자식 노드들 준비하기 - PrepareChildNodes(node)

        /// <summary>
        /// 자식 노드들 준비하기
        /// </summary>
        /// <param name="node">노드</param>
        private void PrepareChildNodes(TreeListNode node)
        {
            this.gridControl.BeginDataUpdate();

            PrepareChildFolderNodes(node);

            PrepareChildFileNodes(node);

            this.gridControl.EndDataUpdate();
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요