Ejemplo n.º 1
0
        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;
            }
        }