private void deleteVariableColumnToolStripMenuItem_Click(object sender, EventArgs e) { if (tabs.SelectedTab == null) { return; } DataGridView grid = (DataGridView)tabs.SelectedTab.Controls[0]; if (grid.CurrentCell == null) { return; } ColumnTag tag = (ColumnTag)grid.Columns[grid.CurrentCell.ColumnIndex].Tag; switch (tag.Tag) { case ColumnTag.ETag.AddVariable: return; case ColumnTag.ETag.ListEnd: case ColumnTag.ETag.ListStart: case ColumnTag.ETag.Normal: DeleteVariable(tag.PathLast.Define, true, null, null); break; } }
private void deleteListItemToolStripMenuItem_Click(object sender, EventArgs e) { if (tabs.SelectedTab == null) { return; } DataGridView grid = (DataGridView)tabs.SelectedTab.Controls[0]; if (grid.CurrentCell == null) { return; } ColumnTag tagSelected = (ColumnTag)grid.Columns[grid.CurrentCell.ColumnIndex].Tag; switch (tagSelected.Tag) { case ColumnTag.ETag.ListStart: case ColumnTag.ETag.ListEnd: MessageBox.Show("请选择 List 中间的列。"); return; /* * case ColumnTag.ETag.Normal: * case ColumnTag.ETag.AddVariable: * break; */ } grid.SuspendLayout(); (grid.Tag as Document).GridData.DeleteListItem(grid.CurrentCell.ColumnIndex); grid.ResumeLayout(); }
public VarData GetVarData(int pathCurrentIndex, ColumnTag tag, int pathEndIndex) { if (pathCurrentIndex > pathEndIndex) { return(null); } ColumnTag.VarInfo varInfo = tag.Path[pathCurrentIndex]; if (false == VariableMap.TryGetValue(varInfo.Define.Name, out var varData)) { return(null); } if (pathCurrentIndex == pathEndIndex) { return(varData); } if (varInfo.Define.Type == VarDefine.EType.List) { if (varInfo.ListIndex >= varData.Beans.Count) { return(null); } Bean bean = varData.Beans[varInfo.ListIndex]; if (null == bean) { return(null); } return(bean.GetVarData(pathCurrentIndex + 1, tag, pathEndIndex)); } throw new Exception("pathCurrentIndex != pathEndIndex And VarData Is Not A List"); }
public static int FindColumnListStart(GridData grid, int startColIndex) { int skipNestListCount = 0; for (int c = startColIndex; c >= 0; --c) { ColumnTag tag = grid.GetColumn(c).ColumnTag; if (skipNestListCount > 0) { switch (tag.Tag) { case ColumnTag.ETag.ListEnd: ++skipNestListCount; break; case ColumnTag.ETag.ListStart: --skipNestListCount; break; } continue; } switch (tag.Tag) { case ColumnTag.ETag.ListStart: return(c); case ColumnTag.ETag.ListEnd: ++skipNestListCount; break; } } return(-1); }
public ColumnTag Parent(ETag tag) { ColumnTag copy = new ColumnTag(tag); int copyCount = Path.Count - 1; for (int i = 0; i < copyCount; ++i) { copy.Path.Add(Path[i].Copy()); } return(copy); }
public void OnGridCellValidating(object sender, DataGridViewCellValidatingEventArgs e) { // 问题:CurrentCell 改变的时候,即时没有在编辑模式,原来的Cell也会触发这个事件。 DataGridView grid = (DataGridView)sender; if (false == grid.IsCurrentCellInEditMode) { return; } DataGridViewColumn col = grid.Columns[e.ColumnIndex]; ColumnTag tag = (ColumnTag)col.Tag; if (ColumnTag.ETag.Normal != tag.Tag) { return; } string newValue = e.FormattedValue as string; if (tag.PathLast.Define.Type == VarDefine.EType.Enum) { e.Cancel = true; if (null != Tools.VerifyName(newValue, CheckNameType.ShowMsg)) { return; } if (false == tag.PathLast.Define.Parent.EnumDefines.TryGetValue(tag.PathLast.Define.Name, out var enumDefine)) { MessageBox.Show("Error EnumDefine Not Found!!!"); return; } if (null == enumDefine.GetValueDefine(newValue)) { switch (MessageBox.Show("输入的枚举名字不存在,是否添加进去?", "提示", MessageBoxButtons.YesNoCancel)) { case DialogResult.Yes: enumDefine.AddValue(new EnumDefine.ValueDefine(enumDefine, newValue, -1)); break; case DialogResult.No: break; // 继续,允许错误输入。 case DialogResult.Cancel: return; // cancel } } e.Cancel = false; } }
public void DeleteVariable(VarDefine var) { View?.SuspendLayout(); var updateParam = new Bean.UpdateParam() { UpdateType = Bean.EUpdate.DeleteData }; // never change for (int c = 0; c < ColumnCount; ++c) { ColumnTag tagref = Columns[c].ColumnTag; if (tagref.PathLast.Define == var) { // delete data for (int r = 0; r < RowCount; ++r) { var row = Rows[r]; int colref = c; Document.Beans[r].Update(this, row, ref colref, 0, updateParam); } // delete columns switch (tagref.Tag) { case ColumnTag.ETag.Normal: this.RemoveColumn(c); --c; break; case ColumnTag.ETag.ListStart: int colListEnd = GridData.FindCloseListEnd(this, c); while (colListEnd >= c) { RemoveColumn(colListEnd); --colListEnd; } --c; break; default: MessageBox.Show("ListEnd?"); break; } } } View?.ResumeLayout(); }
public void OnGridColumnWidthChanged(object sender, DataGridViewColumnEventArgs e) { if (e.Column == null) { return; } ColumnTag tag = e.Column.Tag as ColumnTag; switch (tag.Tag) { case ColumnTag.ETag.Normal: tag.PathLast.Define.GridColumnValueWidth = e.Column.Width; tag.PathLast.Define.Parent.Document.IsChanged = true; break; } }
public void ReloadAllGridIfContains(VarDefine var) { foreach (var tab in tabs.Controls) { DataGridView gridref = (DataGridView)((TabPage)tab).Controls[0]; //if (gridref.Tag == ) for (int i = 0; i < gridref.ColumnCount; ++i) { ColumnTag tagref = gridref.Columns[i].Tag as ColumnTag; if (tagref.PathLast.Define == var) { ReloadGridsAfterFormDefineClosed.Add(gridref); break; } } } }
public void BuildUniqueIndexOnAddRow(int rowIndex) { var row = Rows[rowIndex]; for (int i = 0; i < ColumnCount; ++i) { ColumnTag tag = Columns[i].ColumnTag; switch (tag.Tag) { case ColumnTag.ETag.AddVariable: case ColumnTag.ETag.ListStart: case ColumnTag.ETag.ListEnd: continue; } var cell = row.Cells[i]; tag.AddUniqueIndex(cell.Value, cell); } }
private void DoActionByColumnTag(DataGridView grid, int columnIndex, ColumnTag tag) { switch (tag.Tag) { case ColumnTag.ETag.AddVariable: AddVariable(tag.PathLast.Define); break; case ColumnTag.ETag.ListEnd: // add list item now ColumnTag tagSeed = tag.Copy(ColumnTag.ETag.Normal); tagSeed.PathLast.ListIndex = -tag.PathLast.ListIndex; --tag.PathLast.ListIndex; tag.PathLast.Define.Reference.BuildGridColumns((grid.Tag as Document).GridData, columnIndex, tagSeed, -1); //(grid.Tag as Document).IsChanged = true; break; } }
public void VerifyAll(bool RemoveError) { try { if (RemoveError) // 优化,如果外面上下文已经知道重建了 GridData,就需要再次清除了。 { FormMain.Instance.FormError.RemoveErrorByGrid(this); } for (int rowIndex = 0; rowIndex < RowCount; ++rowIndex) { for (int colIndex = 0; colIndex < ColumnCount; ++colIndex) { ColumnTag tag = Columns[colIndex].ColumnTag; if (tag.Tag != ColumnTag.ETag.Normal) { continue; } Cell cell = GetCell(colIndex, rowIndex); var param = new Property.VerifyParam() { FormMain = FormMain.Instance, Grid = this, ColumnIndex = colIndex, RowIndex = rowIndex, ColumnTag = tag, NewValue = cell.Value, }; foreach (var p in tag.PathLast.Define.PropertiesList) { p.VerifyCell(param); } tag.PathLast.Define.Verify(param); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
public static int DoActionUntilBeanEnd(GridData grid, int colBeanBegin, int colListEnd, Action <int> action) { int skipNestListCount = 0; for (int c = colBeanBegin; c < colListEnd; ++c) { action(c); ColumnTag tag = grid.GetColumn(c).ColumnTag; if (skipNestListCount > 0) { switch (tag.Tag) { case ColumnTag.ETag.ListEnd: --skipNestListCount; break; case ColumnTag.ETag.ListStart: ++skipNestListCount; break; } continue; } switch (tag.Tag) { case ColumnTag.ETag.ListStart: ++skipNestListCount; break; case ColumnTag.ETag.AddVariable: return(c + 1); //case ColumnTag.ETag.Normal: // break; case ColumnTag.ETag.ListEnd: throw new Exception("DoActionUntilBeanEnd"); } } return(colListEnd); }
public void UpdateWhenAddVariable(VarDefine var) { for (int c = 0; c < ColumnCount; ++c) { ColumnTag tagref = Columns[c].ColumnTag; if (tagref.Tag == ColumnTag.ETag.AddVariable && tagref.PathLast.Define.Parent == var.Parent) { c += var.BuildGridColumns(this, c, tagref.Parent(ColumnTag.ETag.Normal), -1); // 如果是List,第一次加入的时候,默认创建一个Item列。 // 但是仍然有问题:如果这个Item没有输入数据,下一次打开时,不会默认创建。需要手动增加Item。 if (var.Type == VarDefine.EType.List) { ColumnTag tagListEnd = Columns[c - 1].ColumnTag; ColumnTag tagListEndCopy = tagListEnd.Copy(ColumnTag.ETag.Normal); tagListEndCopy.PathLast.ListIndex = -tagListEnd.PathLast.ListIndex; // 肯定是0,保险写法。 --tagListEnd.PathLast.ListIndex; c += var.Reference.BuildGridColumns(this, c - 1, tagListEndCopy, -1); } //((Document)gridref.Tag).IsChanged = true; // 引用的Grid仅更新界面,数据实际上没有改变。 } } }
public void BuildGridData() { FormMain.Instance.FormError.RemoveErrorByGrid(GridData); GridData = new GridData(this); BeanDefine.BuildGridColumns(GridData, 0, new ColumnTag(ColumnTag.ETag.Normal), -1); var param = new Bean.UpdateParam() { UpdateType = Bean.EUpdate.Grid }; foreach (var bean in _Beans) { int insertIndex = GridData.RowCount; GridData.InsertRow(insertIndex); int colIndex = 0; if (bean.Update(GridData, GridData.GetRow(insertIndex), ref colIndex, 0, param)) { break; } } for (int i = 0; i < GridData.ColumnCount; ++i) { ColumnTag tag = GridData.GetColumn(i).ColumnTag; switch (tag.Tag) { case ColumnTag.ETag.AddVariable: case ColumnTag.ETag.ListStart: case ColumnTag.ETag.ListEnd: continue; } tag.BuildUniqueIndex(GridData, i); } }
public static int FindCloseListEnd(GridData grid, int startColIndex) { int listStartCount = 1; for (int c = startColIndex + 1; c < grid.ColumnCount; ++c) { ColumnTag tag = grid.GetColumn(c).ColumnTag; switch (tag.Tag) { case ColumnTag.ETag.ListEnd: --listStartCount; if (listStartCount == 0) { return(c); } break; case ColumnTag.ETag.ListStart: ++listStartCount; break; } } throw new Exception("List Not Closed."); }
public static int FindColumnBeanBegin(GridData grid, int startColIndex) { int skipNestListCount = 0; for (int c = startColIndex - 1; c >= 0; --c) { ColumnTag tag = grid.GetColumn(c).ColumnTag; if (skipNestListCount > 0) { switch (tag.Tag) { case ColumnTag.ETag.ListEnd: ++skipNestListCount; break; case ColumnTag.ETag.ListStart: --skipNestListCount; break; } continue; } switch (tag.Tag) { case ColumnTag.ETag.AddVariable: case ColumnTag.ETag.ListStart: return(c + 1); //case ColumnTag.ETag.Normal: // break; case ColumnTag.ETag.ListEnd: ++skipNestListCount; break; } } throw new Exception("FindColumnBeanBegin"); }
public int BuildGridColumns(GridData grid, int columnIndex, ColumnTag tag, int listIndex) { int colAdded = 0; foreach (var v in _Variables) { colAdded += v.BuildGridColumns(grid, columnIndex + colAdded, tag, listIndex); } // 这里创建的列用来新增。 grid.InsertColumn(columnIndex + colAdded, new GridData.Column() { HeaderText = ",", ReadOnly = true, ToolTipText = "双击增加列", // 使用跟List一样的规则设置ListIndex,仅用于Delete List Item,此时这个Bean肯定在List中。 ColumnTag = tag.Copy(ColumnTag.ETag.AddVariable).AddVar(new VarDefine(this, ""), listIndex >= 0 ? listIndex : 0), }); for (int i = 0; i < grid.RowCount; ++i) { grid.GetCell(columnIndex + colAdded, i).Value = ","; } ++colAdded; return(colAdded); }
public static int FindColumnListEnd(GridData grid, int startColIndex) { int skipNestListCount = 0; for (int c = startColIndex; c < grid.ColumnCount; ++c) { ColumnTag tag = grid.GetColumn(c).ColumnTag; if (skipNestListCount > 0) { switch (tag.Tag) { case ColumnTag.ETag.ListEnd: --skipNestListCount; break; case ColumnTag.ETag.ListStart: ++skipNestListCount; break; } continue; } switch (tag.Tag) { case ColumnTag.ETag.ListStart: ++skipNestListCount; break; //case ColumnTag.ETag.AddVariable: //case ColumnTag.ETag.Normal: // break; case ColumnTag.ETag.ListEnd: return(c); } } return(-1); }
public bool Update(GridData grid, GridData.Row row, ref int colIndex, int pathIndex, UpdateParam param) { // ColumnCount maybe change in loop for (; colIndex < grid.ColumnCount; ++colIndex) { ColumnTag tag = grid.GetColumn(colIndex).ColumnTag; switch (tag.Tag) { case ColumnTag.ETag.AddVariable: // end of bean. // 删除Define变化时没有同步的数据。 HashSet <string> removed = new HashSet <string>(); foreach (var k in VariableMap.Keys) { if (tag.PathLast.Define.Parent.GetVariable(k) == null) { removed.Add(k); } } foreach (var k in removed) { DeleteVarData(k); } return(false); } ColumnTag.VarInfo varInfo = tag.Path[pathIndex]; if (false == VariableMap.TryGetValue(varInfo.Define.Name, out var varData)) { switch (param.UpdateType) { case EUpdate.Data: break; // will new data case EUpdate.CallAction: case EUpdate.Grid: if (varInfo.Define.Type == VarDefine.EType.List) { if (tag.Tag == ColumnTag.ETag.ListStart) { ++colIndex; } colIndex = GridData.FindColumnListEnd(grid, colIndex); } continue; // data not found. continue load. case EUpdate.DeleteData: return(true); // data not found. nothing need to delete. default: throw new Exception("unknown update type"); } varData = new VarData(this, varInfo.Define.Name); VariableMap.Add(varInfo.Define.Name, varData); } else if (param.UpdateType == EUpdate.CallAction) { param.UpdateAction(grid, colIndex, varInfo, varData); } if (varInfo.Define.Type == VarDefine.EType.List) { if (param.UpdateType == EUpdate.DeleteData) { if (pathIndex + 1 < tag.Path.Count) { if (varInfo.ListIndex < varData.Beans.Count) { Bean bean1 = varData.Beans[varInfo.ListIndex]; if (null != bean1) { bean1.Update(grid, row, ref colIndex, pathIndex + 1, param); } // always return true; } } else { if (ColumnTag.ETag.ListStart != tag.Tag) { throw new Exception("应该仅在Tag为ListStart时移除数据. see FormMain.deleteVariable..."); } DeleteVarData(varInfo.Define.Name); } return(true); } if (ColumnTag.ETag.ListStart == tag.Tag) { continue; // 此时没有进入下一级Bean,就在当前Bean再次判断,因为这里没有ListIndex。 } if (tag.Tag == ColumnTag.ETag.ListEnd) { int curListCount = -varInfo.ListIndex; int add = 0; for (int i = curListCount; i < varData.Beans.Count; ++i) { ColumnTag tagSeed = tag.Copy(ColumnTag.ETag.Normal); tagSeed.PathLast.ListIndex = i; add += tag.PathLast.Define.Reference.BuildGridColumns(grid, colIndex + add, tagSeed, -1); } if (curListCount < varData.Beans.Count) // curListCount 至少为1. { varInfo.ListIndex = -varData.Beans.Count; } if (add > 0) { --colIndex; // 新增加了列,回退一列,继续装载数据。 } continue; } if (varInfo.ListIndex >= varData.Beans.Count) { if (EUpdate.Data == param.UpdateType) { for (int i = varData.Beans.Count; i < varInfo.ListIndex; ++i) { varData.AddBean(new Bean(Document, varInfo.Define.Value)); } Bean create = new Bean(Document, varInfo.Define.Value); varData.AddBean(create); if (create.Update(grid, row, ref colIndex, pathIndex + 1, param)) { return(true); } } // 忽略剩下的没有数据的item直到ListEnd。 colIndex = GridData.FindColumnListEnd(grid, colIndex); continue; } Bean bean = varData.Beans[varInfo.ListIndex]; if (null != bean) { if (bean.Update(grid, row, ref colIndex, pathIndex + 1, param)) { return(true); } continue; } if (EUpdate.Data == param.UpdateType) { Bean create = new Bean(Document, varInfo.Define.Value); varData.SetBeanAt(varInfo.ListIndex, create); if (create.Update(grid, row, ref colIndex, pathIndex + 1, param)) { return(true); } } continue; } if (pathIndex + 1 != tag.Path.Count) { throw new Exception("Remain Path, But Is Not A List"); } switch (param.UpdateType) { case EUpdate.Data: // OnGridCellEndEdit update data varData.Value = row.Cells[colIndex].Value; return(true); case EUpdate.CallAction: // 上面已经做完了。 break; case EUpdate.Grid: row.Cells[colIndex].Value = varData.Value; // upate to grid break; // Update Grid 等到 ColumnTag.ETag.AddVariable 才返回。在这个函数开头。 case EUpdate.DeleteData: DeleteVarData(varInfo.Define.Name); return(true); default: throw new Exception("unkown update type. end."); } } return(true); }
public int BuildGridColumns(GridData grid, int columnIndex, ColumnTag tag, int listIndex) { switch (Type) { case EType.List: { grid.InsertColumn(columnIndex, new GridData.Column() { HeaderText = "[" + this.Name, ReadOnly = true, ToolTipText = Name + ":" + Value + ":" + Comment, ColumnTag = tag.Copy(ColumnTag.ETag.ListStart).AddVar(this, -1), }); for (int i = 0; i < grid.RowCount; ++i) { grid.GetCell(columnIndex, i).Value = "["; } if (null == Reference) { throw new Exception("List Reference Not Initialize."); } ++columnIndex; int colAdded = 0; if (listIndex >= 0) { colAdded = Reference.BuildGridColumns(grid, columnIndex, tag.Copy(tag.Tag).AddVar(this, listIndex), -1); } columnIndex += colAdded; grid.InsertColumn(columnIndex, new GridData.Column() { HeaderText = "]" + this.Name, ReadOnly = true, ToolTipText = Name + ": 双击此列增加List Item。", // 这里的 PathLast.ListIndex 是List中最大的Item数量,以后在Bean.Update中修改。 ColumnTag = tag.Copy(ColumnTag.ETag.ListEnd).AddVar(this, 0), }); for (int i = 0; i < grid.RowCount; ++i) { grid.GetCell(columnIndex, i).Value = "]"; } return(colAdded + 2); } /* * case EType.Enum: * { * DataGridViewCell template = new DataGridViewTextBoxCell(); * ColumnTag current = tag.Copy(tag.Tag).AddVar(this, -1); * grid.Columns.Insert(columnIndex, new DataGridViewColumn(template) * { * Name = this.Name, * Width = GridColumnValueWidth, * ToolTipText = Name + ":" + Comment, * Tag = current, * Frozen = false, * AutoSizeMode = DataGridViewAutoSizeColumnMode.None, * }); * // 自动完成来实现enum选择。不使用Combobox. * current.BuildUniqueIndex(grid, columnIndex); * return 1; * } */ default: { ColumnTag current = tag.Copy(tag.Tag).AddVar(this, -1); grid.InsertColumn(columnIndex, new GridData.Column() { HeaderText = Name, ToolTipText = Name + ":" + Comment, ColumnTag = current, }); current.BuildUniqueIndex(grid, columnIndex); return(1); } } }
private void OnCellValuePushed(object sender, DataGridViewCellValueEventArgs e) { var grid = sender as DataGridView; DataGridViewColumn col = grid.Columns[e.ColumnIndex]; ColumnTag tag = (ColumnTag)col.Tag; if (ColumnTag.ETag.Normal != tag.Tag) { return; // 不可能。特殊列都是不可编辑的。 } var doc = grid.Tag as Document; bool addRow = false; if (e.RowIndex == doc.GridData.RowCount) { doc.AddBean(new Bean(doc, "")); doc.GridData.InsertRow(e.RowIndex, false); grid.Rows.Add(); addRow = true; } if (addRow) { doc.GridData.BuildUniqueIndexOnAddRow(e.RowIndex); } var cell = doc.GridData.GetCell(e.ColumnIndex, e.RowIndex); var oldValue = cell.Value; cell.Value = e.Value as string; if (cell.Value == null) { cell.Value = ""; } var newValue = cell.Value; // save data int colIndex = e.ColumnIndex; var updateParam = new Bean.UpdateParam() { UpdateType = Bean.EUpdate.Data }; doc.Beans[e.RowIndex].Update(doc.GridData, doc.GridData.GetRow(e.RowIndex), ref colIndex, 0, updateParam); // verify tag.UpdateUniqueIndex(oldValue, newValue, cell); var param = new Property.VerifyParam() { FormMain = this, Grid = doc.GridData, ColumnIndex = e.ColumnIndex, RowIndex = e.RowIndex, ColumnTag = tag, OldValue = oldValue, NewValue = newValue, }; foreach (var p in tag.PathLast.Define.PropertiesList) { p.VerifyCell(param); } tag.PathLast.Define.Verify(param); }
public void DeleteListItem(int columnIndexSelected) { int colListEnd = GridData.FindColumnListEnd(this, columnIndexSelected); if (colListEnd < 0) { MessageBox.Show("请选择 List 中间的列。"); return; // not in list } ColumnTag tagSelected = Columns[columnIndexSelected].ColumnTag; ColumnTag tagListEnd = Columns[colListEnd].ColumnTag; int pathEndIndex = tagListEnd.Path.Count - 1; int colBeanBegin = GridData.FindColumnBeanBegin(this, columnIndexSelected); int listIndex = tagSelected.Path[pathEndIndex].ListIndex; // delete data(list item) for (int row = 0; row < RowCount; ++row) { Document.Beans[row].GetVarData(0, tagSelected, pathEndIndex)?.DeleteBeanAt(listIndex); } if (tagListEnd.PathLast.ListIndex == -1) { // 只有一个item,仅删除数据,不需要删除Column。需要更新grid。 for (int row = 0; row < RowCount; ++row) { GridData.DoActionUntilBeanEnd(this, colBeanBegin, colListEnd, (int col) => { switch (Columns[col].ColumnTag.Tag) { case ColumnTag.ETag.Normal: var cell = GetCell(col, row); cell.Value = ""; View?.InvalidateCell(col, row); break; } }); } return; } { // delete column List <int> colDelete = new List <int>(); GridData.DoActionUntilBeanEnd(this, colBeanBegin, colListEnd, (int col) => colDelete.Add(col)); for (int i = colDelete.Count - 1; i >= 0; --i) { RemoveColumn(colDelete[i]); } colListEnd -= colDelete.Count; } // reduce ListIndex In Current List after deleted item. while (colBeanBegin < colListEnd) { colBeanBegin = GridData.DoActionUntilBeanEnd(this, colBeanBegin, colListEnd, (int col) => { ColumnTag tagReduce = Columns[col].ColumnTag; --tagReduce.Path[pathEndIndex].ListIndex; }); } ++tagListEnd.PathLast.ListIndex; }