Пример #1
0
        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;
            }
        }
Пример #2
0
        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();
        }
Пример #3
0
        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");
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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;
            }
        }
Пример #7
0
        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();
        }
Пример #8
0
        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;
            }
        }
Пример #9
0
 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;
             }
         }
     }
 }
Пример #10
0
        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);
            }
        }
Пример #11
0
        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;
            }
        }
Пример #12
0
        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());
            }
        }
Пример #13
0
        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);
        }
Пример #14
0
        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仅更新界面,数据实际上没有改变。
                }
            }
        }
Пример #15
0
        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);
            }
        }
Пример #16
0
        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.");
        }
Пример #17
0
        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");
        }
Пример #18
0
        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);
        }
Пример #19
0
        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);
        }
Пример #20
0
        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);
        }
Пример #21
0
        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);
            }
            }
        }
Пример #22
0
        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);
        }
Пример #23
0
        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;
        }