多线程非递归实现的树控件

一个树控件,利用多线程实现.填充时采用非递归方式实现(TreeView的多叉链表结构似乎非常适合非递归方式).由于控件是同步加载的,树很大时可能速度比较慢,尽管采用了多线程.如果采用异步方式加载效果应该会更好.这个我还没写好,写好了再贴出来吧.代码如下:
    /// <summary>
    /// 树控件类
    /// </summary>
    public class TreeControl
    {
        protected TreeView treeView;
        protected Page page;
        protected HtmlGenericControl divTreeView;
        protected HtmlGenericControl divTreeViewPanel;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="page">当前页面</param>
        /// <param name="ctrlName">对控件的命名</param>
        public TreeControl(Page page, string ctrlName)
        {
            this.page = page;
            treeView = (TreeView)page.FindControl("tv" + ctrlName + "View");
            if (treeView == null)
            {
                treeView = CreateCtl(ctrlName);
            }
            divTreeView = (HtmlGenericControl)page.FindControl("div" + ctrlName);
            divTreeViewPanel = (HtmlGenericControl)page.FindControl("div" + ctrlName + "Panel");
            treeView.Attributes.Add("onclick", "TreeViewGetData()");
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="page">当前页面</param>
        /// <param name="ctrlName">对控件的命名</param>
        /// <param name="currid">节点编号字段的名称</param>
        /// <param name="menuName">显示信息字段的名称</param>
        /// <param name="parentNode">父节点编号字段的名称</param>
        /// <param name="tableName">表名称</param>
        /// <param name="condition">条件</param>
        /// <param name="order">排序</param>
        public TreeControl(Page page, string ctrlName, string currid, string menuName, string parentNode, string tableName, string condition, string order)
        {
            this.page = page;
            treeView = (TreeView)page.FindControl("tv" + ctrlName + "View");
            if (treeView == null)
            {
                treeView = CreateCtl(ctrlName);
            }
            divTreeView = (HtmlGenericControl)page.FindControl("div" + ctrlName);
            divTreeViewPanel = (HtmlGenericControl)page.FindControl("div" + ctrlName + "Panel");
            treeView.Attributes.Add("onclick", "TreeViewGetData()");
            LoadTree(currid, menuName, parentNode, tableName, condition, order);
            Height = "150px";
        }
        /// <summary>
        /// 装载树
        /// </summary>
        /// <param name="currid">节点编号字段的名称</param>
        /// <param name="menuName">显示信息字段的名称</param>
        /// <param name="parentNode">父节点编号字段的名称</param>
        /// <param name="tableName">表名称</param>
        /// <param name="condition">条件</param>
        /// <param name="order">排序</param>
        public void LoadTree(string currid, string menuName, string parentNode, string tableName, string condition, string order)
        {
            SQLServerDAL SSDal = new SQLServerDAL();
            DataSet ds = new DataSet();
            string sql = "select " + currid + " as currid, " + menuName + " as menuName, " + parentNode + " as parentNode from " + tableName;
            if (condition != null && condition.Trim() != "")
            {
                sql += " where " + condition;
            }
            if (order != null && order.Trim() != "")
            {
                sql += " order by " + order;
            }
            ds = SSDal.returnRecordSet(sql);
            //FillNode(null, ds);
            FillParentNode(ds);
        }
        /// <summary>
        /// 获取当前树控件
        /// </summary>
        public TreeView TreeViewCtl
        {
            get
            {
                return treeView;
            }
        }
        /// <summary>
        /// 获取当前树控件所在页面
        /// </summary>
        public Page PageCtl
        {
            get
            {
                return page;
            }
        }
        /// <summary>
        /// 控件宽度
        /// </summary>
        public string Width
        {
            get
            {
                return divTreeView.Style[HtmlTextWriterStyle.Width];
            }
            set
            {
                divTreeView.Style.Add(HtmlTextWriterStyle.Width, value);
            }
        }
        /// <summary>
        /// 控件高度
        /// </summary>
        public string Height
        {
            get
            {
                return divTreeView.Style[HtmlTextWriterStyle.Height];
            }
            set
            {
                divTreeView.Style.Add(HtmlTextWriterStyle.Height, value);
            }
        }
        protected TreeView CreateCtl(string ctlName)
        {
            HtmlGenericControl divSelectTreeObj = new HtmlGenericControl("div");
            divSelectTreeObj.ID = "div" + ctlName;
            divSelectTreeObj.Style.Add(HtmlTextWriterStyle.Left, "100px");
            divSelectTreeObj.Style.Add(HtmlTextWriterStyle.Width, "150px");
            divSelectTreeObj.Style.Add(HtmlTextWriterStyle.Top, "100px");
            divSelectTreeObj.Style.Add(HtmlTextWriterStyle.BackgroundColor, "#fffff2");
            divSelectTreeObj.Style.Add(HtmlTextWriterStyle.Display, "none");
            divSelectTreeObj.Style.Add(HtmlTextWriterStyle.Height, "150px");
            divSelectTreeObj.Style.Add(HtmlTextWriterStyle.ZIndex, "999");
            divSelectTreeObj.Style.Add(HtmlTextWriterStyle.Position, "absolute");
            HtmlGenericControl divSelectTreePanelObj = new HtmlGenericControl("div");
            divSelectTreePanelObj.ID = "div" + ctlName + "Panel";
            divSelectTreePanelObj.Style.Add(HtmlTextWriterStyle.Width, "100%");
            divSelectTreePanelObj.Style.Add(HtmlTextWriterStyle.Height, "100%");
            divSelectTreePanelObj.Style.Add(HtmlTextWriterStyle.Overflow, "auto");
            TreeView tvSelectTreeViewObj = new TreeView();
            tvSelectTreeViewObj.ID = "tv" + ctlName + "View";
            tvSelectTreeViewObj.ShowCheckBoxes = TreeNodeTypes.None;
            tvSelectTreeViewObj.EnableViewState = false;
            divSelectTreePanelObj.Controls.Add(tvSelectTreeViewObj);
            divSelectTreeObj.Controls.Add(divSelectTreePanelObj);
            page.Form.Controls.Add(divSelectTreeObj);
            page.ClientScript.RegisterStartupScript(typeof(string), "init" + ctlName + "Style"
                , "<script>document.all.div" + ctlName + ".className = 'layer';"
                + "document.all.div" + ctlName + "Panel.className = 'scroll';"
                + "document.all.div" + ctlName + "Panel.title = '按上下键或滚动鼠标滑轮可控制滑块!';"
                + "</script>");
            return tvSelectTreeViewObj;
        }
        protected void FillNode(TreeNode pNode, DataSet ds)
        {
            DataView dvTree = new DataView(ds.Tables[0]);
            dvTree.RowFilter = "[parentNode] = "
                + (pNode != null ? pNode.Value.Trim() + " and [parentNode] <> [currid]" : " - 1 or [parentNode] = [currid]");
            foreach (DataRowView Row in dvTree)
            {
                TreeNode Node = new TreeNode();
                Node.Text = Row["menuName"].ToString().Trim();
                Node.Value = Row["currid"].ToString().Trim();
                Node.SelectAction = TreeNodeSelectAction.None;
                Node.ToolTip = "单击选中";
                if (pNode == null)
                {
                    treeView.Nodes.Add(Node);
                }
                else
                {
                    pNode.ChildNodes.Add(Node);
                    pNode.Expanded = false;
                }
                FillNode(Node, ds);
            }
        }
        protected class FillMsg
        {
            public TreeNode pNode;
            public DataSet ds;
            public FillMsg(TreeNode pNode, DataSet ds)
            {
                this.pNode = pNode;
                this.ds = ds;
            }
        }
        protected void ThreadFunc(object e)
        {
            FillMsg msg = (FillMsg)e;
            FillChildNode(msg.pNode, msg.ds);
        }
        protected void FillParentNode(DataSet ds)
        {
            DataView dvTree = new DataView(ds.Tables[0]);
            dvTree.RowFilter = "[parentNode] =  - 1 or [parentNode] = [currid]";
            Thread[] threadList = new Thread[dvTree.Count];
            for (int i = 0; i < dvTree.Count; i++)
            {
                TreeNode Node = new TreeNode();
                DataRowView Row = dvTree;
                Node.Text = Row["menuName"].ToString().Trim();
                Node.Value = Row["currid"].ToString().Trim();
                Node.SelectAction = TreeNodeSelectAction.None;
                Node.ToolTip = "单击选中";
                treeView.Nodes.Add(Node);
                threadList = new Thread(new ParameterizedThreadStart(ThreadFunc));
                threadList.Start(new FillMsg(Node, ds));
            }
            while (true)
            {
                bool finish = true;
                foreach (Thread thread in threadList)
                {
                    if (thread.ThreadState != ThreadState.Stopped)
                    {
                        finish = false;
                        break;
                    }
                }
                if (finish)
                {
                    break;
                }
            }
        }
        protected void FillChildNode(TreeNode pNode, DataSet ds)
        {
            DataView dvTree = new DataView(ds.Tables[0]);
            while (pNode != null)
            {
                dvTree.RowFilter = "[parentNode] = " + pNode.Value.Trim() + " and [parentNode] <> [currid]";
                if (dvTree.Count == 0)
                {
                    while (pNode.Parent != null && pNode.Parent.ChildNodes.IndexOf(pNode) == pNode.Parent.ChildNodes.Count - 1)
                    {
                        pNode = pNode.Parent;
                    }
                    if (pNode.Parent == null)
                    {
                        break;
                    }
                    pNode = pNode.Parent.ChildNodes[pNode.Parent.ChildNodes.IndexOf(pNode) + 1];
                    continue;
                }
                foreach (DataRowView Row in dvTree)
                {
                    TreeNode Node = new TreeNode();
                    Node.Text = Row["menuName"].ToString().Trim();
                    Node.Value = Row["currid"].ToString().Trim();
                    Node.SelectAction = TreeNodeSelectAction.None;
                    Node.ToolTip = "单击选中";
                    pNode.ChildNodes.Add(Node);
                    pNode.Expanded = false;
                }
                pNode = pNode.ChildNodes[0];
            }
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java多线程递归可以通过创建多个线程来实现递归操作。具体实现方法如下: 1.创建一个继承Thread类的递归线程类,重写run()方法,在run()方法中实现递归操作。 2.在递归线程类中定义一个构造方法,用于传递递归参数。 3.在递归线程类中定义一个静态变量,用于记录递归深度。 4.在递归线程类中定义一个静态变量,用于记录递归线程数。 5.在递归线程类中定义一个静态变量,用于记录递归线程的最大数目。 6.在递归线程类中定义一个静态变量,用于记录递归线程的最大深度。 7.在递归线程类中定义一个静态变量,用于记录递归线程的最小深度。 8.在递归线程类中定义一个静态变量,用于记录递归线程的平均深度。 9.在递归线程类中定义一个静态变量,用于记录递归线程的总数。 10.在递归线程类中定义一个静态变量,用于记录递归线程的总时间。 11.在递归线程类中定义一个静态变量,用于记录递归线程的平均时间。 12.在递归线程类中定义一个静态变量,用于记录递归线程的最大时间。 13.在递归线程类中定义一个静态变量,用于记录递归线程的最小时间。 14.在递归线程类中定义一个静态变量,用于记录递归线程的总内存。 15.在递归线程类中定义一个静态变量,用于记录递归线程的平均内存。 16.在递归线程类中定义一个静态变量,用于记录递归线程的最大内存。 17.在递归线程类中定义一个静态变量,用于记录递归线程的最小内存。 18.在递归线程类中定义一个静态变量,用于记录递归线程的总CPU时间。 19.在递归线程类中定义一个静态变量,用于记录递归线程的平均CPU时间。 20.在递归线程类中定义一个静态变量,用于记录递归线程的最大CPU时间。 21.在递归线程类中定义一个静态变量,用于记录递归线程的最小CPU时间。 22.在递归线程类中定义一个静态变量,用于记录递归线程的总IO时间。 23.在递归线程类中定义一个静态变量,用于记录递归线程的平均IO时间。 24.在递归线程类中定义一个静态变量,用于记录递归线程的最大IO时间。 25.在递归线程类中定义一个静态变量,用于记录递归线程的最小IO时间。 26.在递归线程类中定义一个静态变量,用于记录递归线程的总网络时间。 27.在递归线程类中定义一个静态变量,用于记录递归线程的平均网络时间。 28.在递归线程类中定义一个静态变量,用于记录递归线程的最大网络时间。 29.在递归线程类中定义一个静态变量,用于记录递归线程的最小网络时间。 30.在递归线程类中定义一个静态变量,用于记录递归线程的总磁盘时间。 31.在递归线程类中定义一个静态变量,用于记录递归线程的平均磁盘时间。 32.在递归线程类中定义一个静态变量,用于记录递归线程的最大磁盘时间。 33.在递归线程类中定义一个静态变量,用于记录递归线程的最小磁盘时间。 34.在递归线程类中定义一个静态变量,用于记录递归线程的总锁时间。 35.在递归线程类中定义一个静态变量,用于记录递归线程的平均锁时间。 36.在递归线程类中定义一个静态变量,用于记录递归线程的最大锁时间。 37.在递归线程类中定义一个静态变量,用于记录递归线程的最小锁时间。 38.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 39.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待时间。 40.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待时间。 41.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待时间。 42.在递归线程类中定义一个静态变量,用于记录递归线程的总等待数。 43.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待数。 44.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待数。 45.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待数。 46.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 47.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待时间。 48.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待时间。 49.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待时间。 50.在递归线程类中定义一个静态变量,用于记录递归线程的总等待数。 51.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待数。 52.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待数。 53.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待数。 54.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 55.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待时间。 56.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待时间。 57.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待时间。 58.在递归线程类中定义一个静态变量,用于记录递归线程的总等待数。 59.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待数。 60.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待数。 61.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待数。 62.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 63.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待时间。 64.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待时间。 65.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待时间。 66.在递归线程类中定义一个静态变量,用于记录递归线程的总等待数。 67.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待数。 68.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待数。 69.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待数。 70.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 71.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待时间。 72.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待时间。 73.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待时间。 74.在递归线程类中定义一个静态变量,用于记录递归线程的总等待数。 75.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待数。 76.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待数。 77.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待数。 78.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 79.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待时间。 80.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待时间。 81.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待时间。 82.在递归线程类中定义一个静态变量,用于记录递归线程的总等待数。 83.在递归线程类中定义一个静态变量,用于记录递归线程的平均等待数。 84.在递归线程类中定义一个静态变量,用于记录递归线程的最大等待数。 85.在递归线程类中定义一个静态变量,用于记录递归线程的最小等待数。 86.在递归线程类中定义一个静态变量,用于记录递归线程的总等待时间。 87.在递归线程类中定义一个

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值