表达式编辑器的简单实现(多语言动态文本控件使用)
场景需求:
1、表达式编辑器,如:{字段1}+{字段2}={字段3}
2、条件编辑器,如:IF ({字段1}=true AND {字段2}=true ) {字段4}={字段5}
3、内容编辑器,如:您的采购订单{单号}已审核通过,请及时查看。
等其他需求场景,这种表达式编辑器二开常规思路都是根据文本内容光标定位位置插入按钮事件触发的文本,这种方案二开繁琐,而且标准产品无法支持获取文本内容里的光标位置的服务端交互
解决方案:
使用多语言动态文本控件满足该场景使用,一个控件就能完成该编辑器,无需放很多按钮控件组合,插件获取该控件数值,进行字段值的解析替换即可(标准产品使用实例:监控方案的消息设置)
多语言动态文本控件录入:
该控件使用时,是根据输入的“{”自动弹出设置好的下拉字段列表进行选择,非“{}”符号的输入不会自动检测,正常文本内容输入即可,构造完整的表达式
多语言动态文本控件二开实现:
该控件由于在BOS设计器的字段里面无法找到该控件,所以需要借助构建插件进行构造该前端控件,
1、在BOS设计器中拖一个多语言文本字段到表单上,并且勾选属性“是否多行录入”,并且修改可编辑长度属性,根据实际需求进行修改,即可改变该控件的设计高度
2、表单注册构建插件,插件实例代码(假设该控件命名FMultiLangDynamicText):
public override void CreateControl(Core.DynamicForm.PlugIn.Args.CreateControlEventArgs e) { if (e.ControlAppearance.Key.EqualsIgnoreCase("FMultiLangDynamicText")) { e.Control["xtype"] = "kditemcontainer"; JSONObject item = e.Control["item"] as JSONObject; if (item != null) { item["xtype"] = "kdmultilingualdynamictext"; item["showEditButton"] = true; } } base.CreateControl(e); }
3、表单插件里面增加方法,该方法是构造控件输入“{”时触发下拉的字段列表数据源
private void SetDynamicTextData() { //设置动态文本数据源 JSONArray dataarray = new JSONArray(); JSONArray itemarray = new JSONArray(); int order = 0; for (int i = 0; i < 8; i++) { itemarray = new JSONArray(); itemarray.Add("芯数");//显示动态文本选择字段的第3列-Type itemarray.Add("XS" + i.ToString());//显示动态文本选择字段的第1列-Number itemarray.Add("@芯数" + i.ToString());//显示动态文本选择字段的第2列-Name itemarray.Add(order.ToString());//在显示动态文本选择字段里是隐藏的,作为每一行的隐藏ID order++; dataarray.Add(itemarray); } for (int i = 0; i < 4; i++) { itemarray = new JSONArray(); itemarray.Add("截面");//显示动态文本选择字段的第3列-Type itemarray.Add("JM" + i.ToString());//显示动态文本选择字段的第1列-Number itemarray.Add("@截面" + i.ToString());//显示动态文本选择字段的第2列-Name itemarray.Add(order.ToString());//在显示动态文本选择字段里是隐藏的,作为每一行的隐藏ID order++; dataarray.Add(itemarray); } //增加运算符 //AND itemarray = new JSONArray(); itemarray.Add("运算符"); itemarray.Add("AND"); itemarray.Add("AND"); itemarray.Add(order.ToString()); order++; dataarray.Add(itemarray); //OR itemarray = new JSONArray(); itemarray.Add("运算符"); itemarray.Add("OR"); itemarray.Add("OR"); itemarray.Add(order.ToString()); order++; dataarray.Add(itemarray); //NOT itemarray = new JSONArray(); itemarray.Add("运算符"); itemarray.Add("NOT"); itemarray.Add("NOT"); itemarray.Add(order.ToString()); order++; dataarray.Add(itemarray); //IN itemarray = new JSONArray(); itemarray.Add("运算符"); itemarray.Add("IN"); itemarray.Add("IN"); itemarray.Add(order.ToString()); order++; dataarray.Add(itemarray); //( itemarray = new JSONArray(); itemarray.Add("运算符"); itemarray.Add("("); itemarray.Add("("); itemarray.Add(order.ToString()); order++; dataarray.Add(itemarray); //) itemarray = new JSONArray(); itemarray.Add("运算符"); itemarray.Add(")"); itemarray.Add(")"); itemarray.Add(order.ToString()); order++; dataarray.Add(itemarray); //) itemarray = new JSONArray(); itemarray.Add("运算符"); itemarray.Add("="); itemarray.Add("="); itemarray.Add(order.ToString()); order++; dataarray.Add(itemarray); this.View.GetControl("FMultiLangDynamicText").SetCustomPropertyValue("Data", dataarray); this.View.UpdateView("FMultiLangDynamicText"); }
4、在表单插件的AfterBindData事件里面调用上面方法即可,效果图
5、如果是单据且关联了表字段名,则控件编辑后的数据保存后会正常储存在数据库里面,按正常字段使用的逻辑使用即可
6、插件里面获取该控件字段的值(多语言的模型数据结构):
LocaleValue dytext = this.View.Model.GetValue("FMultiLangDynamicText") as LocaleValue; if (dytext != null) { string text = dytext.GetString(this.View.Context.UserLocale.LCID); this.View.ShowMessage(string.Format("多语言动态文本的数值是{0}", text)); }
7、则取到该值,可进行后面的逻辑,比如解析逻辑,替换字段数值逻辑即可
表达式编辑器的简单实现(多语言动态文本控件使用)
本文2024-09-23 03:47:49发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-161161.html