k/3cloud表格控件块粘贴代码逻辑

大家可以在表单插件EntityBlockPasting事件中自己处理,然后将cancel设置为true。以下代码可以参考一下,插件代码中需要将其中一些属性或方法修改,例如this.BusinessInfo替换为this.View.BusinessInfo,UpdateValue替换为this.View.Model.SetValue,this.StyleManager替换为((IDynamicFormView)this.View).StyleManager

        /// <summary>
        /// 块拷贝
        /// </summary>
        /// <param name="startKey"></param>
        /// <param name="startRow"></param>
        /// <param name="blockValue"></param>
        public void EntityBlockPasting(string startKey, int startRow, string blockValue)
        {
            if (!blockValue.IsNullOrEmptyOrWhiteSpace())
            {
                EntityBlockPastingEventArgs args = new EntityBlockPastingEventArgs(startKey, startRow, blockValue);
                this.EventsProxy.FireEntityBlockPasting(args);
                if (args.Cancel)
                {
                    return;
                }
                Field fd = this.BusinessInfo.GetField(startKey);
                if (fd == null) return;
                int entityRowCount = this.Model.GetEntryRowCount(fd.EntityKey);
                string[] rowValues = blockValue.Split('\n');
                int blockRowCount = rowValues.Length-1;
                if (blockRowCount > entityRowCount)
                {
                    // 当前实体行数不足,补齐行数据
                    for (int i = entityRowCount; i < blockRowCount; i++)
                    {
                        this.Model.CreateNewEntryRow(fd.EntityKey);
                    }
                }
                Dictionary<int, string> fieldKeyList = new Dictionary<int, string>();
                int row = startRow;
                foreach (string strValue in rowValues)
                {
                    if (strValue.IsNullOrEmpty())
                    {
                        // 最后空行结束
                        return;
                    }
                    string[] strs = strValue.Split('\t');
                    int fieldCount = strs.Length;
                    SetFieldKeyList(startKey, fd, fieldKeyList);
                    if (fieldKeyList.Count == 0)
                    {
                        // 可能找不到列,则返回
                        return;
                    }
                    int index = 0;
                    foreach (string str in strs)
                    {
                        string key = fieldKeyList[index];
                        // 未锁定状态下更新数据,锁定跳过
                        if (this.StyleManager.GetEnabled(this.LayoutInfo.GetFieldAppearance(key)))
                        {
                            this.UpdateValue(fieldKeyList[index], row, str);
                        }
                        index++;
                    }
                    row++;
                }
            }
        }
        private void SetFieldKeyList(string startKey, Field fd, Dictionary<int, string> fieldKeyList)
        {
            if (fieldKeyList.Count > 0)
            {
                return;
            }
            int start = 0;
            List<Field> fields = new List<Field>();
            fields.AddRange(fd.Entity.Fields);
            fields.Sort(new Comparison<Field>((x, y) =>
            {
                return x.Tabindex.CompareTo(y.Tabindex);
            }));
            foreach (Field f in fields)
            {
                if (startKey.EqualsIgnoreCase(f.Key))
                {
                    fieldKeyList[start++] = f.Key;
                    continue;
                }
                if (start > 0)
                {
                    // 可见的列才被用来粘贴
                    if (this.StyleManager.GetVisible(this.LayoutInfo.GetFieldAppearance(f.Key)))
                    {
                        fieldKeyList[start++] = f.Key;
                        continue;
                    }
                }
            }
        }


你可能感兴趣的:(k/3cloud表格控件块粘贴代码逻辑)