在Sbo Addon开发中,经常为了业务实现,需要从当前的业务数据库中列举出符合条件信息,供业务操作人员进行选择,并且将选择之后的数据及其相关">信息传递到当前的业务界面,或者填充当前的业务控件(比如编辑文本、下拉框等),或者填充Matrix中的指定Column,以及更加个性化的业务处理(比如根据选择的数据进行业务初始化、业务流程处理等)。
这的确是一个很常用的功能,有必要对其进行业务抽象和归纳,形成一个通用的数据选择功能。富盛Sbo程序开发框架有效的解决了这一问题。
因为业务不同,需要选择的业务数据也不同。就是说,这个通用的数据选择提供的选择数据是不确定的,自然选择条件是不确定的,提供操作用户的表示数据是不确定的,选择之后的传递到业务界面上的数据和业务操作也是不确定的。
1、检索条件、数据展示定制化
要展示不同的数据选择内容,并且展示数据可能来自不同的数据表中,甚至选择数据集的来源可能是SELECT语句,也完全可能是存储过程的返回集合,能够满足这种展示条件的只有使用Grid控件了。而Grid控件的数据来源是可以定制的,这又满足了数据检索条件不确定性的要求。
实现如下:
fsSbo.AddButton2Form(ref oForm, "btnChoose", "选择", 315, 10, 65, 20); fsSbo.AddItem2Form(ref oForm, "2", BoFormItemTypes.it_BUTTON, 315, 80, 65, 20); Grid grd = fsSbo.AddGrid2Form(ref oForm, "grdData", 5, 5, 530, 300); grd.DataTable = oForm.DataSources.DataTables.Add("dtData"); grd.SelectionMode = BoMatrixSelect.ms_Single; grd.DataTable.ExecuteQuery(strChooseDataSQL); for (int i = 0; i < grd.DataTable.Columns.Count; i++) { if (grd.DataTable.Columns.Item(i).Type == BoFieldsType.ft_Integer || grd.DataTable.Columns.Item(i).Type == BoFieldsType.ft_Float) grd.Columns.Item(i).RightJustified = true; grd.Columns.Item(i).Editable = false; if (grd.Columns.Item(i).UniqueID.StartsWith("$$")) grd.Columns.Item(i).Visible = false; } grd.AutoResizeColumns();
当然,在数据展示的时候,应该考虑到行业习惯,Grid数据栏目如果是数据类型应该自动将其展示为右对齐,显然,这是可以办到的。
检索条件自动化、展示数据自动化、展示数据惯例化,看来都不是问题。在接下来要解决的是选择结果定制化,这也完全可以办到。
2、数据选择业务处理定制化
在选择数据窗口中,通过参数获得调用窗体及数据信息需要回写的控件Id,当然了,如果需要回写到Matrix中,除了需要指定这个Matrix的数据回写的列栏目,还应该指定需要回写的对应行;当然了,对于个性化的业务处理,在调用窗体中定义一个回调函数,在数据选择窗体的选择事件通过回调函数来完成个性化业务处理。
实现方法如下:
string[] strColumns = strFatherFields.Split(','); string[] strValues = new string[strFatherFields.Length == 0 || frmFather != null ? dt.Columns.Count : strColumns.Length]; for (int i = 0; i < strValues.Length; i++) { string strValue = ""; if (dt.Columns.Item(i).Cells.Item(nSelectedRow).Value != null) strValue = dt.Columns.Item(i).Cells.Item(nSelectedRow).Value.ToString(); if (i < dt.Columns.Count) strValues[i] = strValue; } if (strFatherFId.Length > 0 && strColumns.Length > 0) { Form frm = fsSbo.fsSbo
Application.Forms.Item(strFatherFId); oForm.Close(); frm.Freeze(true); for (int i = 0; i < strColumns.Length; i++) { if (strMtxId.Length > 0 && nMtxRow > 0) { Matrix mtx = (Matrix)frm.Items.Item(strMtxId).Specific; Column oColumn = mtx.Columns.Item(strColumns[i]); if (oColumn.Type == BoFormItemTypes.it_EDIT || oColumn.Type == BoFormItemTypes.it_EXTEDIT) fsSbo.SetValue2MtxEditText(ref mtx, strColumns[i], nMtxRow, strValues[i]); else if (oColumn.Type == BoFormItemTypes.it_COMBO_BOX) fsSbo.SetValue2MtxCombox(ref mtx, strColumns[i], nMtxRow, strValues[i]); } else { Item oItem = frm.Items.Item(strColumns[i]); if (oItem.Type == BoFormItemTypes.it_COMBO_BOX) fsSbo.SetValue2Combox(ref frm, strColumns[i], strValues[i]); else if (oItem.Type == BoFormItemTypes.it_EDIT || oItem.Type == BoFormItemTypes.it_EXTEDIT) fsSbo.SetValue2EditText(ref frm, strColumns[i], strValues[i]); } } if (frm.Mode != BoFormMode.fm_ADD_MODE) frm.Mode = BoFormMode.fm_UPDATE_MODE; frm.Freeze(false); frm.Refresh(); frm.Update(); } else if (frmFather != null) { string strFormId = oForm.UniqueID; oForm.Close(); frmFather.SetReturnValue4SelectForm(strValues, strFatherFields); }