Programming/C#

[C#] DataTable → Treeview

Foolishdevil 2011. 6. 30. 20:56
DataTable에 있는 계층적 데이터를 트리뷰로 보여주는 방법..
일단 보여줘야되는 데이터를 dataTable로 받아온다..
받아온 DataTable → DataRow[] 로변환한다. 
이후 재귀함수를 이용하여 트리뷰에 보여주기전 재귀함수 작업을 진행한다..

출처 : 어느 인터넷 ... (죄송: 급하게 찾다보니 출처를 까먹었네요 저작권에 문제가 되는경우 댓글 달아주세요)
void GetLotInfo()
{
		// 데이터 가져와서 
    DataTable dataTable = new DataTable("TableName");
    DataRow[] dataRow = new DataRow[dataTable.Rows.Count];
    treeDataTable.Rows.CopyTo(dataRow, 0);

    treeLotHistory.BeginUpdate();
    treeLotHistory.Nodes.Clear();
    RadTreeNode[] nodes = GetTreeNodes(dataRow);
    treeLotHistory.Nodes.AddRange(nodes);
    treeLotHistory.EndUpdate();
}

RadTreeNode[] GetTreeNodes(DataRow[] dataRow)
{
    List nodeList = new List();
    RadTreeNode node = null;
    foreach (DataRow dr in dataRow)
    {
        node = new RadTreeNode(dr["columns1"].ToString()); // 부모노드.. 
        noteID = Convert.ToInt32(dr["level"].ToString());
        node.Name = noteID.ToString();
        node.ToolTipText = noteID.ToString();
        if (nodeList.Find(FindNode) == null)
        {
            DataRow[] childRows = treeDataTable.Select(dr["columns1"].ToString()); // 자식노드
            if (childRows.Length > 0)
            {
                RadTreeNode[] childNodes = GetTreeNodes(childRows);
                node.Nodes.AddRange(childNodes);
            }
            nodeList.Add(node);
        }
    }
    RadTreeNode[] nodeArr = nodeList.ToArray();
    return nodeArr; 
}
private static bool FindNode(RadTreeNode n)
{
    if (n.Nodes.Count == 0)
    {                
        return n.Name == noteID.ToString();
    }
    else
    {
        while (n.Nodes.Count > 0)
        {
            foreach (RadTreeNode tn in n.Nodes)
            {
                if (tn.Name == noteID.ToString())
                    return true;
                else
                    n = tn;
            }
       }
        return false;
    }
}
protected void ColorNodes(RadTreeNode root, Color firstColor, Color secondColor)
{
    root.ForeColor = root.Index % 2 == 0 ? firstColor : secondColor;
    foreach (RadTreeNode childNode in root.Nodes)
    {
        Color nextColor = childNode.ForeColor = childNode.Index % 2 == 0 ? firstColor : secondColor;
        if (childNode.Nodes.Count > 0)
        {
            // alternate colors for the next node 
            if (nextColor == firstColor)
                ColorNodes(childNode, secondColor, firstColor);
            else
                ColorNodes(childNode, firstColor, secondColor);
        }
    }
}