卡片区多选参照使用案例分享
效果如图:参照多选后,返回值直接以字符串拼接方式显示到参照字段上
开发实现:
实体设计
将参照字段在实体上修改为:ID,Code,Name三列,以字符串存储,并设置字段长度(默认50)
在UIModel上根据实体视图增加自定义字段,并设置字段类型为对应的实体档案
发布对象浏览器中找到实体类,拖拽到视图中对应的字段上即可。
新建多选参照(或者有已经存在的可用参照也可以)
这里要注意下:由于ID列是Long类型,要返回多行时,ID值就不能直接使用,需要从实体属性中找个字符串字段作为多选时ID的返回值字段(一般使用备注)
在参照扩展字段中增加以下逻辑(MulRefer类见文章最后)
- 任意位置增加以下方法用于显示多选参照查询方案(多选参照默认不显示查询方案)
- 在 DataGrid_GridRowDbClicked_Extend、ConfirmButton_Click_Extend 方法中增加以下代码,并注释掉方法体默认方法(DefaultImpl)
/// 当前Model,this.Model
/// 当前界面,this
/// 编码列,定义返回编码集合字符串值绑定列
/// 名称列,定义返回名称集合字符串值绑定列
/// ID列,定义返回ID集合字符串值绑定列
MulRefer.ReturnMultiValueForInput(this.Model, this, "Code", "Name", "Description");
将UIModel上增加的自定义字段拖拽到卡片区,并将新建的多选参照进行绑定,此时把参照Code,Name,ID存放列的值绑定到对应实体字段上即可。
保存后数据加载处理
在BeforeUIModelBinding中增加对UIView中自定义字段的赋值逻辑,举例如下:
附MulRefer 类方法实例
///
/// 多选参照特殊处理
///
public class MulRefer
{
///
/// 卡片字段多选返回选定参照值
///
/// 当前Model,this.Model
/// 当前界面,this
/// 编码列,定义返回编码集合字符串值绑定列
/// 名称列,定义返回名称集合字符串值绑定列
/// ID列,定义返回ID集合字符串值绑定列
public static void ReturnMultiValueForInput(IUIModel model, BaseWebForm currPart, string codeColumnName,
string nameColumnName, string idColumnName)
{
string returnXml = "";
StringBuilder sbID = new StringBuilder();
StringBuilder sbCode = new StringBuilder();
StringBuilder sbName = new StringBuilder();
IUIView refView = model.Views["cRef"];
UIRuntimeHelper helper = UIRuntimeHelper.Instance;
IList
int recordCount = records.Count;
if (recordCount == 0)
return;
for (int i = 0; i < recordCount; i++)
{
if (sbID.Length != 0)
{
sbID.Append(",");
sbCode.Append(",");
sbName.Append(",");
}
sbID.Append(records[i]["ID"].ToString());
sbCode.Append(records[i][codeColumnName].ToString());
object name = records[i][nameColumnName];
string strName = string.Empty;
if (name != null)
{
strName = records[i][nameColumnName].ToString();
}
sbName.Append(strName);
}
returnXml += "
//如果只选中一条记录,则返回真实ID值
if (recordCount == 1) {
returnXml += "
}
else
{
returnXml += "
}
returnXml += "
returnXml += "
returnXml += "
returnXml += "";
RegisterStartupScriptByReturnXml(currPart, returnXml);
}
///
/// 表格多选参照记录数据处理
/// 调用此方法接收返回结果后,需把结果放到CurrentState中带回(this.CurrentState["XXX"] = MultiRefDatas),并自行关闭窗口(this.CloseDialog(true))
///
/// 当前Model,this.Model
///
public static Dictionary
{
IUIView view = model.Views["cRef"];
if (view != null)
{
IList
IUIFieldCollection fields = view.Fields;
if (selectRecords.Count > 0)//多选
{
//多选参照的返回值是一个Dictionary数组,
//数组中的每个元素就是参照中选中的一条记录
//Key是字段名,Value是字段值
Dictionary
for (int i = 0; i < selectRecords.Count; i++)
{
Dictionary
MultiRefDatas[i] = dic;
for (int j = 0; j < fields.Count; j++)
{
string fieldName = fields[j].Name;
dic[fieldName] =
Convert.ToString(selectRecords[i][fieldName]);
}
}
return MultiRefDatas;
}
else//一条记录都不选就直接返回
{
return null;
}
}
else
{
return null;
}
}
///
/// 注册脚本
///
///
///
private static void RegisterStartupScriptByReturnXml(BaseWebForm currPart, string returnXml)
{
string xml = "
xml += returnXml;
xml += "";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
xml = doc.DocumentElement.OuterXml;
//xml = xml.Replace(""", "'");
xml = UFIDA.U9.UI.Commands.CommandHelper.EscapeHTML(xml);//编码
string script = "";
script += "window.returnValue = "" + xml + "";";
script += "window.close();";
script += "";
AtlasHelper.RegisterAtlasStartupScript((Control)currPart.TopLevelContainer, currPart.GetType(), "ReferenceReturn", script, false);
}
}
卡片区多选参照使用案例分享
本文2024-08-20 16:41:59发表“u9cloud知识”栏目。
本文链接:https://wenku.my7c.com/article/yonyou-u9cloud-1153.html