解決treeview繫結節點多少頻繁重新整理可以使用有變化時才繫結
阿新 • • 發佈:2019-02-05
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; }