public void CellPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "Text") { // Create new cell instance and have it as a sender m_Cell m_c = sender as m_Cell; // free the cell of dependents FreeCell(m_c.Name); if ((m_c.Text.Length > 1) && (m_c.Text != "") && (m_c.Text[0] == '=')) { ExpTree exp = new ExpTree(m_c.Text.Substring(1)); trackDependents(m_c.Name, exp.GetVarNames()); } EvalCell(sender as Cell); } else if (e.PropertyName == "BGColor") { // pass the sender to get the currrent cell in the sheetchanged function in form1 // fire property changed event for the spreadsheet to color SSPropertyChanged(sender, new PropertyChangedEventArgs("BGColor")); } }
public void EvalCell(Cell CellArg) { m_Cell m_c = CellArg as m_Cell; if (string.IsNullOrEmpty(m_c.Text)) { m_c.setValue(""); SSPropertyChanged(CellArg, new PropertyChangedEventArgs("Value")); } else if (m_c.Text[0] == '=' && m_c.Text.Length > 1) { bool flag = false; string expStr = m_c.Text.Substring(1); // set the expression string and create the tree ExpTree exp = new ExpTree(expStr); // gets expression variables string[] expVars = exp.GetVarNames(); // sets each variable in the expression foreach (string varName in expVars) { // check if the cell is valid if (GetCell(varName) == null) { // set value to the error and fire property changed event for the value m_c.setValue("!(Bad Reference)"); SSPropertyChanged(m_c, new PropertyChangedEventArgs("Value")); flag = true; break; } // check to see if its a self reference if (varName == m_c.Name) { // set value to the error and fire property changed event for the value m_c.setValue("!(Self Reference)"); SSPropertyChanged(m_c, new PropertyChangedEventArgs("Value")); flag = true; break; } // valid variable SetExpVariable(exp, varName); // check for circular reference after we've determined its a valid reference if (CheckCircularRef(varName, m_c.Name)) { // set value to the error and fire property changed event for the value m_c.setValue("!(Circular Reference)"); SSPropertyChanged(m_c, new PropertyChangedEventArgs("Value")); updateCells(m_c.Name); flag = true; break; } } if (flag) { return; } // Sets the expression evaluation to the current cells value and fires the property changed event m_c.setValue(exp.Eval().ToString()); SSPropertyChanged(CellArg, new PropertyChangedEventArgs("Value")); } else // no equals sign present so change the text { m_c.setValue(m_c.Text); SSPropertyChanged(CellArg, new PropertyChangedEventArgs("Value")); } if (dependencies.ContainsKey(m_c.Name)) { foreach (string name in dependencies[m_c.Name]) { EvalCell(name); } } }