첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

728x90
반응형

TestProject.zip
다운로드

▶ MainForm.cs

using System.IO;
using System.Windows.Forms;

using DevExpress.Utils;
using DevExpress.XtraEditors;
using DevExpress.XtraTreeList;
using DevExpress.XtraTreeList.Columns;
using DevExpress.XtraTreeList.Nodes;

namespace TestProject
{
    /// <summary>
    /// 메인 폼
    /// </summary>
    public partial class MainForm : XtraForm
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainForm()

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

            TreeListColumn fullNameColumn = new TreeListColumn();

            fullNameColumn.FieldName = "FullName";
            fullNameColumn.Caption   = "FullName";

            TreeListColumn nameColumn = new TreeListColumn();

            nameColumn.FieldName    = "Name";
            nameColumn.Caption      = "Name";
            nameColumn.MinWidth     = 30;
            nameColumn.Width        = 250;
            nameColumn.VisibleIndex = 0;

            TreeListColumn typeColumn = new TreeListColumn();

            typeColumn.FieldName    = "Type";
            typeColumn.Caption      = "Type";
            typeColumn.Width        = 100;
            typeColumn.VisibleIndex = 1;

            TreeListColumn sizeColumn = new TreeListColumn();

            sizeColumn.FieldName                             = "Size";
            sizeColumn.Caption                               = "Size(Bytes)";
            sizeColumn.AppearanceCell.Options.UseTextOptions = true;
            sizeColumn.AppearanceCell.TextOptions.HAlignment = HorzAlignment.Far;
            sizeColumn.Format.FormatType                     = FormatType.Numeric;
            sizeColumn.Format.FormatString                   = "n0";
            sizeColumn.Width                                 = 100;
            sizeColumn.VisibleIndex                          = 2;

            this.treeList.Columns.AddRange
            (
                new TreeListColumn[]
                {
                    fullNameColumn,
                    nameColumn,
                    typeColumn,
                    sizeColumn
                }
            );

            this.treeList.OptionsView.AutoWidth          = false;
            this.treeList.OptionsBehavior.AutoNodeHeight = false;
            this.treeList.OptionsBehavior.Editable       = false;
            this.treeList.StateImageList                 = this.imageList;
            
            this.treeList.BeforeExpand  += treeList_BeforeExpand;
            this.treeList.AfterExpand   += treeList_AfterExpand;
            this.treeList.AfterCollapse += treeList_AfterCollapse;

            AddFolderNode("C:\\", null);

            this.treeList.BestFitColumns();
        }

        #endregion

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

        #region 트리 리스트 확장 전 처리하기 - treeList_BeforeExpand(sender, e)

        /// <summary>
        /// 트리 리스트 확장 전 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void treeList_BeforeExpand(object sender, BeforeExpandEventArgs e)
        {
            if(e.Node.Tag != null)
            {
                Cursor cursor = Cursor.Current;

                Cursor.Current = Cursors.WaitCursor;

                AddFolderNode(e.Node.GetDisplayText("FullName"), e.Node);

                e.Node.Tag = null;

                Cursor.Current = cursor;
            }
        }

        #endregion
        #region 트리 리스트 확장 후 처리하기 - treeList_AfterExpand(sender, e)

        /// <summary>
        /// 트리 리스트 확장 후 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void treeList_AfterExpand(object sender, NodeEventArgs e)
        {
            if(e.Node.StateImageIndex != 1)
            {
                e.Node.StateImageIndex = 2;
            }
        }

        #endregion
        #region 트리 리스트 축소 후 처리하기 - treeList_AfterCollapse(sender, e)

        /// <summary>
        /// 트리 리스트 축소 후 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void treeList_AfterCollapse(object sender, NodeEventArgs e)
        {
            if(e.Node.StateImageIndex != 1)
            {
                e.Node.StateImageIndex = 0;
            }
        }

        #endregion

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

        #region 파일 소유 여부 구하기 - HasFile(parentPath)

        /// <summary>
        /// 파일 소유 여부 구하기
        /// </summary>
        /// <param name="parentPath">부모 경로</param>
        /// <returns>파일 소유 여부</returns>
        private bool HasFile(string parentPath)
        {
            string[] pathArray = Directory.GetFiles(parentPath);

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

            pathArray = Directory.GetDirectories(parentPath);

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

            return false;
        }

        #endregion
        #region 파일 노드 추가하기 - AddFileNode(parentPath, parentNode)

        /// <summary>
        /// 파일 노드 추가하기
        /// </summary>
        /// <param name="parentPath">부모 경로</param>
        /// <param name="parentNode">부모 노드</param>
        private void AddFileNode(string parentPath, TreeListNode parentNode)
        {
            TreeListNode node;

            FileInfo fileInfo;

            try
            {
                string[] pathArray = Directory.GetFiles(parentPath);

                foreach(string path in pathArray)
                {
                    fileInfo = new FileInfo(path);

                    node = this.treeList.AppendNode
                    (
                        new object[]
                        {
                            path,
                            fileInfo.Name,
                            "File",
                            fileInfo.Length
                        },
                        parentNode
                    );

                    node.StateImageIndex = 1;

                    node.HasChildren = false;
                }
            }
            catch
            {
            }
        }

        #endregion
        #region 폴더 노드 추가하기 - AddFolderNode(parentPath, parentNode)

        /// <summary>
        /// 폴더 노드 추가하기
        /// </summary>
        /// <param name="parentPath">부모 경로</param>
        /// <param name="parentNode">부모 노드</param>
        private void AddFolderNode(string parentPath, TreeListNode parentNode)
        {
            this.treeList.BeginUnboundLoad();

            TreeListNode  node;
            DirectoryInfo directoryInfo;

            try
            {
                string[] pathArray = Directory.GetDirectories(parentPath);

                foreach(string path in pathArray)
                {
                    try
                    {
                        directoryInfo = new DirectoryInfo(path);

                        node = treeList.AppendNode
                        (
                            new object[]
                            {
                                path,
                                directoryInfo.Name,
                                "Folder",
                                null
                            },
                            parentNode
                        );

                        node.StateImageIndex = 0;

                        node.HasChildren = HasFile(path);

                        if(node.HasChildren)
                        {
                            node.Tag = true;
                        }
                    }
                    catch
                    {
                    }
                }
            }
            catch
            {
            }

            AddFileNode(parentPath, parentNode);

            this.treeList.EndUnboundLoad();
        }

        #endregion
    }
}
728x90
반응형

'DevExpress > WinForm' 카테고리의 다른 글

[DEVEXPRESS/WINFORM] TreeListColumn 클래스 : Format 속성을 사용해 컬럼 포맷 설정하기  (0) 2020.05.30
[DEVEXPRESS/WINFORM] TreeListNode 클래스 : Expanded 속성을 사용해 노드 확장하기  (0) 2020.05.30
[DEVEXPRESS/WINFORM] TreeList 클래스 : 밴드 레이아웃 사용하기  (0) 2020.05.30
[DEVEXPRESS/WINFORM] TreeListColumn 클래스 : GetEnumerator 메소드를 사용해 자식 노드 값 변경하기  (0) 2020.05.30
[DEVEXPRESS/WINFORM] TreeList 클래스 : VirtualTreeGetChildNodes 이벤트를 사용해 언바운드 모드 데이터 동적 로딩하기  (0) 2020.05.30
[DEVEXPRESS/WINFORM] TreeList 클래스 : BeforeExpand 이벤트를 사용해 언바운드 모드 데이터 동적 로딩하기  (0) 2020.05.30
[DEVEXPRESS/WINFORM] TreeList 클래스 : AppendNode 메소드를 사용해 언바운드 모드 노드 만들기  (0) 2020.05.30
[DEVEXPRESS/WINFORM] TreeList 클래스 : CustomDrawNodeImages 이벤트를 사용해 노드 이미지 커스텀 그리기  (0) 2020.05.30
[DEVEXPRESS/WINFORM] TreeList 클래스 : GetSelectImage 이벤트를 사용해 포커스 노드 이미지 설정하기  (0) 2020.05.30
[DEVEXPRESS/WINFORM] TreeList 클래스 : GetStateImage 이벤트를 사용해 체크 노드 상태 이미지 설정하기  (0) 2020.05.30
[DEVEXPRESS/WINFORM] TreeList 클래스 : GetStateImage 이벤트를 사용해 노드 상태 이미지 설정하기  (0) 2020.05.30
Posted by 사용자 icodebroker

댓글을 달아 주세요