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

■ GridControl 클래스 : NodeExpanding 이벤트를 사용해 동적 데이터 로딩하기

------------------------------------------------------------------------------------------------------------------------


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

    }

}

 

 

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

    }

}

 

 

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

    }

}

 

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker

댓글을 달아 주세요