퇴근5분전

사용자 삽입 이미지

 옛날 옛날에 만들었던...
트리는 구조만 제대로 파악한다면, 의외로 쉽다.
디자인 패턴에서 Composite도 트리형태로 구현이 가능하다.
예전에 만들었던 내용대로 올림.

간단하게 우측에 보이는 데이타 구조에서
메뉴네임을 순차적으로 돌면서 참조하고있는 노드를 자기 아래노드로 추가시키는 방법임.

재귀 호출관련해서 알고 있으면 이해가 편함.


// 아래는 소스임

 DataTable TreeMenu  = new DataTable();


  private void Form1_Load(object sender, System.EventArgs e)
  {
   TreeMenu.Columns.Add("MenuName");
   TreeMenu.Columns.Add("Parents");
   
   DataRow dr ;

   dr = TreeMenu.NewRow();
   dr[0] = "A";   dr[1] = "root";

   TreeMenu.Rows.Add( dr);

   dr = TreeMenu.NewRow();
   dr[0] = "B";   dr[1] = "A";
   TreeMenu.Rows.Add( dr);

   dr = TreeMenu.NewRow();
   dr[0] = "C";   dr[1] = "A";
   TreeMenu.Rows.Add( dr);

   dr = TreeMenu.NewRow();
   dr[0] = "D";   dr[1] = "B";
   TreeMenu.Rows.Add( dr);

   dr = TreeMenu.NewRow();
   dr[0] = "E";   dr[1] = "D";
   TreeMenu.Rows.Add( dr);

   dr = TreeMenu.NewRow();
   dr[0] = "F";   dr[1] = "B";
   TreeMenu.Rows.Add( dr);

   dr = TreeMenu.NewRow();
   dr[0] = "G";   dr[1] = "C";
   TreeMenu.Rows.Add( dr);

   dr = TreeMenu.NewRow();
   dr[0] = "H";   dr[1] = "root";
   TreeMenu.Rows.Add( dr);

   this.dataGrid1.DataSource = TreeMenu;


   // root 꼭데기 찾아서 추가!!
   DataRow[]   selectRows = TreeMenu.Select("Parents='root'");

   for( int i = 0 ; i < selectRows.Length ; i++)
    this.treeView1.Nodes.Add( new TreeNode( selectRows[i][0].ToString(), GetTreeNodes( TreeMenu , selectRows[i][0].ToString()) ) );
 

   DataSet ds = new DataSet();
   ds.Tables.Add( TreeMenu );

   ds.WriteXml(@"C:\treeMenu.xml", XmlWriteMode.IgnoreSchema );
  }


  // 재귀함수에 의해 treenode추가!
  private TreeNode[] GetTreeNodes( DataTable dtSource,  string Parens )
  {
   TreeNode[] returnTreeNodes;
   
   DataRow[]   selectRows = dtSource.Select("Parents='"+Parens+"'");
   returnTreeNodes = new TreeNode[ selectRows.Length ];
   for( int idx  = 0; idx < selectRows.Length ; idx++)
   {
    returnTreeNodes[idx] = new TreeNode( selectRows[idx][0].ToString() , GetTreeNodes( dtSource , selectRows[idx][0].ToString() ) );
    returnTreeNodes[idx].Tag = selectRows[idx][0].ToString();
   }
   return returnTreeNodes;
  }

  private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
  {
   if(e.Node.GetNodeCount( true ) == 0)
    this.Text = e.Node.Text;
  }






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

MDI 창에서 스크롤바~  (0) 2009.05.14
트리뷰] 트리뷰 노드추가하기 2  (0) 2009.05.09
Html Table 파싱  (0) 2009.05.09
게임 챗팅창처럼...  (0) 2009.05.09
드레그 앤 드랍! (2)  (0) 2009.05.09