private void define_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { if (e.ColumnIndex < 0) { return; } if (e.RowIndex < 0) { return; } if (false == define.IsCurrentCellInEditMode) { return; } DataGridViewCellCollection cells = define.Rows[e.RowIndex].Cells; if (cells["BeanLocked"].Tag != null) { // assert(cells["VarName"] == cells[e.ColumnIndex]); var newValue = e.FormattedValue as string; if (null != Tools.VerifyName(newValue, CheckNameType.ShowMsg)) { e.Cancel = true; return; // VerifyName 里面已经显示消息了。 } return; } DataGridViewCell cellVarName = cells["VarName"]; if (null == cellVarName.Tag) { e.Cancel = true; MessageBox.Show("只有VarName.Tag设置的行才允许编辑,其他的应该都设置了 ReadOnly. 怎么到这里的?"); return; } if (cellVarName.Tag is EnumDefine.ValueDefine valueDefine) { string colName = define.Columns[e.ColumnIndex].Name; switch (colName) { case "VarName": var newValue = e.FormattedValue as string; if (null != Tools.VerifyName(newValue, CheckNameType.ShowMsg)) { e.Cancel = true; return; } if (false == valueDefine.Name.Equals(newValue) && null != valueDefine.Parent.GetValueDefine(newValue)) { e.Cancel = true; MessageBox.Show("enum.value 重名了。"); return; } break; case "VarValue": if (false == int.TryParse(e.FormattedValue as string, out var _)) { e.Cancel = true; MessageBox.Show("enum.value只能是整数。"); return; } break; } return; } // modify Var VarDefine var = cellVarName.Tag as VarDefine; if (null == var.Name) // var.Name is null when row is ',' for addvar { e.Cancel = true; // 肯定时readonly吧。怎么到这里的。 return; } try { string colName = define.Columns[e.ColumnIndex].Name; switch (colName) { case "VarName": string newVarName = e.FormattedValue as string; if (var.Name.Equals(newVarName)) { return; } if (null != Tools.VerifyName(newVarName, CheckNameType.ShowMsg)) { e.Cancel = true; return; // VerifyName 里面已经显示消息了。 } if (var.Parent.GetVariable(newVarName) != null) { e.Cancel = true; MessageBox.Show("变量名字重复了。"); return; } break; case "VarValue": string newValue = e.FormattedValue as string; if (false == string.IsNullOrEmpty(newValue)) { var r = FormMain.Instance.Documents.SearchReference(newValue); e.Cancel = r == null; if (e.Cancel) { MessageBox.Show("引用的Bean名字没有找到。输入空将创建一个。"); } } break; case "VarForeign": string errForeign = var.OpenForeign(e.FormattedValue as string, out var _); if (null != errForeign) { e.Cancel = true; MessageBox.Show(errForeign); } break; case "VarType": VarDefine.EType newType = (VarDefine.EType)System.Enum.Parse( typeof(VarDefine.EType), e.FormattedValue as string); string errType = var.CanChangeTo(newType); if (null != errType) { e.Cancel = true; MessageBox.Show(errType); } break; case "VarDefault": if (false == var.CheckType(var.Type, e.FormattedValue as string)) { e.Cancel = true; MessageBox.Show("这个默认值和当前类型不匹配。"); } break; } } catch (Exception ex) { MessageBox.Show(ex.ToString()); e.Cancel = true; } }
/// <summary> /// AddVariable /// </summary> /// <param name="name"></param> /// <param name="type"></param> /// <param name="reference"></param> /// <returns>error string.</returns> public (VarDefine, bool, string) AddVariable(string name, VarDefine.EType type = VarDefine.EType.Undecided, string reference = null) { if (GetVariable(name) != null) { return(null, false, "duplicate variable name"); } VarDefine var = new VarDefine(this, name) { Type = type, Value = reference, GridColumnValueWidth = 50, }; bool create = false; switch (type) { case VarDefine.EType.List: if (string.IsNullOrEmpty(reference)) { var.Value = var.FullName(); if (_BeanDefines.TryGetValue(var.Name, out var exist)) { if (false == exist.NamespaceOnly) { return(null, false, $"尝试为变量'{var.Name}'创建一个 BeanDefine 失败:已经存在。"); } } else { exist = new BeanDefine(Document, var.Name, this); _BeanDefines.Add(var.Name, exist); } var.Reference = exist; exist.AddReferenceFrom(var, ReferenceFrom.Reasons.List); create = true; } else { var r = FormMain.Instance.Documents.SearchReference(var.Value); if (null == r) { return(null, false, "list reference bean not found."); } var.Reference = r; r.AddReferenceFrom(var, ReferenceFrom.Reasons.List); } break; case VarDefine.EType.Enum: _EnumDefines.Add(var.Name, new EnumDefine(this, var.Name)); break; } _Variables.Add(var); var.CreateXmlElementIfNeed(); // 调整变量顺序的时候需要这个创建好。 Document.IsChanged = true; return(var, create, ""); }
public (VarDefine, bool) AddVariable(VarDefine hint) { if (hint.Parent.Locked) { MessageBox.Show("bean is Locked"); return(null, false); } FormInputVarDefine input = new FormInputVarDefine(); input.StartPosition = FormStartPosition.CenterParent; // 初始化 input.ComboBoxBeanDefines。 // 如果要全部定义,调用 LoadAllDocument. List <string> beanDefineFullNames = new List <string>(); Documents.ForEachFile((Documents.File file) => { file.Document?.BeanDefine.CollectFullNameIncludeSubBeanDefine(beanDefineFullNames); return(true); }); beanDefineFullNames.Sort(); input.ComboBoxBeanDefines.Items.AddRange(beanDefineFullNames.ToArray()); string varName = ""; VarDefine result = null; bool createResult = false; while (true) { input.TextBoxVarName.Text = varName; if (DialogResult.OK != input.ShowDialog(this)) { break; } try { varName = input.TextBoxVarName.Text; if (null != Tools.VerifyName(varName, CheckNameType.ShowMsg)) { continue; } VarDefine.EType varType = VarDefine.ToEType(input.ComboBoxVarType.Text); (VarDefine var, bool create, string err) = hint.Parent.AddVariable(varName, varType, input.ComboBoxBeanDefines.Text); if (null == var) { MessageBox.Show(err); continue; } result = var; createResult = create; this.UpdateWhenAddVariable(var); break; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } input.Dispose(); return(result, createResult); }