728x90
반응형
728x170
▶ 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
반응형
그리드형(광고전용)
'DevExpress > WinForm' 카테고리의 다른 글
[DEVEXPRESS/WINFORM] RichEditControl 클래스 : COPY/PASTE 편집시 관리 디버깅 도우미 "DisconnectedContext" 오류 처리하기 (0) | 2018.05.12 |
---|---|
[DEVEXPRESS/WINFORM] GridView 클래스 : 포커스 행 표시 숨기기 (0) | 2018.04.08 |
[DEVEXPRESS/WINFORM] WindowsFormsSettings 클래스 : ForceDirectXPaint 정적 메소드를 사용해 DirectX로 컨트롤 칠하기 (0) | 2018.03.15 |
[DEVEXPRESS/WINFORM] GridControl 클래스 : TreeView 드래그 & 드롭 사용하기 (0) | 2018.02.17 |
[DEVEXPRESS/WINFORM] BandedGridView 클래스 : 컬럼 헤더 병합하기 (0) | 2018.02.15 |
[DEVEXPRESS/WINFORM] 그리드 셀에서 아이콘 표시하기 (0) | 2018.02.14 |
[DEVEXPRESS/WINFORM] BandedGridView 클래스 : 컬럼 헤더 병합하기 (0) | 2018.02.14 |
[DEVEXPRESS/WINFORM] TreeList 클래스 : 코드로 생성하기 (0) | 2018.02.14 |
[DEVEXPRESS/WINFORM] 메뉴를 코드로 생성하기 (0) | 2018.02.14 |
[DEVEXPRESS/WINFORM] GridView 클래스 : 코드로 생성하기 (0) | 2018.02.14 |
댓글을 달아 주세요