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

TestProject.zip
다운로드

▶ MainForm.cs

using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

using DevExpress.Utils;
using DevExpress.XtraTreeList;
using DevExpress.XtraTreeList.Columns;
using DevExpress.XtraTreeList.Data;

namespace DS.Test.WinForm.UI.Developer.PreorderTraversalDataTree
{
    /// <summary>
    /// 메인 폼
    /// </summary>
    public partial class MainForm : Form
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 소스 테이블
        /// </summary>
        private DataTable sourceTable = null;

        #endregion

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

        #region 생성자 - MainForm()

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

            this.treeList.Appearance.HeaderPanel.Font = new Font("나눔고딕코딩", 12f);
            this.treeList.Appearance.Row.Font         = new Font("나눔고딕코딩", 12f);
        }

        #endregion

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

        #region 폼 로드시 처리하기 - Form_Load(sender, e)

        /// <summary>
        /// 폼 로드시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void Form_Load(object sender, EventArgs e)
        {
            Initialize();

            this.sourceTable = GetSampleTable();

            /*
            SetParentID 함수가 아래와 같은 데이터를 사용해 DevExpress TreeList에서 트리를 만들 수 있게 ParentID 값을 설정해준다.

            계정명                             레벨
            ---------------------------------- ----
            미지정                             1
            재료비                             1
                원재료비                       2
                가설재료비                     2
            노무비                             1
                임원급여                       2
                    임원급여                   3
                    임원(잡급)                 3
                    상여금                     3
                    제수당                     3
                    퇴직급여충당금전입액       3
                급료와임금                     2
                    급료와임금                 3
                    급료와임금(안전)           3
                    급료와임금(환경)           3
                    퇴직급여충당금전입액(안전) 3
            */
            SetParentID(this.sourceTable);

            this.treeList.DataSource = this.sourceTable;

            this.treeList.BestFitColumns();
 
            this.treeList.ExpandAll();
        }

        #endregion

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

        #region 초기화 시작하기 - BeginInitialize(treeList)

        /// <summary>
        /// 초기화 시작하기
        /// </summary>
        /// <param name="treeList">트리 리스트</param>
        private void BeginInitialize(TreeList treeList)
        {
            ((ISupportInitialize)treeList).BeginInit();
        }

        #endregion
        #region 초기화 종료하기 - EndInitialize(treeList)

        /// <summary>
        /// 초기화 종료하기
        /// </summary>
        /// <param name="treeList">트리 리스트</param>
        private void EndInitialize(TreeList treeList)
        {
            ((ISupportInitialize)treeList).EndInit();
        }

        #endregion

        #region 트리 리스트 설정하기 - SetTreeList(name, showColumns, enableColumnMenu, autoWidth, showIndicator, showHorzLines, showVertLines, showFocusedFrame,
            enableAppearanceFocusedCell, invertSelection, editable)

        /// <summary>
        /// 트리 리스트 설정하기
        /// </summary>
        /// <param name="name">명칭</param>
        /// <param name="showColumns">컬럼 표시 여부</param>
        /// <param name="enableColumnMenu">컬럼 메뉴 활성화 여부</param>
        /// <param name="autoWidth">자동 너비 여부</param>
        /// <param name="showIndicator">지시가 표시 여부</param>
        /// <param name="showHorzLines">수평선 표시 여부</param>
        /// <param name="showVertLines">수직선 표시 여부</param>
        /// <param name="showFocusedFrame">포커스 프레임 표시 여부</param>
        /// <param name="enableAppearanceFocusedCell">포커스 셀 모양 활성화 여부</param>
        /// <param name="invertSelection">선택 반전 여부</param>
        private void SetTreeList(TreeList treeList, string name, bool showColumns, bool enableColumnMenu, bool autoWidth, bool showIndicator, bool showHorzLines,
            bool showVertLines, bool showFocusedFrame, bool enableAppearanceFocusedCell, bool invertSelection, bool editable)
        {
            treeList.Name                                         = name;
            treeList.OptionsView.ShowColumns                      = showColumns;
            treeList.OptionsMenu.EnableColumnMenu                 = enableColumnMenu;
            treeList.OptionsView.AutoWidth                        = autoWidth;
            treeList.OptionsView.ShowIndicator                    = showIndicator;
            treeList.OptionsView.ShowHorzLines                    = showHorzLines;
            treeList.OptionsView.ShowVertLines                    = showVertLines;
            treeList.OptionsView.ShowFocusedFrame                 = showFocusedFrame;
            treeList.OptionsSelection.EnableAppearanceFocusedCell = enableAppearanceFocusedCell;
            treeList.OptionsSelection.InvertSelection             = invertSelection;
            treeList.OptionsBehavior.Editable                     = editable;
        }

        #endregion
        #region 트리 리스트 설정하기 - SetTreeList(treeList, name)

        /// <summary>
        /// 트리 리스트 설정하기
        /// </summary>
        /// <param name="treeList">트리 리스트</param>
        /// <param name="name">명칭</param>
        private void GetTreeList(TreeList treeList, string name)
        {
            SetTreeList(treeList, name, false, false, false, false, false, false, false, false, true, false);
        }

        #endregion

        #region 트리 리스트 컬럼 구하기 - GetTreeListColumn(caption, fieldName, unboundColumnType, width, horzAlignment, allowEdit, formatType, formatString, visibleIndex)

        /// <summary>
        /// 트리 리스트 컬럼 구하기
        /// </summary>
        /// <param name="caption">제목</param>
        /// <param name="fieldName">필드명</param>
        /// <param name="unboundColumnType">언바운드 컬럼 종류</param>
        /// <param name="width">너비</param>
        /// <param name="horzAlignment">수평 정렬</param>
        /// <param name="allowEdit">편집 허용 여부</param>
        /// <param name="formatType">형식 종류</param>
        /// <param name="formatString">형식 문자열</param>
        /// <param name="visibleIndex">표시 인덱스</param>
        /// <returns>트리 리스트 컬럼 구하기</returns>
        private TreeListColumn GetTreeListColumn(string caption, string fieldName, UnboundColumnType unboundColumnType, int width, HorzAlignment horzAlignment, bool allowEdit,
            FormatType formatType, string formatString, int visibleIndex)
        {
            TreeListColumn treeListColumn = new TreeListColumn();
                
            treeListColumn.Name                                    = string.Empty;
            treeListColumn.Caption                                 = caption;
            treeListColumn.FieldName                               = fieldName;
            treeListColumn.Width                                   = width;
            treeListColumn.AppearanceHeader.Options.UseTextOptions = true;
            treeListColumn.AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center;
            treeListColumn.AppearanceCell.Options.UseTextOptions   = true;
            treeListColumn.AppearanceCell.TextOptions.HAlignment   = horzAlignment;
            treeListColumn.OptionsColumn.AllowEdit                 = allowEdit;
            treeListColumn.Format.FormatType                       = formatType;
            treeListColumn.Format.FormatString                     = formatString;
            treeListColumn.VisibleIndex                            = visibleIndex;
            treeListColumn.Visible                                 = true;
                
            return treeListColumn;
        }

        #endregion
        #region 트리 리스트 컬럼 구하기 - GetTreeListColumn(name, caption, fieldName, width, visibleIndex)

        /// <summary>
        /// 트리 리스트 컬럼 구하기
        /// </summary>
        /// <param name="name">명칭</param>
        /// <param name="caption">제목</param>
        /// <param name="fieldName">필드명</param>
        /// <param name="width">너비</param>
        /// <param name="visibleIndex">표시 인덱스</param>
        /// <returns>트리 리스트 컬럼 구하기</returns>
        private TreeListColumn GetTreeListColumn(string caption, string fieldName, int width, int visibleIndex)
        {
            return GetTreeListColumn(caption, fieldName, UnboundColumnType.String, width, HorzAlignment.Near, false, FormatType.None, null, visibleIndex);
        }

        #endregion

        #region 초기화하기 - Initialize()

        /// <summary>
        /// 초기화하기
        /// </summary>
        private void Initialize()
        {
            BeginInitialize(treeList);

            SetTreeList(this.treeList, string.Empty, true, false, false, false, true, true, true, true, true, false);

            EndInitialize(this.treeList);

            this.treeList.Columns.AddRange
            (
                new TreeListColumn[]
                {
                    GetTreeListColumn("계정코드", "ID"   , UnboundColumnType.String , 100, HorzAlignment.Center, false, FormatType.None, null, 0),
                    GetTreeListColumn("계정명"  , "Name" , UnboundColumnType.String , 200, HorzAlignment.Near  , false, FormatType.None, null, 1),
                    GetTreeListColumn("계층"    , "Level", UnboundColumnType.Integer, 100, HorzAlignment.Far   , false, FormatType.None, null, 2)
                }
            );
        }

        #endregion
        #region 샘플 리스트 구하기 - GetSampleTable()

        /// <summary>
        /// 샘플 리스트 구하기
        /// </summary>
        /// <returns>샘플 리스트</returns>
        private DataTable GetSampleTable()
        {
            DataTable sourceTable = new DataTable();

            sourceTable.Columns.Add(new DataColumn("ID"      , typeof(string)));
            sourceTable.Columns.Add(new DataColumn("Name"    , typeof(string)));
            sourceTable.Columns.Add(new DataColumn("ParentID", typeof(string)));
            sourceTable.Columns.Add(new DataColumn("Level"   , typeof(int   )));

            DataRow row = null;

            row = sourceTable.NewRow(); row["ID"] = "000000"; row["Name"] = "미지정";                     row["ParentID"] = string.Empty; row["Level"] = 1; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "100000"; row["Name"] = "재료비";                     row["ParentID"] = string.Empty; row["Level"] = 1; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "110101"; row["Name"] = "원재료비";                   row["ParentID"] = string.Empty; row["Level"] = 2; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "110102"; row["Name"] = "가설재료비";                 row["ParentID"] = string.Empty; row["Level"] = 2; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "200000"; row["Name"] = "노무비";                     row["ParentID"] = string.Empty; row["Level"] = 1; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "210100"; row["Name"] = "임원급여";                   row["ParentID"] = string.Empty; row["Level"] = 2; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "210101"; row["Name"] = "임원급여";                   row["ParentID"] = string.Empty; row["Level"] = 3; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "210102"; row["Name"] = "임원(잡급)";                 row["ParentID"] = string.Empty; row["Level"] = 3; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "210103"; row["Name"] = "상여금";                     row["ParentID"] = string.Empty; row["Level"] = 3; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "210104"; row["Name"] = "제수당";                     row["ParentID"] = string.Empty; row["Level"] = 3; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "210105"; row["Name"] = "퇴직급여충당금전입액";       row["ParentID"] = string.Empty; row["Level"] = 3; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "210200"; row["Name"] = "급료와임금";                 row["ParentID"] = string.Empty; row["Level"] = 2; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "210201"; row["Name"] = "급료와임금";                 row["ParentID"] = string.Empty; row["Level"] = 3; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "210202"; row["Name"] = "급료와임금(안전)";           row["ParentID"] = string.Empty; row["Level"] = 3; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "210203"; row["Name"] = "급료와임금(환경)";           row["ParentID"] = string.Empty; row["Level"] = 3; sourceTable.Rows.Add(row);
            row = sourceTable.NewRow(); row["ID"] = "210204"; row["Name"] = "퇴직급여충당금전입액(안전)"; row["ParentID"] = string.Empty; row["Level"] = 3; sourceTable.Rows.Add(row);

            ...

            return sourceTable;
        }

        #endregion
        #region 부모 ID 구하기 - GetParentID(sourceTable, index, level)

        /// <summary>
        /// 부모 ID 구하기
        /// </summary>
        /// <param name="sourceTable">목록</param>
        /// <param name="index">인덱스</param>
        /// <param name="level">계층</param>
        /// <returns>부모 ID</returns>
        private string GetParentID(DataTable sourceTable, int index, int level)
        {
            DataRowCollection dataRowCollection = sourceTable.Rows;

            if(level == 1)
            {
                return string.Empty;
            }

            for(int i = index - 1; i > 0; i--)
            {
                if((int)(dataRowCollection[i]["Level"]) < level)
                {
                    return dataRowCollection[i]["ID"] as string;
                }
            }
            
            return string.Empty;
        }

        #endregion
        #region 부모 ID 설정하기 - SetParentID(sourceTable)

        /// <summary>
        /// 부모 ID 설정하기
        /// </summary>
        /// <param name="sourceTable">소스 테이블</param>
        private void SetParentID(DataTable sourceTable)
        {
            DataRowCollection dataRowCollection = sourceTable.Rows;

            DataRow dataRow = null;

            for(int i = 0; i < dataRowCollection.Count; i++)
            {
                string id       =       dataRowCollection[i]["ID"      ] as string;
                string parentID =       dataRowCollection[i]["ParentID"] as string;
                int    level    = (int)(dataRowCollection[i]["Level"   ]);

                if(dataRow == null)
                {
                    dataRowCollection[i]["ParentID"] = string.Empty;

                    dataRow = dataRowCollection[i];
                }
                else
                {
                    string referID       =       dataRow["ID"      ] as string;
                    string referParentID =       dataRow["ParentID"] as string;
                    int    referLevel    = (int)(dataRow["Level"   ]);

                    if(referLevel == level)
                    {
                        dataRowCollection[i]["ParentID"] = referParentID;
                    }
                    else if(referLevel < level)
                    {
                        dataRowCollection[i]["ParentID"] = referID;
                    }
                    else if(referLevel > level)
                    {
                        dataRowCollection[i]["ParentID"] = GetParentID(sourceTable, i - 1, level);
                    }

                    dataRow = dataRowCollection[i];
                }
            }
        }

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

댓글을 달아 주세요