■ 트리 테이블 구하기 예제

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

using System;

using System.Collections.Generic;

using System.Data;

 

#region 소스 테이블 구하기 - GetSourceTable()

 

/// <summary>

/// 소스 테이블 구하기

/// </summary>

/// <returns>소스 데이터 테이블</returns>

public DataTable GetSourceTable()

{

    DataTable table = new DataTable();

 

    table.Columns.Add("ID1"  , typeof(string)); // 대분류 ID

    table.Columns.Add("Name1", typeof(string)); // 대분류명

    table.Columns.Add("ID2"  , typeof(string)); // 중분류 ID

    table.Columns.Add("Name2", typeof(string)); // 중분류명

    table.Columns.Add("ID3"  , typeof(string)); // 소분류 ID

    table.Columns.Add("Name3", typeof(string)); // 소분류명

 

    table.Rows.Add("A", "A", "B", "B", "C", "C");

    table.Rows.Add("A", "A", "B", "B", "C", "C");

    table.Rows.Add("A", "A", "B", "B", "C", "C");

    table.Rows.Add("A", "A", "B", "B", "D", "D");

    table.Rows.Add("A", "A", "B", "B", "E", "E");

    table.Rows.Add("A", "A", "B", "B", "E", "E");

    table.Rows.Add("A", "A", "B", "B", "F", "F");

    table.Rows.Add("G", "G", "H", "H", "I", "I");

    table.Rows.Add("G", "G", "H", "H", "J", "J");

 

    table.AcceptChanges();

 

    return table;

}

 

#endregion

 

...

 

DataTable sourceTable = GetSourceTable();

 

List<NodeFieldData> nodeFieldDataList = new List<NodeFieldData>();

 

nodeFieldDataList.Add(new NodeFieldData("ID1", "Name1")); // 대분류 ID, 대분류명

nodeFieldDataList.Add(new NodeFieldData("ID2", "Name2")); // 중분류 ID, 중분류명

nodeFieldDataList.Add(new NodeFieldData("ID3", "Name3")); // 소분류 ID, 소분류명

 

DataTable treeTable = GetTreeTable(sourceTable, nodeFieldDataList, "ParentID", "ID", "Name", "Path", false);

 

/*

결과 트리 데이터 테이블

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

ParentID ID Name Path

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

(NULL)   A  A    A

(NULL)   G  G    G

A        B  B    A/B

G        H  H    G/H

B        C  C    A/B/C

B        D  D    A/B/D

B        E  E    A/B/E

B        F  F    A/B/F

H        I  I    G/H/I

H        J  J    G/H/J

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

*/

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

 

■ 트리 테이블 구하기

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

using System.Collections.Generic;

using System.Data;

using System.Text;

 

/// <summary>

/// 노드 필드 데이터

/// </summary>

public class NodeFieldData

{

    //////////////////////////////////////////////////////////////////////////////////////////////////// Property

    ////////////////////////////////////////////////////////////////////////////////////////// Public

 

    #region ID 필드 - IDField

 

    /// <summary>

    /// ID 필드

    /// </summary>

    public string IDField { get; set; }

 

    #endregion

 

    #region 명칭 필드 - NameField

 

    /// <summary>

    /// 명칭 필드

    /// </summary>

    public string NameField { get; set; }

 

    #endregion

 

    //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

    ////////////////////////////////////////////////////////////////////////////////////////// Public

 

    #region 생성자 - NodeFieldData(idField, nameField)

 

    /// <summary>

    /// 생성자

    /// </summary>

    /// <param name="idField">ID 필드</param>

    /// <param name="nameField">명칭 필드</param>

    public NodeFieldData(string idField, string nameField)

    {

        IDField   = idField;

        NameField = nameField;

    }

 

    #endregion

}

 

#region 트리 데이터 경로 구하기 - GetTreeDataPath(nodeFieldDataList, treeLevel, levelSourceRow)

 

/// <summary>

/// 트리 데이터 경로 구하기

/// </summary>

/// <param name="nodeFieldDataList">노드 필드 데이터 리스트</param>

/// <param name="treeLevel">트리 레벨</param>

/// <param name="levelSourceRow">레벨 소스 행</param>

/// <returns>트리 데이터 경로</returns>

public string GetTreeDataPath(List<NodeFieldData> nodeFieldDataList, int treeLevel, DataRow levelSourceRow)

{

    StringBuilder stringBuilder = new StringBuilder();

 

    for(int i = 0; i < treeLevel + 1; i++)

    {

        if(stringBuilder.Length > 0)

        {

            stringBuilder.Append("/");

        }

 

        stringBuilder.Append(levelSourceRow[nodeFieldDataList[i].IDField].ToString());

    }

 

    return stringBuilder.ToString();

}

 

#endregion

 

#region 트리 테이블 구하기 - GetTreeTable(sourceTable, nodeFieldDataList, targetParentIDField, targetIDField,

    targetNameField, targetPathField, includeSourceColumn)

 

/// <summary>

/// 트리 테이블 구하기

/// </summary>

/// <param name="sourceTable">소스 테이블</param>

/// <param name="nodeFieldDataList">노드 필드 데이터 리스트</param>

/// <param name="targetParentIDField">타겟 부모 ID 필드</param>

/// <param name="targetIDField">타겟 ID 필드</param>

/// <param name="targetNameField">타겟 명칭 필드</param>

/// <param name="targetPathField">타겟 경로 필드</param>

/// <param name="includeSourceColumn">소스 컬럼 포함 여부</param>

/// <returns>트리 테이블</returns>

public DataTable GetTreeTable(DataTable sourceTable, List<NodeFieldData> nodeFieldDataList, string targetParentIDField,

    string targetIDField, string targetNameField, string targetPathField, bool includeSourceColumn)

{

    #region 타겟 테이블을 생성한다.

 

    DataTable targetTable = new DataTable();

 

    targetTable.Columns.Add(targetParentIDField, typeof(string));

    targetTable.Columns.Add(targetIDField      , typeof(string));

    targetTable.Columns.Add(targetNameField    , typeof(string));

    targetTable.Columns.Add(targetPathField    , typeof(string));

 

    if(includeSourceColumn)

    {

        for(int i = 0; i < nodeFieldDataList.Count; i++)

        {

            targetTable.Columns.Add(nodeFieldDataList[i].IDField, typeof(string));

        }

    }

 

    #endregion

 

    #region 소스 테이블이 없는 경우 종료한다.

 

    if(sourceTable == null || sourceTable.Rows.Count == 0)

    {

        return targetTable;

    }

 

    #endregion

 

    for(int i = 0; i < nodeFieldDataList.Count; i++)

    {

        DataView levelSourceView = new DataView(sourceTable);

 

        #region 계층별 필드 리스트를 생성한다.

 

        List<string> fieldList = new List<string>();

 

        for(int j = 0; j <= i; j++)

        {

            fieldList.Add(nodeFieldDataList[j].IDField  );

            fieldList.Add(nodeFieldDataList[j].NameField);

        }

 

        #endregion

 

        #region 계층별 소스 테이블을 생성한다.

 

        DataTable levelSourceTable = levelSourceView.ToTable(true, fieldList.ToArray());

 

        #endregion

 

        foreach(DataRow levelSourceRow in levelSourceTable.Rows)

        {

            #region 타겟 행을 생성한다.

 

            DataRow targetRow = targetTable.NewRow();

 

            targetRow[targetParentIDField] = i == 0 ? null : levelSourceRow[fieldList[fieldList.Count - 4]];

            targetRow[targetIDField      ] =                 levelSourceRow[fieldList[fieldList.Count - 2]];

            targetRow[targetNameField    ] =                 levelSourceRow[fieldList[fieldList.Count - 1]];

            targetRow[targetPathField    ] = GetTreeDataPath(nodeFieldDataList, i, levelSourceRow);

 

            if(includeSourceColumn)

            {

                for(int k = 0; k < nodeFieldDataList.Count; k++)

                {

                    try

                    {

                        targetRow[nodeFieldDataList[k].IDField] = levelSourceRow[nodeFieldDataList[k].IDField];

                    }

                    catch

                    {

                        targetRow[nodeFieldDataList[k].IDField] = string.Empty;

                    }

                }

            }

 

            #endregion

 

            targetTable.Rows.Add(targetRow);

        }

 

        levelSourceView.Dispose();

    }

 

    targetTable.AcceptChanges();

 

    return targetTable;

}

 

#endregion

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

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요