퇴근5분전

이건 웹페이지에서임.
누님 공부를 도와주면서 설명해준 소스임.
방식은 앞서 트리뷰 노드 추가와 같으나
그 처리 방식이 조금 다름.

데이타를 가져와서
이걸 TreeNode를 상속받은 cTreeNode로 바꾼다
그리고 cTreeNode[] 를 순차적으로 돌면서
자기를 참조하고 있는 자식이 될 노드들을 찾아서 추가하게 됨.

이때 자신이 참조하는 값이 0이면 트리뷰에 직접 붙인다.( Root 를 가리키는 셈임 )

  protected void Page_Load(object sender, EventArgs e)
    {
        TreeView1.SelectedNodeChanged += new EventHandler(TreeView1_SelectedNodeChanged);

        if (!IsPostBack)
        {  
            SetPage(); 
        }
    }

    public class cTreeNode : TreeNode
    {
        bool isDelete = false;

        public bool IsDelete
        {
            get { return isDelete; }
            set { isDelete = value; }
        }

        int seqNo = 0;

        public int SeqNo
        {
            get { return seqNo; }
        }

        int parentNo = 0;

        public int ParentNo
        {
            get { return parentNo; }
        }

        public cTreeNode(int seq, int pno, string _text, string _value)
        {
            this.seqNo = seq;
            this.parentNo = pno;
            this.Text = _text;
            this.Value = _value;
        }
    }

    private void SetPage() 
    {
        try
        {
            TreeView1.Nodes.Clear();
            DataSet ds = new BusinessLayer().SelectCategory();
            if (ds != null && ds.Tables.Count > 0)
            {
                cTreeNode[] ctreenodes = GetTreeNode(ds.Tables[0]); //목록이 담긴 테이블을 넘겨준다.                   
                Binding(ctreenodes); //트리뷰에 바뀐 TreeNode를 집어 넣는 부분
                ds.Clear();
                ds.Dispose();            
            }
            ds = null; 
        }
        catch(Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }


    /// <summary>
    /// 1. DataRow -> TreeNode 변환 
    /// </summary>
    /// <param name="dt"></param>
    /// <returns></returns>
    #region
    private cTreeNode[] GetTreeNode(DataTable dt)
    {
        cTreeNode[] trNodes = new cTreeNode[dt.Rows.Count];
        int cnt = 0;
        int seq  = 0;
        int pno = 0;
        string title = string.Empty;

        foreach (DataRow dr in dt.Rows)
        {
            seq  = Convert.ToInt32( dr["SEQNO"] );
            pno = Convert.ToInt32(dr["PARENTNO"] == DBNull.Value ? "0" : dr["PARENTNO"]);
            title  =  dr["TITLE"].ToString();
            trNodes[ cnt++ ] = new cTreeNode( seq, pno, title, title+"_value" ); //cTreeNode가 1개씩 만들어져서 채워짐
        }
        return trNodes;
    }
    #endregion

    /// <summary>
    /// 트리노드 하나로 묶어주기
    /// </summary>
    /// <param name="trNodes"></param>
    /// <returns></returns>
    #region Binding(cTreeNode[] trNodes)
    private void Binding(cTreeNode[] trNodes)
    {
        TreeNode tNode = null;

        foreach (cTreeNode trNode in trNodes)
        {        
            if (trNode.ParentNo == 0)      
            {
               TreeView1.Nodes.Add( trNode );
               tNode = trNode;
            }

            TreeDepth(trNodes, trNode);          
        }
    }
    #endregion

    /// <summary>
    /// 자기를 참조 하고 있는 노드를 아래로 붙이는 메서드.
    /// </summary>
    /// <param name="trNodes">목록리스트</param>
    /// <param name="trNode">선택된값</param>
    #region TreeDepth(cTreeNode[] trNodes, cTreeNode trNode)
    private void TreeDepth(cTreeNode[] trNodes, cTreeNode trNode)
    {
        foreach (cTreeNode tNode in trNodes)
        {
            if (trNode.SeqNo == tNode.ParentNo) //자기를 참조하고 있는 노드인지
            {
                trNode.ChildNodes.Add(tNode);   //자신을 참조하고 있으면 자기 아래로 붙이기.
            }
        }
    }
    #endregion


    private void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
    {
        ClientScript.RegisterStartupScript(this.GetType(), "selectTreeNode", "alert('" + TreeView1.SelectedNode.Text + "를 선택했습니다.');", true);
    }

'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

Form 사이즈 변경 못하게 막기  (0) 2009.05.14
MDI 창에서 스크롤바~  (0) 2009.05.14
트리뷰] 트리뷰 노드추가하기 1  (0) 2009.05.09
Html Table 파싱  (0) 2009.05.09
게임 챗팅창처럼...  (0) 2009.05.09