public int ChangeConduct(String strVarName, String strNewValue, String strNewOpRules, ref String strRetMsg) { int nRet = -1; NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName]; if (node == null) { nRet = -1; strRetMsg = "无此变量"; return(nRet); } //@TODO, diff to decide whether update nRet = UpdateVar(strVarName, strVarName, strNewValue, strNewOpRules, ref strRetMsg); node = (NetWorkNode)m_hashVarsNetWork[strVarName]; nRet = ChangeConduct(node, ref strRetMsg); nRet = 0; strRetMsg = "变化传导成功"; return(nRet); }
// private int RemoveVar(String strVarName, ref String strRetMsg) { int nRet = -1; NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName]; if (node == null) { nRet = -1; strRetMsg = "无此变量"; return(nRet); } foreach (DictionaryEntry entry in node.hashDependentVars) { NetWorkNode dependentNode = (NetWorkNode)entry.Value; dependentNode.hashImpactVars.Remove(strVarName); } foreach (DictionaryEntry entry in node.hashImpactVars) { NetWorkNode impactedNode = (NetWorkNode)entry.Value; impactedNode.hashDependentVars.Remove(strVarName); } m_hashVarsNetWork.Remove(strVarName); nRet = 0; strRetMsg = "删除成功"; return(nRet); }
public Boolean IsHasRef(String strVarName) { NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName]; if (node == null) { return(false); } Boolean bRet = (node.hashImpactVars.Count > 0); return(bRet); }
// public Boolean IsAlone(String strVarName) { NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName]; if (node == null) { return(true); } Boolean bRet = (node.hashDependentVars.Count == 0 && node.hashImpactVars.Count == 0); return(bRet); }
public int ChangeConduct(NetWorkNode node, ref String strRetMsg) { int nRet = -1; Hashtable hashDependentVars = new Hashtable(); Hashtable hashPastVars = new Hashtable(); if (IsCycleRef(node, ref hashPastVars)) { node.strValue = "#INVALID:存在循环引用:" + node.strName; strRetMsg = node.strValue; Word.ContentControl cnt = (Word.ContentControl)m_hashAllVars[node.strName]; if (cnt != null) { Boolean bLock1 = cnt.LockContentControl, bLock2 = cnt.LockContents; cnt.LockContentControl = false; cnt.LockContents = false; try { if (!m_bInUndoRedo) { cnt.Range.Text = node.strValue; } } catch (System.Exception ex) { } finally { } cnt.LockContentControl = bLock1; cnt.LockContents = bLock2; } return(nRet); } hashPastVars.Clear(); nRet = ChangeConduct(node, ref hashDependentVars, ref hashPastVars, ref strRetMsg); return(nRet); }
public int SafeRemoveVar(String strVarName, ref String strRetMsg, Boolean bConduct = true) { Boolean bRet = false; int nRet = -1; String strMsg = ""; // recalc NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName]; if (node != null) { // Hashtable hashPastedVars = new Hashtable(); if (bConduct) { ChangeConduct(node, ref strMsg); } foreach (DictionaryEntry entry in node.hashDependentVars) { NetWorkNode dependentNode = (NetWorkNode)entry.Value; dependentNode.hashImpactVars.Remove(strVarName); } } bRet = IsAlone(strVarName); if (bRet) { nRet = RemoveVar(strVarName, ref strRetMsg); } else { nRet = -1; strRetMsg = "非孤立变量"; } return(nRet); }
public Boolean IsCycleRef(NetWorkNode node, ref Hashtable hashPastVars) { if (hashPastVars.Contains(node.strName)) { return(true); } hashPastVars.Add(node.strName, node); foreach (DictionaryEntry entry in node.hashImpactVars) { NetWorkNode impactedNode = (NetWorkNode)entry.Value; if (IsCycleRef(impactedNode, ref hashPastVars)) { return(true); } } hashPastVars.Remove(node.strName); return(false); }
// public int AddVar(String strVarName, String strVarValue, String strVarOpRules, ref String strRetMsg) { int nRet = -1; String strRet = "", strMsg = ""; NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName]; if (node == null) { node = new NetWorkNode(); } else { // nRet = UpdateVar(node.strName, strVarName, strVarValue, strVarOpRules,ref strRetMsg); nRet = SafeRemoveVar(node.strName, ref strRetMsg, false); } node.strName = strVarName; node.strOpRules = strVarOpRules; node.strValue = strVarValue; Hashtable hashDependentVars = new Hashtable(); if (!node.strOpRules.Equals("")) { strRet = Computing(node.strOpRules, m_hashAllVars, ref hashDependentVars, ref strMsg); if (strRet != null) { node.strValue = strRet; } else { node.strValue = "#INVALID:" + strMsg; } } if (hashDependentVars.Count > 0) { foreach (DictionaryEntry entry in hashDependentVars) { String strItem = (String)entry.Key; NetWorkNode dependentNode = (NetWorkNode)m_hashVarsNetWork[strItem]; if (dependentNode == null) { dependentNode = new NetWorkNode(); // fill dependentNode.strName = strItem; dependentNode.strValue = ""; dependentNode.strOpRules = ""; m_hashVarsNetWork[strItem] = dependentNode; } // record dependent vars in current node node.hashDependentVars[strItem] = dependentNode; // update its impact node link dependentNode.hashImpactVars[strVarName] = node; } } m_hashVarsNetWork[strVarName] = node; //重新计算,变化传导 nRet = ChangeConduct(node, ref strRetMsg); return(nRet); }
public NetWorkNode findNode(String strVarName) { NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName]; return(node); }
// 变化传导 public int ChangeConduct(NetWorkNode node, ref Hashtable hashDependentVars, ref Hashtable hashPastVars, ref String strRetMsg) { int nRet = -1; String strRet = "", strMsg = ""; Word.ContentControl cnt = null; Boolean bIsCycle = false; if (hashPastVars.Contains(node.strName)) { node.strValue = "#INVALID:存在循环引用:" + node.strName; bIsCycle = true; } else { if (!node.strOpRules.Equals("")) { // re calc hashDependentVars.Clear(); strRet = Computing(node.strOpRules, m_hashAllVars, ref hashDependentVars, ref strMsg); if (strRet != null) { node.strValue = strRet; } else { node.strValue = "#INVALID:" + strMsg; } } hashPastVars.Add(node.strName, node); } cnt = (Word.ContentControl)m_hashAllVars[node.strName]; if (cnt != null) { Boolean bLock1 = cnt.LockContentControl, bLock2 = cnt.LockContents; cnt.LockContentControl = false; cnt.LockContents = false; try { if (!m_bInUndoRedo) { cnt.Range.Text = node.strValue; } } catch (System.Exception ex) { } finally { } cnt.LockContentControl = bLock1; cnt.LockContents = bLock2; } if (bIsCycle) { nRet = -1; strRetMsg = node.strValue; hashPastVars.Remove(node.strName); return(nRet); } foreach (DictionaryEntry entry in node.hashImpactVars) { NetWorkNode impactedNode = (NetWorkNode)entry.Value; nRet = ChangeConduct(impactedNode, ref hashDependentVars, ref hashPastVars, ref strRetMsg); } hashPastVars.Remove(node.strName); return(nRet); }