不用第歸算法快速顯示樹,對于Oracle數(shù)據(jù)庫(2)
2024-08-29 13:35:24
供稿:網(wǎng)友
 
             
  namespace BQ_TreeView
{/// <summary>
    /// BQ_TreeView 的摘要說明
    /// </summary>
    public class BQ_TreeView : System.Windows.Forms.TreeView
    {
                                                                                                    PRivate System.ComponentModel.Container components = null;
        private DataTable m_tb=null;
        private string m_RootMatID;
        BQ_TreeNode RootNode=null;
        ArrayList alNode=new ArrayList ();
        public BQ_TreeView()
        {
            InitializeComponent();
        }
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }
 
        #region
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
        }
        #endregion
 
        /// <summary>
        ///定義數(shù)據(jù)源
        /// </summary>
        public DataTable TreeDataSource
        {
            set
            {
                m_tb=value;         
            }
        }
        /// <summary>
        ///清空所有樹控件中的信息
        /// </summary>
        private void clear()
        {
            if(RootNode!=null)
            {
                RootNode.Nodes .Clear ();
                if(RootNode!=null)
                {
                    try
                    {
                        RootNode.Remove ();
                    }
                    catch
                    {}
                }
            }
            if(alNode!=null)
                if(alNode.Count >0)
                    alNode.Clear ();
        }
        /// <summary>
        /// 構(gòu)造樹控件
        /// </summary>
        public void MakeTree()
        {
                         
            clear();//清除樹節(jié)點中的資源
            Cursor.Current =Cursors.WaitCursor ;
            // 首先要給根節(jié)點付值,因為取出來的結(jié)構(gòu)中沒有根節(jié)點的信息
            RootNode=new BQ_TreeNode(m_RootMatID);
            RootNode.MatID =m_RootMatID;
            alNode.Add(RootNode);
            this.Nodes .Add (RootNode);
            foreach(DataRow row in m_tb.Rows )
            {
                BQ_TreeNode FNode=null;
                BQ_TreeNode CNode=null;
                CNode=MakeArray(row["ID"].ToString (),row["物料編碼"].ToString (),out FNode);                
                FNode.Nodes.Add (CNode);                
            }
            RootNode.EXPand ();
            Cursor.Current =Cursors.Default ;
        }
// <summary>
        /// 構(gòu)造一個動態(tài)數(shù)組,模擬樹控件一個分叉的線性結(jié)構(gòu),每一次都是最新的線性結(jié)構(gòu),這整個控件要害地方
        /// </summary>
        /// <param name="strID">層次</param>
        /// <param name="MatID">物料編碼</param>
        /// <param name="nodeF">父節(jié)點</param>
        /// <returns>構(gòu)造的節(jié)點</returns>。
        private BQ_TreeNode MakeArray(string strID,string MatID,out BQ_TreeNode nodeF)  {
            try
            {
                BQ_TreeNode node=new BQ_TreeNode (MatID);           
                node.MatID =MatID;                                      
                BQ_TreeNode nodeRet=null;
                int nGrade=int.Parse (strID);
                if(nGrade==0)
                {
                }
                else
                { 
                    if(alNode.Count>=nGrade+1)
                    {
                        alNode[nGrade]=node;
                        nodeRet=(BQ_TreeNode)alNode[nGrade-1];
                    }
                    else
                    {
                        alNode.Add (node);
                        nodeRet=(BQ_TreeNode)alNode[nGrade-1];
                    }
                }
                nodeF=nodeRet;
                return node;
            }
            catch(Exception e)
            {
                throw new Exception("",e);
            }
                         
        }
        public string RootMatID
        {
            get
            {
                return m_RootMatID;
            }
            set
            {
                m_RootMatID=value;
            }
        }
    }
}
經(jīng)過編譯就可以把控件BQ_TreeView添加進(jìn)來,如下圖(圖2)
在應(yīng)用程序中只要
編寫
bQ_TreeView1.RootMatID=strRootID;
            bQ_TreeView1.TreeDataSource=tbProInfo;
            bQ_TreeView1.MakeTree();
就可以顯示整個BOM結(jié)構(gòu),tbProInfo為上面的Sql語句取出的表結(jié)構(gòu)