1. 程式人生 > >解決treeview繫結節點多少頻繁重新整理可以使用有變化時才繫結

解決treeview繫結節點多少頻繁重新整理可以使用有變化時才繫結

      public void ThrseReloadTreeView(TreeView tv, DataTable dt)
        {
            var newList = new List<TreeNode>();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                TreeNode Inode = new TreeNode();
                Inode.ImageIndex = 0;
                Inode.Text = dt.Rows[i]["NO"].ToString();
                newList.Add(Inode);
            }
            var oldList = tv.Nodes.Cast<TreeNode>().ToList();//老的節點資料來源
            //是否改變
            bool itemChanged = false;
            //是否個數相同
            bool isSameCount = newList.Count == oldList.Count;
            if (isSameCount) //如果個數相同:比較項是否變化了
            {
                //久資料來源判斷新資料來源
               
                //1個數有變化:是新增了車還是刪除了車
                foreach (var item in oldList)
                {
                    if (!newList.Any(x => x.Text == item.Text))
                    {
                        //有變化
                        itemChanged = true;
                        break;
                    }
                }
                if (!itemChanged)
                {
                    foreach (var item in newList)
                    {
                        if (!oldList.Any(x => x.Text == item.Text))
                        {
                            //有變化
                            itemChanged = true;
                            break;
                        }
                    }
                }
                //判斷順序
                var orderOld = string.Join(",", oldList.Select(x => x.Text).ToArray());
                var orderNew = string.Join(",", newList.Select(x => x.Text).ToArray());
                itemChanged = orderOld != orderNew;
            }
            else
            {     
                //個數有變化
                itemChanged = true;
                //判斷順序
                var orderOld = string.Join(",", oldList.Select(x => x.Text).ToArray());
                var orderNew = string.Join(",", newList.Select(x => x.Text).ToArray());
                itemChanged = orderOld != orderNew;
                if (itemChanged)
                {
                    string[] sArray = orderOld.Split(',');
                    string[] ArrayorderNew = orderNew.Split(',');
                    if (sArray.Length > ArrayorderNew.Length)
                    {
                        foreach (var item in sArray)
                        {
                            //狀態值沒有並且車也沒有這個資料就是刪除了
                            string sqlVehicleStateType = "SELECT VehicleStateType_ID FROM EMTinCar  WHERE NO='" + item + "'";
                            string VehicleStateType = Common.Conn.SqlHelper.getSqlValue(sqlVehicleStateType);
                            if (!string.IsNullOrEmpty(VehicleStateType))
                            {
                              
                            }
                            else {
                                string sqlID = "SELECT ID FROM EMTinCar  WHERE NO='" + item + "'" ;
                                string IDValue = Common.Conn.SqlHelper.getSqlValue(sqlID);
                                if (string.IsNullOrEmpty(IDValue))
                                {
                                    //lblDeteleMess.Visible = true;
                                    //lblDeteleMess.Text = item + "號車已被刪除";
                                   
                                }
                            }
                            
                        }
                    }
                    else {
                        foreach (var item in ArrayorderNew)
                        {
                            //狀態值沒有並且車也沒有這個資料就是刪除了
                            string sqlVehicleStateType = "SELECT VehicleStateType_ID FROM EMTinCar  WHERE NO='" + item + "'";
                            string VehicleStateType = Common.Conn.SqlHelper.getSqlValue(sqlVehicleStateType);
                            if (!string.IsNullOrEmpty(VehicleStateType))
                            {
                            }
                            else
                            {
                                string sqlID = "SELECT ID FROM EMTinCar  WHERE NO='" + item + "'";
                                string IDValue = Common.Conn.SqlHelper.getSqlValue(sqlID);
                                if (string.IsNullOrEmpty(IDValue))
                                {
                                    //lblDeteleMess.Visible = true;
                                    //lblDeteleMess.Text = item + "號車已被刪除";

                                }
                            }
                        }
                    }
                }

            }
            if (itemChanged)
                ReloadTreeView(newList, tv);
        }
    /// <summary>
        /// 不用的tv新增節點
        /// </summary>
        /// <param name="newList"></param>
        /// <param name="tv"></param>
        private void ReloadTreeView(List<TreeNode> newList, TreeView tv)
        {
            //個數不同,肯定要重新整理
            tv.SuspendLayout();
            tv.Nodes.Clear();
            tv.Nodes.AddRange(newList.ToArray());
            tv.ResumeLayout();
        }


   //新建車輛有變化就重新整理,新建的車有營運跟停駛分為排隊跟暫停
        private void timerInserTinCar_Tick(object sender, EventArgs e)
        {
            DataTable dt = YieldTransitEditBus.getTin1(isUpdatOrAdd);
            ThrseReloadTreeView(tvQueuing, dt);
            DataTable dt2 = YieldTransitEditBus.getTin2(isUpdatOrAdd);
            ThrseReloadTreeView(tvDeparture, dt2);
            DataTable dt3 = YieldTransitEditBus.getTin3(isUpdatOrAdd);
            ThrseReloadTreeView(tvPause, dt3);
            btnSratr.Visible = false;
        }