2024年7月14日发(作者:闳卓)
(GetScriptWithSetCtrlEnabled(lblIsTax, true)); //标签启用
//计入工资总额
(GetScriptWithSetCtrlEnabled(cbIsTotalPay, true)); //启用
(GetScriptWithSetCtrlEnabled(lblIsTotalPay, true)); //标签启用
//按日计算
(GetScriptWithSetCtrlEnabled(cbIsCalcByDay, false)); //不启用
(GetScriptWithSetCtrlValue(cbIsCalcByDay, false)); //不选中
(GetScriptWithSetCtrlEnabled(lblIsCalcByDay, false)); //标签不启用
//日工资计算项
(GetScriptWithSetCtrlEnabled(cbIsDailyPay, false)); //不启用
(GetScriptWithSetCtrlValue(cbIsDailyPay, false)); //不选中
(GetScriptWithSetCtrlEnabled(lblIsDailyPay, false)); //标签不启用
(" } ");
ion = ng();
(codeBlock);
#endregion
CreateAssCtrl(tribute131, "onchange", codeBlocks);
CreateAssCtrl(tribute131, "onchange", new CodeBlock());
}
public void AfterCreateChildControls()
{
RegisterClientScript();
}
以上是服务器端部分的代码,在Runtime,会在客户端生成以下脚本,从而实现客户端
控件之间的关联。以下给出了基于上述服务器端代码相应生成的客户端脚本。
function AssCtrl$FixupEventHandler()
{
tryAttachCtrlEvent('u_M_P47_ItemAttribute131','onchange',
handleru$M$P47$ItemAttribute131$ctl01);
……
}
if(Sys && ms)
{
tance().add_pageLoaded(function(){eo
ut(AssCtrl$FixupEventHandler, 0)});
}
else
{
eout(AssCtrl$FixupEventHandler, 0);
}
开发人员无需过多关注,客户端生成脚本,这是由UI代码框架生成的,而应该将主要
精力放在服务器端代码怎样定义关联控件和关联事件处理函数上(即CodeBlock代码)。如
果开发人员需要在运行时调试或单步跟踪的时候,可以通过断点(debugger)进行相关脚本
调试。
以上都是在客户端满足某种条件下,触发客户端关联。
页面加载后直接触发关联
某些情况下,页面加载后,无需出发条件,需要直接触发某些事件。下面的例子中,就
应用了这种触发方法。
public void AfterUIModelBinding()
{
InitDropDownList();
}
///
/// 初始化下拉框
///
private void InitDropDownList()
{
int dataType = pe;
//项目类型控件
UFWebClientDropDownListAdapter ddlItemType = new
UFWebClientDropDownListAdapter(ItemType107);
//项目属性控件
UFWebClientDropDownListAdapter ddlItemAttr = new
UFWebClientDropDownListAdapter(tribute131);
AssociationControl ass = new AssociationControl();
//数据类型为字符,项目类型显示‘档案项目’、‘手工录入’,增减属性显示‘其他项’
if (dataType == 0)
{
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemType, false, new int[] { 0,
1, 2 }));
(GetScriptWithAddRemoveItem(ddlItemType, true, new int[] { 0,
2 }));
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemAttr, false, new int[] { 0,
1, 2 }));
//(GetScriptWithAddRemoveItem(ddlItemAttr, true, new int[]
{ 2 }));
string a1 = "if($find('" + ID + "').get_Value()=="1"
|| $find('" + ID + "').get_Value()=="2")$find('" +
ID + "').ResetItem(false,'0,1,2');else $find('" +
ID + "').ResetItem(false,'2');";
(a1);
}
//数据类型为整型或小数,项目类型显示‘档案项目’、‘手工录入’、‘计算项目’,增
减属性显示‘增项’、‘减项’、‘其他项’
else if (dataType == 1 || dataType == 2)
{
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemType, false, new int[] { 0,
1, 2 }));
(GetScriptWithAddRemoveItem(ddlItemType, true, new int[] { 0,
1, 2 }));
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemAttr, false, new int[] { 0,
1, 2 }));
(GetScriptWithAddRemoveItem(ddlItemAttr, true, new int[] { 0,
1, 2 }));
}
//数据类型为日期、布尔,项目类型显示‘手工录入’,增减属性显示‘其他项’
else
{
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemType, false, new int[] { 0,
1, 2 }));
(GetScriptWithAddRemoveItem(ddlItemType, true, new int[]
{ 2 }));
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemAttr, false, new int[] { 0,
1, 2 }));
(GetScriptWithAddRemoveItem(ddlItemAttr, true, new int[]
{ 2 }));
}
}
以上实例中,就是实现了在页面加载后,对一个DropDownList控件直接初始化数据源。
总的来说,这种方式下:
先声明一个关联控件。
再指定该关联控件的源服务器控件。
然后给关联控件的
InitPara
的添加参数。这里的参数事件是一些可以执行的客户端脚本字符
串。
需要注意到是,这里并没有指定触发关联的事件名。因为这是在页面加载后,直接触发
的,所以无需制定事件名。
其关键代码如下:
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemAttr, false, new int[] { 0,
1, 2 }));
string a1 = "if($find('" + ID + "').get_Value()=="1"
|| $find('" + ID + "').get_Value()=="2")$find('" +
ID + "').ResetItem(false,'0,1,2');else $find('" +
ID + "').ResetItem(false,'2');";
(a1);
其他实例:
//
AssociationControl assoC = new AssociationControl(); //关联控件实例
ServerControl = grame243; //源控件
ame = "onchange"; //触发事件
//一个CodeBock 就是一个if代码快
CodeBlock codeBlock_2 = new CodeBlock();
//
expression = " if( ";
expression +=
ClientControl(grame243).ClientInstance;
expression += ".Value";
expression += " == ";
expression += "0";
expression += " )";
codeBlock_ion = expression;
//代码块的目标控件组
codeBlock_trol(er299).ReadOnly = "false";
codeBlock_trol(ssDate659).ReadOnly = "false";
//
ck(codeBlock_2);
关联控件使用注意:
1 关联控件的触发控件限定
以下控件不能用:
向导控件,向导页控件,页签控件,分页控件,分组框,卡片控件,容器;
建议,最好使用大控件和按钮控件作为触发控件;
另外对于没有限定的控件,可用的控件事件可能不一样。
2 关联控件的触发表达式控件限定在:
下拉列表框,文本框,复选框,以后看需求,可以扩展。
下拉列表框的值类型选String;
复选框选的值类型bool
置空,类型选decimal,值为null
3 关联控件的响应控件限定在:
没有限定控件类型,都支持是否可用状态,不过CheckBox支持选中和非选中状态。
4 使能关联控件没有起到控制效果,一个checkbox,当点击时,如果其值为true,
则将另两个checkbox置为Disable,
结果是点击之后置灰了一会最后又变为可编辑了。
这是由于PostBack造成的,解决方案是都到后台了,那可以直接控制控件的状
态。
5 跑使能控件的时候,弹出错误:“falsedocument”未定义
定义多条触发表达式时需要用逻辑运算符(|| && )进行连接;
6 现在使能控件的问题不是使能控件本身,而是需要被使能的控件提供一些属性、方
法、事件供使能控件使用,
控件的Value属性,控件的Visiable属性,控件Enabled属性
Base控件适配器
UFWebClientBaseAdapter
是其他控件适配器的基类。可以用来引用其他类型的适配器。
功能
当前控件的实例。
使用Control属性来获取当前控件的实例。
获取当前服务器端件的客户端实例
使用ClientInstance属性当前控件的客户端实例。
获取控件的客户端ID
ControlID属性来获取控件的客户端ID。
获取或设置控件的事件名
EventName属性用来或者设置事件名称。
获取或设置控件的Value
使用控件的Key属性,即可实现此功能。
获取或设置控件的Value
使用控件的Value属性和ControlValue属性,即可实现此功能。
获取或设置控件的Text
使用控件的Text属性即可实现此功能。
获取或设置控件是否只读
访问控件的ReadOnly属性,可以获取控件是否为只读。
如果要设置控件是否为只读,则使用ReadOnly和ClientInstanceWithReadonly属性,
ClientInstanceWithReadonly属性会根据ReadOnly属性的值产生客户端脚本代码,调用客户
端的
set_ ReadOnly()
方法,来设置控件是否只读。
ReadOnlyValue属性和ReadOnly属性实现一样的功能。
ClientInstanceWithReadonlyValue属性和ClientInstanceWithReadonly属性实现一样的功
能。
获取或设置控件是否可编辑
访问控件的Enabled属性,可以获取控件是否为只读。
如果要设置控件是否为只读,则使用Enabled和ClientInstanceWithEnable属性,
ClientInstanceWithEnable属性会根据Enabled属性的值产生客户端脚本代码,调用客户端的
set_Enabled ()
方法,来设置控件是否只读。
EnabledValue属性和Enabled属性实现一样的功能。
ClientInstanceWithEnabledValue属性和ClientInstanceWithEnable属性实现一样的功能。
实例
UFWebClientBaseAdapter是其他控件适配器的基类,所以下面的实例中,ankAccountCombin78
和ettlementMethod205控件是TextBox控件,但是仍然作为UFWebClientBaseAdapter类的入口
参数,来创建了UFWebClientBaseAdapter的实例。
实例1
(new UFWebClientBaseAdapter(ankAccountCombin78).ClientInstance
+ ".set_Value('" + strBankAccountCombin + "');");
(new
UFWebClientBaseAdapter(ettlementMethod205).ClientInstance + ".set_Value('" +
strSettlementMethod_Name + "');");
return args;
数字控件适配器
如果需要访问数字控件,则在UI编程开发中应使用数字控件适配器,通过编写服务器
端代码,通过关联控件的框架生成相应的客户端脚本,来实现对数字控件的客户端关联操作。
功能
数字控件适配器(UFWebClientNumberAdapter)提供的主要功能有以下这些。
设置精度Scale
设置数字控件的精度,为
ClientInstanceWithScale
提供数字控件的精度
。
ClientInstanceWithScale属性会根据输入参数Scale,产生客户端脚本代码,调用客户端的
set_Scale()
方法,来设置数字控件的精度。
设置舍入值RoundValue
设置数字控件的舍入值,为
ClientInstanceWithRoundValue
提供数字控件的舍入值
。
根据
输入参数RoundValue,数字控件适配器的ClientInstanceWithRoundValue属性会产生客户
端脚本代码,调用客户端的
set_RoundValue()
方法,来设置数字控件的舍入值。
设置舍入类型NumberRoundType
设置数字控件的舍入类型,为
ClientInstanceWithNumberRoundType
提供数字控件的舍入类型
。
ClientInstanceWithNumberRoundType属性会根据输入参数NumberRoundType,产生客户
端脚本代码,调用客户端的
set_RoundType()
方法,来设置数字控件的舍入类型。
货币符号CurrencySymbol
设置数字控件的货币符号,为
ClientInstanceWithCurrencySymbol
提供数字控件的货币符号
。
ClientInstanceWithCurrencySymbol属性会根据输入参数CurrencySymbol,产生客户端脚
本代码,调用客户端的
set_CurrencySymbol()
方法,来设置数字控件的货币符号。
数字格式FormatString
设置数字控件的显示格式,为
ClientInstanceWithFormatString
提供数字控件的显示格式
。
通过对数字控件适配器的ClientInstance相关属性,可以调用控件的客户端js方法。
ClientInstanceWithFormatString属性会根据输入参数FormatString,产生客户端脚本代码,
调用客户端的
set_FormatString()
方法,来设置数字控件的显示格式。
实例
下面举一个使用数字控件适配器(UFWebClientNumberAdapter)的实例。
private void BankBACFCExTypeChangeMoney_1(CustomerActionEventArgs args, string Rate,
string RCBankBACRate)
{
if (().Length == 0)
Rate = "1";
decimal Money_FCMoney =
(decimal)lHead__OCMoney *
(RCBankBACRate) * (Rate);
decimal SettlementFee_FCMoney =
(decimal)lHead_mentFee_OCMoney *
(RCBankBACRate) * (Rate);
UFWebClientNumberAdapter num_Money_FCMoney = new
UFWebClientNumberAdapter(RecACCMoney_FCMoney0);
num_Money_ = Money_ng();
(num_Money_InstanceWithValue);
UFWebClientNumberAdapter num_RCToFCExRate = new
UFWebClientNumberAdapter(RCToFCExRate1);
num_ = ng();
(num_InstanceWithScale);
num_ = Rate;
(num_InstanceWithValue);
}
//收款币种对本币汇率类型
object assoC_DoRCToFCERTypeAction(CustomerActionEventArgs args)
{ BankBACFCExTypeChangeMoney_1(args, Rate, RCToRecBACExRate);
return args;
}
//收款币种对本币汇率类型
private void RCToFCERTypeChange()
{
AssociationControl assoC_5 = new AssociationControl();
assoC_ServerControl = ERType1;
assoC_ame = "onchange";
ClientCallBackFrm cF = new ClientCallBackFrm();
omerAction += new
Customer(assoC_DoRCToFCERTypeAction);
(ERType1);
(cBACExRate0);
(0);
(e271);
(assoC_5);
}
再举一个实例。
下面的例子中
assoC_DoRecBatchAction
是一个CallBack事件处理函数。
object assoC_DoRecBatchAction(CustomerActionEventArgs args)
{
string RC = sh[ch_ID].ToString();
//没有控制币种,恢复原来币符
if ( == 0 || RC == "-1" || RC == "0")
{
string oldRC = sh[ID].ToString();
ntityUIModelModel queryentityModel = new
ntityUIModelModel();
= " ID=" + oldRC;
();
(cy);
if ( > 0)
{
UFWebClientNumberAdapter num_Precision = new
UFWebClientNumberAdapter(RC_MoneyRound_Precision77);
num_ =
ound_ng();
(num_InstanceWithValue);
UFWebClientNumberAdapter num_RoundType = new
UFWebClientNumberAdapter(RC_MoneyRound_RoundType111);
num_ =
ound_ng();
(num_InstanceWithValue);
UFWebClientNumberAdapter num_RoundValue = new
UFWebClientNumberAdapter(RC_MoneyRound_RoundValue237);
num_ =
ound_ng();
(num_InstanceWithValue);
UFWebClientTextBoxAdapter txt_Symbol = new
UFWebClientTextBoxAdapter(RC_Symbol130);
txt_ = ;
(txt_InstanceWithValue);
}
}
return args;
}
下拉列表控件适配器
如果需要访问下拉列表控件,则在UI编程开发中应使用下拉列表控件适配器,通过编
写服务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现对下拉列表控件的客
户端关联操作。
主要功能
动态隐藏显示枚举项
使用下面这些相关属性可以实现该功能。
OptionOperHidden :控制Item是否隐藏,true为隐藏,false为显示。
OptionsOper:要控制的数据源Item的index集合。
ClientInstanceWithAddRemoveItem:根据OptionsOper和OptionOperHidden来隐藏或显示
DropDowmList的数据源,该属性生成客户端脚本代码。重置DropDownList的Item,调用
客户端的set_IsReloadItems(true)和AddRemoveItem()方法,从现有数据源中添加或删除Item。
ClientInstanceWithResetItem:根据OptionsOper和OptionOperHidden来隐藏或显示
DropDowmList的数据源,该属性生成客户端脚本代码。重置DropDownList的Item,调用
客户端的set_IsReloadItems(true) 和ResetItem()方法,重置DropDownList的数据源。
设置下来列表控件的被中的枚举值
通过使用SelectedValue属性设置DropDowmList控件的被选中的Item的value。
ClientInstanceWithSelectedValue属性会根据SelectedValue属性,生成一段客户端脚本代
码,用来设置DropDowmList控件中Item的value为SelectedValue被选中。
使用SelectedIndex属性可以设置DropDowmList控件的被选中的Item的Index。供
ClientInstanceWithSelectedIndex使用。根据指定SelectedIndex属性,通过
ClientInstanceWithSelectedIndex属性会生成一段客户端脚本代码,用来设置
DropDowmList控件中Item的index为SelectedIndex的Item被选中。
事件
通过以下事件可以使用。
Onchange
SelectedIndexChanged
OnValueChanged
实例
IUFClientAssoComponent dd =
ClientControl(ServerControl);
实例:
//设置DropDownList条目的隐藏/显示
((IUFClientAssoDropDownList)dd).OptionOperHidden = true; //false时添加
option,true时移除option
((IUFClientAssoDropDownList)dd).OptionsOper = new int[] { 0, 3 };
//
((IUFClientAssoDropDownList)dd).Value=2;
//
((IUFClientAssoDropDownList)dd).ReadOnly=”true”;
//
((IUFClientAssoDropDownList)dd).Reset();
//可扩展枚举实现
添加新Item
m(string strKey,string strValue)
例子1:
dd.
AddItem(“FieldName”,
“txtName”
);
例子2:
从引用Form上取返回数据添加到Item上
AssociationControl assoC_1 = new AssociationControl();
assoC_ServerControl = 2;
assoC_ame = "ContentChanged";
CodeBlock codeBlock_1 = new CodeBlock();
UFWebClientDropDownListAdapter dd=new
UFWebClientDropDownListAdapter(geRateType167);
UFWebClientLabelAdapter label = new UFWebClientLabelAdapter(2);
rItem = true;
urce=InstanceWithAllData("Code","Name");
codeBlock_trol(dd);
assoC_ck(codeBlock_1);
(assoC_1);
下面举SOB中的例子,可以看到如何在运行时动态隐藏或显示DropDowmList控件中的Item
项。
public void AfterUIModelBinding()
{
//依据组织初始值设置账簿类型的初始值
SetSOBTypeByOrgFunction(true);
//设置组织职能变化后账簿类型的值(带change事件)
SetSOBTypeByOrgFunction(false);
}
private void SetSOBTypeByOrgFunction(bool isInit)
{
SetofBooksRecord record = dRecord;
bool isAdded = (cordState == );
//如果有错误信息,说明是保存按钮提交失败,需要保存SOBType的信息
if (essage != null && orMessage)
{
isAdded = false;
}
UFWebClientDropDownListAdapter sobType = new
UFWebClientDropDownListAdapter(e);
UFWebClientDropDownListAdapter orgFunction = new
UFWebClientDropDownListAdapter(ction187);
AssociationControl assControl;
assControl = new AssociationControl();
ServerControl = ction187;
if (!isInit)
{
ame = "onchange";
}
//显示0 1 2
CodeBlock codeBlock;
string expression;
codeBlock = new CodeBlock();
expression = "if( " + ;
expression += " == '0' )";
ion = expression;
//将去掉的选项加回来
OperHidden = false;
sOper = new int[] { 0, 1, 2 };
if (e != 3)
{
edValue = ng();
}
else
{
edValue = "0";
}
();
if (isInit)
{
(expression + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType);
ck(codeBlock);
//隐藏3
UFWebClientDropDownListAdapter sobType11 = new
UFWebClientDropDownListAdapter(e);
CodeBlock codeBlock11;
string expression11;
codeBlock11 = new CodeBlock();
expression11 = "if( " + ;
expression11 += " == '0' )";
ion = expression11;
OperHidden = true;
sOper = new int[] { 3 };
if (e != 3)
{
edValue = ng();
}
else
{
edValue = "0";
}
();
if (isInit)
{
(expression11 + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType11);
ck(codeBlock11);
//隐藏0 1 2
UFWebClientDropDownListAdapter sobType2 = new
UFWebClientDropDownListAdapter(e);
CodeBlock codeBlock2;
string expression2;
codeBlock2 = new CodeBlock();
expression2 = "if( " + ;
expression2 += " != '0' )";
ion = expression2;
//将多余的选项去掉
OperHidden = true;
sOper = new int[] { 0, 1, 2 };
//edValue = ng();
edValue = "3";
();
if (isInit)
{
(expression2 + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType2);
ck(codeBlock2);
UFWebClientDropDownListAdapter sobType22 = new
UFWebClientDropDownListAdapter(e);
CodeBlock codeBlock22;
string expression22;
codeBlock22 = new CodeBlock();
expression22 = "if( " + ;
expression22 += " != '0' )";
ion = expression22;
//显示3
OperHidden = false;
sOper = new int[] { 3 };
//edValue = ng();
edValue = "3";
();
if (isInit)
{
(expression22 + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType22);
ck(codeBlock22);
}
private void SetSOBTypeByOrgFunction(bool isInit)
{
SetofBooksRecord record = dRecord;
bool isAdded = (cordState == );
//如果有错误信息,说明是保存按钮提交失败,需要保存SOBType的信息
if (essage != null && orMessage)
{
isAdded = false;
}
UFWebClientDropDownListAdapter sobType = new
UFWebClientDropDownListAdapter(e);
UFWebClientDropDownListAdapter orgFunction = new
UFWebClientDropDownListAdapter(ction187);
AssociationControl assControl;
assControl = new AssociationControl();
ServerControl = ction187;
if (!isInit)
{
ame = "onchange";
}
//显示0 1 2
CodeBlock codeBlock;
string expression;
codeBlock = new CodeBlock();
expression = "if( " + ;
expression += " == '0' )";
ion = expression;
//将去掉的选项加回来
OperHidden = false;
sOper = new int[] { 0, 1, 2 };
if (e != 3)
{
edValue = ng();
}
else
{
edValue = "0";
}
();
if (isInit)
{
(expression + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType);
ck(codeBlock);
//隐藏3
UFWebClientDropDownListAdapter sobType11 = new
UFWebClientDropDownListAdapter(e);
CodeBlock codeBlock11;
string expression11;
codeBlock11 = new CodeBlock();
expression11 = "if( " + ;
expression11 += " == '0' )";
ion = expression11;
OperHidden = true;
sOper = new int[] { 3 };
if (e != 3)
{
edValue = ng();
}
else
{
edValue = "0";
}
();
if (isInit)
{
(expression11 + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType11);
ck(codeBlock11);
//隐藏0 1 2
UFWebClientDropDownListAdapter sobType2 = new
UFWebClientDropDownListAdapter(e);
CodeBlock codeBlock2;
string expression2;
codeBlock2 = new CodeBlock();
expression2 = "if( " + ;
expression2 += " != '0' )";
ion = expression2;
//将多余的选项去掉
OperHidden = true;
sOper = new int[] { 0, 1, 2 };
//edValue = ng();
edValue = "3";
();
if (isInit)
{
(expression2 + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType2);
ck(codeBlock2);
UFWebClientDropDownListAdapter sobType22 = new
UFWebClientDropDownListAdapter(e);
CodeBlock codeBlock22;
string expression22;
codeBlock22 = new CodeBlock();
expression22 = "if( " + ;
expression22 += " != '0' )";
ion = expression22;
//显示3
OperHidden = false;
sOper = new int[] { 3 };
//edValue = ng();
edValue = "3";
();
if (isInit)
{
(expression22 + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType22);
ck(codeBlock22);
}
日期控件适配器
如果需要访问日期控件,则在UI编程开发中应使用日期控件适配器,通过编写服务器
端代码,通过关联控件的框架生成相应的客户端脚本,来实现对日期控件的客户端关联操作。
功能
获取或设置日期控件的Value
如果是设置日期控件的值,则使用ClientInstanceWithValue属性,该属性根据Value或
ControlValue,产生客户端脚本代码,调用客户端的
set_Value()
方法,来设置日期控件的
Value。
获取日期控件的Text
使用ValueText属性可以获取日期控件的Text,产生客户端脚本代码,调用客户端的
get_Text()
方法,来设置。
设置日期控件是否可用
使用Enabled属性可以设置日期控件是否可用。
EnumClientAssoControlEnable
类型,可以获取或设置控件是否可用。两个枚举值为
False或True。
事件
以下事件可以使用:
Onchange
OnValueChanged
实例
以下实例设置通过
UFWebClientDatePickerAdapter
设置了日期控件的Value。
private object IsSelectChangeCallBackFrm_DoCustomerAction(CustomerActionEventArgs args)
{
UFWebClientDatePickerAdapter startDate = new
UFWebClientDatePickerAdapter(iodStartDate260);
= arrStartDate[0].ToShortDateString();
UFWebClientDatePickerAdapter endDate = new
UFWebClientDatePickerAdapter(iodEndDate194);
= arrEndDate[ - 1].ToShortDateString();
(InstanceWithValue);
(InstanceWithValue);
return args;
}
参照控件适配器
如果需要访问参照控件,则在UI编程开发中应使用参照控件适配器,通过编写服务器
端代码,通过关联控件的框架生成相应的客户端脚本,来实现对参照控件的客户端关联操作。
功能
获取参照的值
获取参照控件的Code,通过访问ValueCode属性实现。
获取参照空间的Name,通过访问ValueName属性实现。
获取参照控件的Key,通过访问ValuePK属性实现。
参照控件赋值
ClientInstanceWithValue根据PKValue 、CodeValue和NameValue三个属性,来对参照
控件赋值。
设置参照控件的Key
其对应的属性为PKValuel,ClientInstanceWithPK会根据PKValue的值对参照控件的Key
进行赋值操作。
设置参照控件的Code
其对应属性为CodeValue。ClientInstanceWithCode根据CodeValue,产生客户端脚本代
码,调用客户端的set_Text()方法,来设置参照控件的Name。
设置参照控件的Name
其对应属性为NameValue。ClientInstanceWithName根据NameValue,产生客户端脚本
代码,调用客户端的set_Text()方法,来设置参照控件的Name。
设置参照控件是否弹出参照Form
其对应属性为IsShowForm和ClientInstanceWithIsShowForm。设置IsShowForm后,调
用ClientInstanceWithIsShowForm属性产生客户端脚本,通用客户端中的
set_IsShowForm(),来实现此功能。
指定参照控件是否做PostBack
其对应属性为AutoPostBack。通过ClientInstanceWithAutoPostBack属性产生客户端脚
本,通用客户端中的set_AutoPostBack()方法。
获取或设置参照类型
对应属性为RefType。如果设置参照类型,则通过使用ClientInstanceWithRefType属性
根据RefType的值,产生客户端脚本代码,调用客户端的set_RefType()方法,来设置参照控
件的RefType。
添加参照的参数
通过AddParam方法实现。调用ClientInstanceWithAddPara属性可以实现在客户段添
加参照控件的参数功能。
实例代码
public void AfterCreateChildControls()
{
SetCustLabelPartID();
SetCustMiscInfo();
}
private void SetCustMiscInfo()
{
//客户lable
ScriptBlockBuilder scriptBuilder1 = new ScriptBlockBuilder();
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("Code",
{0}._Value());}}", "Cust_Customer0", "ClientID"));
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("Name",
{0}._Text());}}", "Cust_Customer0", "ClientID"));
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("IsMisc",
{0}._Value());}}", "Cust_Customer_IsMISC114", "ClientID"));
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("MiscID",
{0}._Key());}}", "Cust_Customer0", "ClientID"));
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("CustSiteCode",
{0}._Value());}}", "CustSite_CustomerSite1", "ClientID"));
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("CustSiteName",
{0}._Text());}}", "CustSite_CustomerSite1", "ClientID"));
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("CustSiteID",
{0}._Key());}}", "CustSite_CustomerSite1", "ClientID"));
if ( > 0)
{
ontrol = (l)3086;
ame = "BeforeLoadData";
//(scriptBuilder1);
}
if ( > 0)
{
ontrol = (l)3092;
ame = "BeforeLoadData";
//(scriptBuilder1);
}
}
设置参照控件的参数
通过setCustomerParam方法向参照控件添加参数,调用
ClientInstanceWithResetCustomerParam属性实现。
清除参照控件的自定义参数,通过ClientInstanceWithRemoveCustomerParam属性实现。
事件
以下事件可以使用
通过选择参照,发生值改变的时候,触发的事件为Onchange事件。
通过代码给参照赋值,参照的值发生改变的时候,触发的事件为OnValueChange事件。
实例
实例1
AssociationControl assoC_reserve = new AssociationControl();
//assoC_CallBack = true;
assoC_ServerControl = eDate170;
assoC_ame = "onchange"; //
ClientCallBackFrm cF2 = new ClientCallBackFrm();
omerAction += new
Customer(assoC_DoReserveDateAction);
(202);
(eDate170);
(ePeriodNumber53);
(alPostPeriod128);
(assoC_reserve);
Object assoC_DoReserveDateAction(CustomerActionEventArgs args)
{
//制单日期变化,得到该日期的对应期间的顺序号
string sobid = sh[ID].ToString();
if ( > 0 &&
sh[ID].ToString().Trim().Length > 0)
{
try
{
DateTime createDate =
(GetDateTimeString(sh[ID].ToString()));
SOBAccountingPeriodData getPeriod =
AccountPeriodUI((sobid), createDate);
//赋值制单期间的顺序号
(new
UFWebClientBaseAdapter(ePeriodNumber53).ClientInstance + ".set_Value('" +
ng() +"')");
//赋值记账期间
UFWebClientRefControlAdapter ref1 = new
UFWebClientRefControlAdapter(alPostPeriod128);
e = ng();
lue = ng();
lue = ng();
(InstanceWithValue);
}
catch (Exception ex)
{
(new
UFWebClientBaseAdapter(ePeriodNumber53).ClientInstance + ".set_Value('1')");
}
}
return args;
}
实例2
///
/// 物料参照设置
///
private void GridItemRef_DoBeforeCallback()
{
AssociationControl assoCGrid = new AssociationControl();
ServerControl = id11;
ame = "OnCellFocusEnter";
((UFWebClientGridAdapter)Control).("ItemInfo_ItemID");
ClientCallBackFrm callBackFrm = new ClientCallBackFrm();
omerAction += new
Customer(assoCGrid_DoBeforeItemAction);
(id11);
(assoCGrid);
(callBackFrm);
}
///
/// 物料参照设置
///
///
///
Object assoCGrid_DoBeforeItemAction(CustomerActionEventArgs args)
{
//接收到存储地点ID
ArrayList list =
(ArrayList)sh[_GRIDDATA_SelectedRows];
if ( <= 0) {
return args;
}
int curIndex = (list[0].ToString());
Hashtable hashT =
(Hashtable)((ArrayList)sh[ID])[curIndex];
object oWhID = hashT["Wh"];
String strWhere = getItemCustomerFilter(oWhID);
//
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id11);
olumnEditorAttribute("ItemInfo_ItemID",
utes_AddParam, new string[] { "UBF_AddCustomerFilter",
strWhere });
//
//test 控制最大最小值
olumnEditorAttribute("SUQty",
utes_MinValue, "111");
olumnEditorAttribute("SUQty",
utes_MaxValue, "888");
//返回
(InstanceWithRefAddParam);
(InstanceWithMaxValue);
(InstanceWithMinValue);
return args;
}
实例3
///
/// 存储地点参照
///
private void GridWh_DoBeforeCallback()
{
AssociationControl assoCGrid = new AssociationControl();
ServerControl = id11;
ame = "OnBeforeCellFocusEnter";
((UFWebClientGridAdapter)Control).("Wh");
ClientCallBackFrm callBackFrm = new ClientCallBackFrm();
omerAction += new
Customer(assoCGrid_DoBeforeWhAction);
(id11);
(assoCGrid);
(callBackFrm);
}
///
/// 存储地点参照
///
Object assoCGrid_DoBeforeWhAction(CustomerActionEventArgs args)
{
//接收到料品ID、单据日期
ArrayList list =
(ArrayList)sh[_GRIDDATA_SelectedRows];
int curIndex = (list[0].ToString());
Hashtable hashT =
(Hashtable)((ArrayList)sh[ID])[curIndex];
object oItemID = hashT["ItemInfo_ItemID"];
object oHeadDate = hashT["HeadDate"];
StringBuilder strB = new StringBuilder();
//1、库存异动-存储地点约束及消耗关系
(" IsStage = 0 ");
//设置存储地点的参照条件
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id11);
olumnEditorAttribute("Wh",
utes_AddParam, new string[] { "UBF_AddCustomerFilter",
ng() });
(InstanceWithRefAddParam);
return args;
}
文本控件适配器
如果需要访问文本控件,则在UI编程开发中应使用文本控件适配器,通过编写服务器
端代码,通过关联控件的框架生成相应的客户端脚本,来实现对文本控件的客户端关联操作。
功能
获取或设置日期控件的Value
通过Value属性可以获取或设置文本控件的值。如果是设置文本控件的值,则通过调用
ClientInstanceWithValue属性,该属性会根据Value属性产生客户端脚本代码,调用客户端的
set_Value()
方法,来设置文本控件的Value。
实例
下面的例子中演示了如何设置文本控件的值。其中RC_Symbol130是一个文本控件。
object assoC_DoCusSiteAction(CustomerActionEventArgs args)
{
UFWebClientTextBoxAdapter Symbol = new UFWebClientTextBoxAdapter(RC_Symbol130);
= symbol;
(InstanceWithValue);
return args;
}
下拉按钮控件适配器
如果需要访问下拉按钮控件,则在UI编程开发中应使用下拉按钮控件适配器,通过编
写服务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现对下拉按钮控件的客
户端关联操作。
功能
设置下拉按钮是否可用
使用ClientInstanceWithReadonly和ClientInstanceWithEnable属性可实现此功能。
可以为
False或True两种
类型。
当为
False
时置灰按钮,设置按钮不可点击,使有事
件的按钮不响应事件。相当于按钮Disabeld。
设置下拉按钮菜单项是否可用
使用SetEnabled方法和ClientInstanceOfMenuItemEnabled共同实现。
SetEnabled方法定义为
public void SetEnabled(string strIndex, bool enable)
,指定菜单
项的Index和是否可用即可。然后调用ClientInstanceOfMenuItemEnabled属性,该属性将产
生一段客户端脚本代码,调用客户端的
SetMenuItemEnable()
方法,从而设置菜单是否可用。
实例
实例1
下面的实例中演示了如何根据指定的条件设置菜单项是否可用。
private void CallbackControlBtnStatus()
{
AssociationControl ass = new AssociationControl();
ServerControl = id8;
ame = "OnRowClick";
CodeBlock block = new CodeBlock();
string condi = "if(";
condi += new UFWebClientGridAdapter(id8).ClientInstance +
".GetSelectedRows().length<=0)";
ion = condi;
UFWebClientPopUpItemAdapter item = new UFWebClientPopUpItemAdapter(el);
bled("0", false);
bled("1", false);
bled("2", false);
trol(item);
ck(block);
block = new CodeBlock();
string condi1 = "if(";
condi1 += new UFWebClientGridAdapter(id8).ClientInstance
+".GetSelectedRows().length>0)";
ion = condi1;
UFWebClientPopUpItemAdapter item1 = new UFWebClientPopUpItemAdapter(el);
bled("0", true);
bled("1", true);
bled("2", true);
trol(item1);
ck(block);
}
Label控件适配器
如果需要访问Label控件,则在UI编程开发中应使用Label控件适配器,通过编写服
务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现对Label控件的客户端关
联操作。
功能
操作事件Label控件
设置Label控件的PartID属性。通过调用ClientInstanceWithPartID属性,会根据PartID
属性,产生客户端脚本代码,调用客户端的
set_PartID()
方法,来设置Label控件的PartID,
弹出Form的URL。
通过TitleLinkWindowWidth属性设置弹出Form的Width属性。通过
TitleLinkWindowHeight设置设置弹出Form的Height属性。设置TitleLinkWindowWidth和
TitleLinkWindowHeight两个属性之后,通过调用
ClientInstanceWithTitleLinkWindowWidthHeight属性,来生成一段客户端脚本代码,设置弹
出Form的宽度和高度。
获取弹出Form返回的数据
使用以下两个方法可以实现。
ClientInstanceWithGetData方法其定义为
public string ClientInstanceWithGetData(string
strField)
ClientInstanceWithAllData方法其定义为
public string ClientInstanceWithAllData(string
strCode,string strName)
设置Label是否可用
有两个相关属性ClientInstanceWithLabelEnabledValue和ClientInstanceWithLabelEnable。
如果Lable是弹出Form的Label控件(即设置了PartID属性)这两个属性才生效。
ClientInstanceWithLabelEnabledValu同_EnabledValue一起使用。如果使用了_EnabledValue
属性,则可以使用ClientInstanceWithLabelEnabledValue属性来使控件是否可编辑。
ClientInstanceWithLabelEnable同
Enabled
一起使用。如果使用了_
Enabled
属性,则可以
使用ClientInstanceWithLabelEnable属性来使控件是否可编辑。
ClientInstanceWithEnable和ClientInstanceWithEnabledValue如果Lable不是弹出Form的
Label控件(即没有设置了PartID属性或PartID为null或空串)这两个属性才生效。
实例
实例1
private void RecBatchDocTypeChange()
{
AssociationControl assoC_5 = new AssociationControl();
assoC_ServerControl = ch_RecDocType41;
assoC_ame = "OnValueChanged";
ClientCallBackFrm cF = new ClientCallBackFrm();
omerAction += new
Customer(assoC_DoRecBatchDocTypeAction);
(ch_RecDocType41);
(ntType152);
(assoC_5);
}
object assoC_DoRecBatchDocTypeAction(CustomerActionEventArgs args)
{
UFWebClientLabelAdapter lab_DocumentType = new UFWebClientLabelAdapter(Label988);
lab_d = False;
(lab_InstanceWithEnable);
return args;
}
实例2 弹出Form Label控件
下面的实例中演示了如何设置一个Label控件为如果设置弹出Form的控件。
private void SetCustLabelPartID()
{
AssociationControl assoC_5 = new AssociationControl();
assoC_ServerControl = _Customer_IsMISC114;
assoC_ame = "onchange";
ClientCallBackFrm cF = new ClientCallBackFrm();
omerAction += new
Customer(assoC_DoPartIDAction);
(_Customer_IsMISC114);
(assoC_5);
}
object assoC_DoPartIDAction(CustomerActionEventArgs args)
{
bool isMisc =
(sh[_Customer_ID].ToString());
UFWebClientLabelAdapter lable0 = new UFWebClientLabelAdapter(3086);
UFWebClientLabelAdapter lable1 = new UFWebClientLabelAdapter(3092);
if (isMisc)
{
= "fef30b89-e43b-4c65-83ac-1cd3da3c3a67";
inkWindowHeight = 100;
inkWindowWidth = 315;
= "b220f790-7f8c-4073-b15b-7ad03d25023c";
inkWindowHeight = 100;
inkWindowWidth = 315;
}
else
{
= "c60a3c61-932c-45f9-9745-162e0807d1c9";
inkWindowHeight = 504;
inkWindowWidth = 992;
= "c60a3c61-932c-45f9-9745-162e0807d1c9";
inkWindowHeight = 504;
inkWindowWidth = 992;
}
(InstanceWithPartID);
(InstanceWithTitleLinkWindowWidthHeight);
(InstanceWithPartID);
(InstanceWithTitleLinkWindowWidthHeight);
return args;
}
表达式列表控件适配器
如果需要访问表达式控件,则在UI编程开发中应使用表达式控件适配器,通过编写服
务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现对表达式控件的客户端关
联操作。
设置控件的值
根据Value或ControlValue,通过调用ClientInstanceWithValue属性产生客户端脚本代码,
调用客户端的
set_Value()
方法,来设置表达式控件的Value。
CheckBox控件适配器
如果需要访问CheckBox控件,则在UI编程开发中应使用CheckBox控件适配器,通过
编写服务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现对CheckBox控件
的客户端关联操作。
功能
获取或设置CheckBox控件的值
通过Value属性可以获取或设置CheckBox控件的值,如果是设置控件的值,则可以使
用ClientInstanceWithValue属性,该属性会根据Value属性产生客户端脚本代码,通过调用
中的
set_Value()
方法,从而设置控件的值。
设置控件是否只读
通过调用ClientInstanceWithReadonly,该属性会根据控件的ReadonlyValue属性,产生
客户端脚本代码,调用客户端的
set_ ReadOnly()
方法,来设置控件是否只读。
设置控件是否可用
通过调用ClientInstanceWithEnable,该属性会根据控件的Enable属性,产生客户端脚本
代码,调用客户端的
set_ Enabled()
方法,来设置控件是否可编辑。
实例
下面的实例中
IsForeign428
是一个CheckBox控件,启用了该控件的
onclick
事件来触发关联。
CodeBlock codeBlockIsMatchPO264 = new CodeBlock();
assoC_ServerControl = ign428;
assoC_ame = "onclick";
expression = " if( !";
expression += new UFWebClientCheckBoxAdapter(ign428).Value;
expression += " )";
ion = expression;
assoC_ck(codeBlockIsMatchPO264);
Wizard控件适配器
如果需要访问Wizard控件,则在UI编程开发中应使用Wizard控件适配器,通过编写
服务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现对Wizard控件的客户
端关联操作。
清空Wizard页中的数据
设置IsClearData属性,指定是否清除Page的数据。通过调用ClientInstanceWithClearData
属性,产生客户端脚本代码,调用客户端的
Clear()
方法,用来清除控件上的数据。
DataGrid控件适配器
基本概念
如果需要访问DataGrid控件,则在UI编程开发中应使DataGrid控件适配器,通过编写
服务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现DataGrid控件的客户
端关联操作。
DataGrid控件的适配器对应于
UFWebClientGridAdapter
类,多在CallBack中使用,相当
于DataGrid控件的一个可控实例,对DataGrid控件的操作可以通过
UFWebClientGridAdapter
来实现。
常量属性
ALL_GRIDDATA
这是
UFWebClientGridAdapter
的一个静态常量,通过
ALL_GRIDDATA可以
在CallBack中获取
DataGrid客户端收集到服务器端的数据。
其定义为
public static string ALL_GRIDDATA = "ALL_GRIDDATA";
ALL_GRIDDATA_SelectedRows
这是
UFWebClientGridAdapter
的一个静态常量,通过
ALL_GRIDDATA_SelectedRows可以
在
CallBack中获取DataGrid客户端的所有选中行信息。
其定义为
public static string ALL_GRIDDATA_SelectedRows = "ALL_GRIDDATA_SelectedRows";
下面的实例说明了该常量的使用。
assoC_3_DoLinePopFormAction
是一个已定义的CallBack的处理函数。代码演示了在该处理
函数中(服务器端)获取当前客户端选中的行集信息。
object assoC_3_DoLinePopFormAction(CustomerActionEventArgs args)
{
if (((ArrayList)sh[_GRIDDATA_SelectedRows]).Count
<= 0)
return null;
string rowIndex =
((ArrayList)sh[_GRIDDATA_SelectedRows])[0].ToString();
//返回被选种的行号
……
}
FocusRow
这是
UFWebClientGridAdapter
的一个静态常量,通过
ALL_GRIDDATA_FocusRow可以
在CallBack
中获取DataGrid客户端的所有焦点行。
其定义为
public static string FocusRow = "ALL_GRIDDATA_FocusRow";
下面的实例说明了怎样通过FocusRow来获取焦点行当信息。
Do_CurMoneyChangedCallBack
是一个已定义的CallBack的处理函数。代码演示了在该处理函数
中(服务器端)获取当前客户端焦点行信息
object Do_CurMoneyChangedCallBack(CustomerActionEventArgs args)
{
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id0);
//获取焦点行
string rowIndex = sh[ow].ToString();
//取当DataGrid的数据信息
ArrayList res = (ArrayList)sh[ID];
//取当前行的内容
Hashtable hsCurRow = (Hashtable)res[(rowIndex)];
}
FocusColumn
这是
UFWebClientGridAdapter
的一个静态常量,通过
ALL_GRIDDATA_FocusColumn可以
在
CallBack中获取DataGrid客户端的焦点列。
其定义为
public static string FocusColumn = "ALL_GRIDDATA_FocusColumn";
下面的实例说明了怎样通过FocusColumn来获取当前DataGrid焦点列信息。
GridCellValueChange_CallBack_Action
一个已定义的CallBack的处理函数。代码演示了在该处
理函数中(服务器端)获取当前客户端焦点列信息。
private Object GridCellValueChange_CallBack_Action(CustomerActionEventArgs args)
{
long startTime = ;
Receivement_RcvLinesRecord lineRecord =
ement_dRecord;
string strIndex = sh[ow].ToString();
string strColumnIndex =
sh[olumn].ToString();
int curIndex = (strIndex);
int curColumnIndex = (strColumnIndex);
IUFDataGrid srcDataGrid = rceGrid();
string fieldID = s[curColumnIndex].UIFieldID;
Hashtable
}
hashT =
(Hashtable)((ArrayList)sh[ID])[curIndex];
BtnAdd
这是
UFWebClientGridAdapter
的一个静态常量,通过
BtnAdd可以
在CallBack中获取DataGrid
客户端的浮动菜单上的新增按钮。
其定义为
public static string BtnAdd = "AddButton";
BtnDel
这是
UFWebClientGridAdapter
的一个静态常量,通过
BtnAdd可以
在CallBack中获取DataGrid
客户端的浮动菜单上的删除按钮。
其定义为
public static string BtnDel = "DelButton";
BtnInsert
这是
UFWebClientGridAdapter
的一个静态常量,通过
BtnAdd可以
在CallBack中获取DataGrid
客户端的浮动菜单上的插入按钮。
其定义为
public static string BtnInsert = "InsertButton";
主要功能
获取或设置菜单是否显示
对应属性为MenuVisible,用来控制DataGrid的菜单项是否显示。
新增DataGrid的行
对应属性为AddRow。返回一段客户端脚本代码,用来调用中的
AddNewRow ()
方法。使用ClientInstanceWithAddRow属性可以实现这样的功能。
指定隐藏或显示的列的集合
ColumnsVisbled属性指定隐藏或显示的列的集合,为ClientInstanceWithColumnsVisbled
提供参数。
ArrayList 类
型元素为形如字符串数组
string[]{"fieldId","true/false"},
即指定
FieldID和true或false,true为可见,
false
表示隐藏。
使用ClientInstanceWithColumnsVisbled提供参数。根据ColumnsVisbled属性,产生客
户端脚本代码,调用客户端的
SetColumnVisible()
方法,来设置DataGrid中的指
定的列可见或隐藏。
获取DataGrid中的当前行的索引
使用CurrentRowIndex 属性,该属性产生客户端脚本,调用客户端中的
get_CurrentRowIndex()
方法。
清除DataGrid中的数据
如果
IsClearData属性
为true,则可以启用
ClientInstanceClearData
属性,如果为false,则
ClientInstanceClearData
返回为空串。使用ClientInstanceClearData属性,该属性返回一段客户
端脚本代码,通过调用客户端中的
ClearData()
方法,来清除DataGrid表体中的数
据,同时清楚DataGrid对应的UIModel中相应View的数据。
ClientInstanceWithClearData属性同ClientInstanceClearData实现一样的功能。
删除DataGrid中的数据
启动IsRemoveData属性,如果IsRemoveData为true,则可以启用
ClientInstanceWithRemoveData
属性,如果为false,则
ClientInstanceWithRemoveData
返回为空串。
ClientInstanceWithRemoveData属性返回一段客户端脚本代码,通过调用客户端
中的
ClearData()
方法,来清除DataGrid表体中的数据,而不清除DataGrid对应
的UIModel中相应View的数据。
设置Datagrid中可编辑的列集合
使用EnabledCols属性可以实现。
其定义为
public ist EnabledCols
常用方法
EnabledCols的中的元素对象为一个对象的数组(
Object[]
),格式如下:
第一个元素为指定的列的FieldName,
第二个元素为该列是否可编辑,即true/false,
第三个元素指定行的rowIndex,如果为空串默认为当前行。
例如如下代码:
(new Object[] { "IsMainVers", "false", "" });
其含义是设置当前行fieldName为“
IsMainVers
”的列不可用。
实例代码
AssociationControl assControl;
CodeBlock codeBlock;
string expression;
assControl = new AssociationControl();
ServerControl = id8;
ame = "OnBeforeCellFocusEnter";
//等级可用
codeBlock = new CodeBlock();
expression = " if( ";
expression += new
UFWebClientGridAdapter(id8).getSelectedValuePK("Item_IsGradeControl");
expression += " == ";
expression += "'true'";
expression += " )";
ion = expression;
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id8);
("FromDegree");
(new Object[] { "FromDegree", "true", "" });
("ToDegree");
(new Object[] { "ToDegree", "true", "" });
trol(grid);
ck(codeBlock);
设置DataGrid中的指定触发事件列
设置FireEventCols属性可以实现。该属性的定义为
public ist
FireEventCols。
常用方法
EnabledCols的中的元素对象为一个对象的数组(
Object[]
),格式如下:
第一个元素为指定的列的FieldName,
第二个元素为该列是否可编辑,即true/false,
第三个元素指定行的rowIndex,如果为空串默认为当前行。
实例代码
AssociationControl assControl;
CodeBlock codeBlock;
string expression;
assControl = new AssociationControl(); ;
ServerControl = id8;
ame = "OnBeforeCellFocusEnter";
codeBlock = new CodeBlock();
expression = " if( (";
expression += new
UFWebClientGridAdapter(id8).getSelectedValuePK("IsExecuted");
expression += " == ";
expression += "'true')";
expression += " && (";
expression += new
UFWebClientGridAdapter(id8).getSelectedValuePK("IsMainVers");
expression += " == ";
expression += "'true'";
expression += " ))";
ion = expression;
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id8);
("IsMainVers");
(new Object[] { "IsMainVers", "false", "" });
SetGridColEnable("false", grid);
trol(grid);
ck(codeBlock);
设置隐藏列集合
通过设置HiddenCols属性,可以设置隐藏列集合。
其定义为
public ist HiddenCols
常用方法
HiddenCols的中的元素对象为一个对象的数组(
Object[]
),格式如下:
第一个元素为指定的行的rowIndex,
第一个元素为指定的列的fieldId,
第二个元素为该列是否可编辑,即true/false,
第三个元素指定行的rowIndex,如果为空串默认为当前行。
设置DataGrid的一个Cell的Value
ClientInstanceWithValue与CellValue属性一共使用可以实现此功能。CellValue定义为
public ist CellValue
其定义为
public ist HiddenCols
常用方法
rowIndex,columnIndex,value
HiddenCols的中的元素对象为一个对象的数组(
Object[]
),格式如下:
第一个元素为指定的行的rowIndex,
第二个元素为指定的列的columnIndex,
第三个元素为指定行指定列的要赋的Value。如果是为一个参照列赋值。则第三个元素应该
是一个含有3个元素的字符串数组,分别是参照的ID、Code和Name的字符串形式。
设置了CellValue,后,使用该属性,可以生成一段客户端脚本代码,用来设置DataGrid
中的CellValue。
设置DataGrid的浮动菜单条中新增、插入和删除是否可用
ClientInstanceWithResetMenuStatus属性生产客户端脚本,设置DataGrid的浮动菜单条
中新增、插入和删除是否可用。
DataGrid条件合计
ConditionAggrList属性其代码定义如下:
public struct AggrColumnFlagFieldNameValue
{
public string AggregateColumnName;
public string ConditionFieldName;
public string ConditionFieldValue;
}
使用ClientInstanceWithResetCalculateAggregationsByCondition,ConditionAggrList存储
了根据指定条件列的Value进行合计时,被合计列的列名、条件列的列名、条件列的Value
三者之间的对应关系。通过调用中的
AddAggregateColumnFieldNameValue()
和
ResetCalculateAggregations()
方法在客户端合计当前DataGrid的列的数据。
DataGrid合计
使用ClientInstanceWithResetCalculateAggregations属性可以实现此功能,该属性通过调
用中的
ResetCalculateAggregations()
方法在客户端合计当前DataGrid的列的数据。
达到客户端合计达目的。
下面的实例使用了该属性,用于客户端合计。
public void AfterCreateChildControls()
{
Set_SumMoneyChange();
}
//处理合计行
private void Set_SumMoneyChange()
{
AssociationControl _asso = new AssociationControl();
_ServerControl = id0;
((IUFClientAssoGrid)_Control).("ThisDisposeMoney");
_ame = "OnCellDataValueChanged";
CodeBlock codeBlock = new CodeBlock();
string expression = "";
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id0);
ion = InstanceWithResetCalculateAggregations;
_ck(codeBlock);
}
再举一例
object assoC_DoRCPersionChangeAction(CustomerActionEventArgs args)
{
string RC_Symbol = sh[_ID].ToString();
//没有币种
if (RC_().Length == 0)
return null;
string RC_MoneyRound_RoundValue =
sh[_MoneyRound_ID].ToString();
string RC_MoneyRound_RoundType =
sh[_MoneyRound_ID].ToString();
string RC_MoneyRound_Precision =
sh[_MoneyRound_ID].ToString();
if (edIndex == 0)//当前页
{
#region 修改符号精度等
//如果帐号币种为空,帐号币种=收款币种07-7-17
//返回被选种的行号
ArrayList res = (ArrayList)sh[ID];
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id4);
int rowcount = -1;
for (int j = 0; j <= rowcount; j++)
{
(new Object[] { ng(),
"RecBillHead_RC_MoneyRound_Precision", new string[] { RC_MoneyRound_Precision,
RC_MoneyRound_Precision, RC_MoneyRound_Precision } });
(new Object[] { ng(),
"RecBillHead_RC_MoneyRound_RoundType", new string[] { RC_MoneyRound_RoundType,
RC_MoneyRound_RoundType, RC_MoneyRound_RoundType } });
(new Object[] { ng(),
"RecBillHead_RC_MoneyRound_RoundValue", new string[] { RC_MoneyRound_RoundValue,
RC_MoneyRound_RoundValue, RC_MoneyRound_RoundValue } });
(new Object[] { ng(), "RecBillHead_RC_Symbol",
new string[] { RC_Symbol, RC_Symbol, RC_Symbol } });
}
umnDefaultValue("RecBillHead_RC_Symbol", RC_Symbol);
umnDefaultValue("RecBillHead_RC_MoneyRound_Precision",
RC_MoneyRound_Precision);
umnDefaultValue("RecBillHead_RC_MoneyRound_RoundType",
RC_MoneyRound_RoundType);
umnDefaultValue("RecBillHead_RC_MoneyRound_RoundValue",
RC_MoneyRound_RoundValue);
(InstanceWithResetDefaultValue);
(InstanceWithValue);
////处理符号
string expression = "";
expression = Instance +
".ResetCurrencySymbolByColumnName('Money_OCMoney','" + RC_Symbol + "')";
(expression);
expression = Instance +
".ResetCurrencySymbolByColumnName('SettlementFee_OCMoney','" + RC_Symbol + "')";
(expression);
expression = Instance +
".ResetCurrencySymbolByColumnName('TotalMoney_OCMoney','" + RC_Symbol + "')";
(expression);
#endregion
(InstanceWithResetCalculateAggregations);
}
同一列的不同单元格内显示不同的控件
某些场景下,DataGrid中的同一列中不同行的数据类型也不同,因此不同单元格对应的
的控件也不同。例如同一列中,第一行数据是文本类型,第二行是日期类型,第三行是
CheckBox类型。此时需要用到DataGrid的运行时动态交换列控件的功能。
DataGrid需要定义不同的列,要显示多少种控件类型就定义多少列,除了显示列以外,
其余列都是隐藏列。在关联控件中,使用ClientInstanceWithSwitchColumnControl,该属性生
成客户端脚本,通过调用客户端的
SwitchColumnControl()
方法来交换列控件,使得隐藏列
的控件可以显示到显示列中来,这样实现了在同一列的不同单元格内显示不同的控件。
设置DataGrid的行的背景色
使用ClientInstanceWithReSetBgColor可以设置DataGrid的行的背景色。
判断指定列是否包含当前指定值
ClientInstanceWithIsContainOf方法可以实现此功能。
该方法有两个参数:
第一个参数为DataGrid列名FieldName。
第二个参数为Value。
其作用是生成客户端脚本代码,用来判断指定列(列名为FieldName的列)是否包含当
前值(Value)。
其定义为
public string ClientInstanceWithIsContainOf(string strFieldName,string strValue)
删除指定列的数据
ClientInstanceWithClearColumnData使用
ClearColumnData(string column)
方法,将要删除
数据的列都加入到一个类型为
ArrayList
的
_clearColumns
变量中,然后使用
ClientInstanceWithClearColumnData来生成客户端脚本,执行删除指定列的数据。
获取DataGrid的当前行信息
ClientInstanceWithRows获取DataGrid的当前行信息,产生客户端脚本代码,调用客户
端的
.get_Rows()
方法。返回DataGrid所有行的行数(count)。
获取DataGrid当前列的列索引
ClientInstanceWithCurrentColumnIndex获取DataGrid当前列的列索引,产生客户端脚本
代码,调用客户端的
get_CurrentColumnIndex()
方法。
获取DataGrid当前列的列索引
ClientInstanceWithRowStatus获取DataGrid当前列的列索引,产生客户端脚本代码,调
用客户端的
SetRowStatus ()
方法。
SetRowStatus ()
有两个参数,分别是行索引
rowindex,第二个参数为行状态state,SetRowStatus方法的定义为
SetRowStatus :
function(rowIndex,state)。
设置DataGrid是否为只读
ClientInstanceWithReadonly根据
Enabled
属性,来设置DataGrid是否为只读。产生客户
端脚本,通过调用客户端中的
set_ReadOnly()
来设置DataGrid是否只读。
获取客户端DataGrid的当前行的行索引
ClientInstanceWithCurrentRowIndex属性的作用就是是获取客户端DataGrid的当前行的
行索引。在服务器端调用该属性,可生成客户端脚本代码,通过调用客户端
get_CurrentRowIndex()
方法,来获取当前行的行索引。
使用ClientInstanceWithCurrentRows属性也可以实现ClientInstanceWithCurrentRowIndex
一样的功能。
设置DataGrid中的指定列是否不可编辑
使用ClientInstanceWithEnable属性。如果程序中指定了
EnabledCols
,即指定了某些特定
列为不可编辑列,则只使这些特定列为不可编辑。
如果没有对
EnabledCols
赋值,则指定整个DataGrid不可编辑。
设置某一列是否可以编辑
使用ClientInstanceWithSetColumnEditable属性和
ResetColumnEditable
方法一起使用。
如果使用了
ResetColumnEditable
方法可以设置了某些列为可编辑。
设置DataGrid控件的行状态
使用ClientInstanceWithReSetRowStatus属性,该属性生成一段客户点脚本代码,用来设
置客户端DataGrid的行状态。
设置DataGrid列为Form引用列
使用ClientInstanceWithReSetPartID属性,可以设置DataGrid中某一列为弹出Form列,
来设置该列为弹出Form的列。
以下实例代码演示了该属性的使用。
public string GetResetPartIDScript(UFWebClientGridAdapter grid, DataTable dt, string colName,
string judgeField)
{
string ex = "";
ex += " if(!" + Instance + ") return;n";
ex += " if(" + InstanceWithRows + "==0) return;n";
if (dt != null && > 0)
{
ex += " var judgeFieldValue=" + ectedValue(tRowIndex,
judgeField);
ex += " ;n";
foreach (DataRow row in )
{
if (row[0] != null && row[1] != null && row[2] != null && row[3] != null)
{
ex += " if(rCase()=='" +
row[0].ToString().ToLower() + "')";
ex += " { n";
olumnPartID(colName, row[1].ToString(), row[2].ToString(),
row[3].ToString());
ex += InstanceWithReSetPartID;
ex += " return;n";
ex += " } n";
}
}
}
return ex;
}
//同币种核销---行的选择
private void RowSelected(IUFDataGrid dataGrid, string maxMoneyCol, string curMoneyCol,
string MaxDiscountCol, string discountCol)
{
AssociationControl assControl = new AssociationControl(); ;
CodeBlock codeBlock = new CodeBlock();
ServerControl = dataGrid;//Grid的控件名
((IUFClientAssoGrid)Control).EventName = "OnBodyRowSelected";
//OnCellFocusOut
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(dataGrid);
string expression = "";
expression += " if(!" + Instance + ") return; n";
expression += " if(" + InstanceWithRows + "==0) return; n";
expression += " if(" + hecked(tRowIndex) + ")";
expression += " { n";
expression += " var maxMoney=" + ectedValue(tRowIndex,
maxMoneyCol);
expression += " ;n ";
expression += " if(maxMoney=='') return;n";
expression += gridSetCellValue(grid, tRowIndex, curMoneyCol,
"maxMoney");
expression += " } n";
expression += " else ";
expression += " { n";
expression += gridSetCellValue(grid, tRowIndex, curMoneyCol, "0");
expression += gridSetCellValue(grid, tRowIndex, discountCol, "0");
expression += " } n";
expression += Instance + ".SetRowStatus(" + tRowIndex +
","Mod"); n";
expression += etPartIDScript(new UFWebClientGridAdapter(dataGrid),
tIDTable_AP(), "DocNo", "IsPeriodBegin");
ion = expression;
ck(codeBlock);
}
设置当前的Cell为获取焦点的Cell
使用ClientInstanceWithFocus属性可以达到此功能,该属性返回一段客户端脚本代码,
通过调用客户端中的
FocusCurrentCell()
方法,来设置当前的Cell为获取焦点的
Cell。
触发DataGrid控件的PostBack
使用ClientInstanceWithPostBack属性,该属性返回一段客户端脚本代码,通过调用客户
端中的
FirePostBack()
方法,来触发PostBack。该属性与
PostBackTag
和
EventName
一起使用
。PostBackTag
属性也可以不设置。
动态移动DataGrid行数据
在关联控件中,SetSwitchRowDataInfo方法和
ClientInstanceWithSwitchRowData
属性,可以实
现在运行时动态移动DataGrid的行数据的功能。SetSwitchRowDataInfo方法中指定并设定
SwitchRowType,
支持以下四种交换,默认为
MoveFirstRow
。
public enum SwitchRowType
{
MoveFirstRow = 1,
MoveLastRow = 2,
MoveNextRow = 3,
MovePreviousRow = 4
}
SetSwitchRowDataInfo方法定义为
public void SetSwitchRowDataInfo(string[] strInChangeFields, SwitchRowType type)
第一个参数
strInChangeFields
第二个参数
type
判断某列是否包含指定值
使用ClientInstanceWithIsContainOf方法可以判断某列是否包含指定值。该方法
生成一段客户端脚本代码,通过调用客户端中的
ContainOf()
方法用来判断FieldName为第一个参数的指定的列中是否包含指定值。
两个参数:
第一个参数strFieldName,指定列的FieldName。
第一个参数strValue,指定的值。
判断指定的行是否被选中
使用RowIsChecked方法可以判断指定的行是否被选中。
该方法获取是指定的行是否被选中。参数为行索引(RowIndex)
清除列数据
使用ClearColumnData方法,用来设置要清除数据的列。通过调用
ClientInstanceWithClearColumnData属性,来产生一段客户端脚本,清除指定列的数据。
设置行索引为rowIndex的行当状态
使用SetRowStatus方法或ResetRowStates方法设置行索引为rowIndex的行当状态。
为指定列设置属性
使用ResetColumnEditorAttribute方法可以为指定列设置属性。
其代码定义为
public void ResetColumnEditorAttribute(string fieldName, string attribute, object value)
参数列表:
fieldName:DataGrid的列的fieldName
attribute:属性
Value:属性值
设置指定列的弹出Form的PartID
使用ResetColumnPartID方法,可以为columnName所在列设置弹出Form的PartID。
其代码定义为
public void ResetColumnPartID(string columnName,string partID,string w,string h)
参数列表如下:
columnName:列名
partID:弹出Form的partID
w弹出Form的宽度
h:弹出Form高度
ResetColumnEditable
设置DataGrid的columnName所在列可编辑
使用ResetColumnEditable方法可以设置DataGrid的columnName所在列可编辑,其
代码定义为:
public void ResetColumnEditable(string columnName, bool bEditable)
在rowIndex处插入行
使用InsertRow方法,可以实现这样的功能。其代码定义为:
public string InsertRow(int rowIndex)
设置DataGrid的rowIndex所在行是否被选中
使用SelectRow方法可以设置DataGrid的rowIndex所在行是否被选中,如果不指定
rowIndex,则为当前行。
其代码定义为
public string SelectRow(int rowIndex, bool bSelect)
public string SelectRow(string rowIndex, bool bSelect)
该方法用来返回一段客户端js脚本代码,用来设置指定行时候被选中。
该方法有两个参数:
第一个指定行索引rowIndex
第一个指定是否被选中。
如果是对当前行CurrentRow进行设置是否被中状态,则可以使用
public string SelectRow(bool bSelect)
这个方法。
设置rowIndwx所在行是否可编辑
SetColumnEditEnable方法可以设置rowIndwx所在行是否可编辑。其代码定义为
public string SetColumnEditEnable(int rowIndex, bool bEnabled)
设置rowIndex所在行的背景色
SetRowBackgroundColor方法可以设置rowIndex所在行的背景色。其代码定义为
public string SetRowBackgroundColor(int rowIndex, string strColor)
设置rowIndex所在行的字体
SetRowFrontColor方法可以设置rowIndex所在行的字体。其代码定义为
public string SetRowFrontColor(int rowIndex, string strColor)
设置Cell的字体颜色
SetCellFrontColor方法可以设置RowIndex所在行Column所在列的字体颜色。其代码定
义为
public string SetCellFrontColor(int rowIndex,string fieldName, string strColor)
SetCellBackgroundColor方法可是实现设置rowIndex所在行fieldName所在列的颜色。
其代码定义为
public string SetCellBackgroundColor(int rowIndex,string fieldName, string strColor)
设置列的默认值
使用SetColumnDefaultValue方法可以设置fieldName所在列的默认值。
public string SetColumnDefaultValue(string fieldName, string[] oV)
第一个参数为filedName
第二个参数为一个字符串数组。对于参照列,需要需要指明id code name这样一个string数组。
实例
该实例设置了参照列的默认值
//设置默认结算方式,银行帐号
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id4);
if (sh[ch_DefRecBank35] != null)
{
string strPk2 = sh[ch_DefRecBank35].ToString();
string strCode2 = sh[ch_ID +
"_Value"].ToString();
string strName2 = sh[ch_ID +
"_Text"].ToString();
umnDefaultValue("RecBk", new string[] { strPk2, strCode2,
strName2 });
(InstanceWithResetDefaultValue);
}
if (sh[ch_DefRecBank35] != null)
(new Object[] { rowIndex, "RecBk", new string[]
{ sh[ch_ID].ToString(),
sh[ch_ID + "_Value"].ToString(),
sh[ch_ID + "_Text"].ToString() } });
(InstanceWithValue);
Status((rowIndex), ed);
(InstanceWithRowStatus);
SetColumnDefaultValue方法还有一个代码实现如下
public string SetColumnDefaultValue(string fieldName, object oV)
设置指定行的制定列的单元格Cell的Text值
ValueName方法代码定义为
public string ValueName(string rowIndex, string strField)
含义是生成一段客户端脚本代码,用来设置指定行的制定列的单元格Cell的Text值。如果
不指定rowIndex为空字符串,则为rowIndex为当前行的索引。
该方法有两个参数:
第一个参数rowInde,指定行的行索引。
第二个参数strField,指定列的FieldName。
获取DataGrid的rowIndex所在行strField所在列的单元格Cel的Code的值
使用ValueCode方法获取DataGrid的rowIndex所在行strField所在列的单元格Cell的
Code的值,如果不指定rowIndex为空字符串,则为rowIndex为当前行。
其代码定义为
public string ValueCode(string rowIndex, string strField)
获取DataGrid的rowIndex所在行strField所在列的单元格的Value
使用ValuePK方法可以获取DataGrid的rowIndex所在行strField所在列的单元格的
Value,如果不指定rowIndex为空字符串,则为rowIndex为当前行的索引。其代码定义
为
public string ValuePK(string rowIndex, string strField)
获取当前行指定的列名称所在列的Value
getSelectedValueText方法返回一段脚本代码字符串,用来获取当前行指定的列名称所在
列的Value。其代码定义为
public string getSelectedValueText(string strField)
获取当前行指定的列名称所在列的Value
getSelectedValuePK方法返回一段脚本代码字符串,用来获取当前行指定的列名称所在
列的Value。其代码定义为
public string getSelectedValuePK(string strField)
获取fieldName 所在列的列索引
getColumnIndexByFieldName方法返回一段脚本代码字符串,用来获取fieldName 所在
列的列索引(Index)。其代码定义为
public string getColumnIndexByFieldName(string strField)
获取rowIndwx所在行指定列(strField)的cell的Value
getSelectedValue方法返回一段脚本代码字符串,用来获取rowIndwx所在行指定列
(strField)的cell的Value。其代码定义为
public string getSelectedValue(string rowIndex, string strField)
获取当前行指定列的Cell的Code
getSelectedValueCode方法返回一段脚本代码字符串,用来获取当前行指定列(strField)
的cell的Code。其代码定义为
public string getSelectedValueCode(string strField)
设置codeCol所在列的步长(step)
SetCodeColAndStep方法用于设置自增号步长。
其代码定义为:
public void SetCodeColAndStep(string codeCol, string step)
主要事件
DataGrid可以使用的事件列表如下:
function DataGridEvent(){}
RowSelectedChange="OnBodyRowSelectedChange";
RowSelectedValueChange="OnBodyRowSelectedValueChange";
RowSelected="OnBodyRowSelected";
reRowInsert="OnBeforeRowInsert";
reRowDelete="OnBeforeRowDelete";
rRowInserted="OnAfterRowInserted";
rRowDeleted="OnAfterRowDeleted";
FocusEnter="OnCellFocusEnter";
FocusOut="OnCellFocusOut";
Click="OnCellClick";
DbClick="OnCellDbClick";
hanged="OnRowChanged";
lick="OnRowClick";
Page="OnMovePage";
ress="Onkeypress";
reOpenDialog="OnBeforeOpenDialog";
rOpenDialog="OnAfterOpenDialog";
reCustomerPostBack="OnBeforeCustomerPostBack";
rRowAdded="OnAfterRowAdded";
reCellFocusEnter="OnBeforeCellFocusEnter";
DataChanged="OnCellDataChanged";
DataValueChanged="OnCellDataValueChanged";
reRowAdd="OnBeforeRowAdd";
ctAllRecords="OnSelectAllRecords";
rolValueChange="OnControlValueChange";
实例
下面实例1、实例2和实例3都是在AfterCreateChildControls中客户端代码,实现客户端关
联。
public void AfterCreateChildControls()
{
rent().AsyncPostBackTimeout =
32("90000");
erScript_OnCellDataValueChanged();
erScript_OnCellDataChanged();
erScript_OnBeforeCellFocusEnter();
}
实例1,使用
"OnBeforeCellFocusEnter"
事件
private void RegisterScript_OnBeforeCellFocusEnter()
{
IUFDataGrid ufGrid = id1;
AssociationControl ass1 = new AssociationControl();
ServerControl = ufGrid;
ame = "OnBeforeCellFocusEnter";
((IUFClientAssoGrid)Control).("DynamicCreate");
CodeBlock block;
UFWebClientGridAdapter grid;
block = new CodeBlock();
grid = new UFWebClientGridAdapter(ufGrid);
ion = "if(" + ectedValuePK("BE_Create") + "=='0')";
(new string[] { "DynamicCreate", "false", "" });
trol(grid);
ck(block);
}
实例2,使用
"OnCellDataChanged"
事件
private void RegisterScript_OnCellDataChanged()
{
IUFDataGrid ufGrid = id1;
AssociationControl ass1 = new AssociationControl();
ServerControl = ufGrid;
ame = "OnCellDataChanged";
((IUFClientAssoGrid)Control).("BE_Create");
CodeBlock block;
UFWebClientGridAdapter grid;
//设置系统记录编码、名称不可改
block = new CodeBlock();
grid = new UFWebClientGridAdapter(ufGrid);
ion = "if(" + ectedValuePK("BE_Create") + "=='0')";
ion += "{";
(new object[] { "", "DynamicCreate", new string[]
{"-1","","" } });
ion += InstanceWithValue;
ion += "}";
trol(grid);
ck(block);
}
实例3使用
"OnCellDataChanged"
事件
private void RegisterScript_OnCellDataValueChanged()
{
IUFDataGrid ufGrid = id1;
AssociationControl ass1 = new AssociationControl();
ServerControl = ufGrid;
ame = "OnCellDataChanged";
((IUFClientAssoGrid)Control).("BE");
CodeBlock block;
UFWebClientGridAdapter grid;
//增加
block = new CodeBlock();
grid = new UFWebClientGridAdapter(ufGrid);
//ion = "";
(new object[] { "", "DynamicCreate", new string[] { "-1", "",
"" } });
trol(grid);
ck(block);
//修改
block = new CodeBlock();
grid = new UFWebClientGridAdapter(ufGrid);
//ion = "if("+ ectedValuePK("SegmentType")+"=='2')";
(new object[] { "", "DynamicDelete", new string[] { "-1", "",
"" } });
trol(grid);
ck(block);
//删除
block = new CodeBlock();
grid = new UFWebClientGridAdapter(ufGrid);
(new object[] { "", "DynamicUpdate", new string[] { "-1", "",
"" } });
trol(grid);
ck(block);
//读取
block = new CodeBlock();
grid = new UFWebClientGridAdapter(ufGrid);
(new object[] { "", "DynamicSearch", new string[] { "-1", "",
"" } });
trol(grid);
ck(block);
}
实例4、使用
OnCellDataChanged
事件
private void OnEndCellEditing_IsDefaultCurrency()
{
AssociationControl assoCGrid2 = new AssociationControl();
CodeBlock codeBlock = new CodeBlock();
ServerControl = rrency;
ame = "OnCellDataChanged";//OnCellFocusOut
((IUFClientAssoGrid)Control).("IsDefaultCurrency");
//
ClientCallBackFrm cF2 = new ClientCallBackFrm();
omerAction += new
Customer(assoCGrid_DoCustomerAction);
(rrency);
(assoCGrid2);
(cF2);
}
///
/// GridCallBack事件处理
///
///
///
private object assoCGrid_DoCustomerAction(CustomerActionEventArgs args)
{
int foucusIndex =
(((ArrayList)sh["ALL_GRIDDATA_SelectedRows"])[0].ToString());
ArrayList gridData = (ArrayList)sh[ID];
Hashtable foucusRow = (Hashtable)gridData[foucusIndex];
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(rrency);
if (foucusRow["IsDefaultCurrency"] != null &&
!OrEmpty(foucusRow["IsDefaultCurrency"].ToString()))
{
int index = foucusRow["IsDefaultCurrency"].ToString().Trim().IndexOf("$");
string strIsBase;
if (index > 0)
{
strIsBase = foucusRow["IsDefaultCurrency"].ToString().Trim().Substring(0,
index);
}
else
{
strIsBase = foucusRow["IsDefaultCurrency"].ToString().Trim();
}
if ((strIsBase))
{
for (int i = 0; i < ; i++)
{
if (i != foucusIndex)
{
(new Object[] { ng(),
"IsDefaultCurrency", new string[] { "false", "□", "□" } });
}
}
}
(InstanceWithValue);
}
return args;
}
实例5、使用OnCellClick事件
下面的示例中演示了,通过注册
OnCellClick
事件,将DataGrid上一列的数据如何赋值到Card
上控件上。
private void setCardData()
{
AssociationControl assoC_3 = new AssociationControl();
CodeBlock codeBlock = new CodeBlock();
assoC_ServerControl = id1;
assoC_ame = "OnCellClick";
////客户端赋值部分
ion = "";
SendGridItemToCard(codeBlock, ccount218, "Account");
SendGridItemToCard(codeBlock, rrorMessage0, "ErrorDescription");
assoC_ck(codeBlock);
//服务器赋值部分
ClientCallBackFrm cF = new ClientCallBackFrm();
omerAction += new
Customer(assoC_3_DoSetCardDataAction);
(id1);
(ign428);
(mo);
(assoC_3);
}
///
/// 把grid某一列的值赋到卡片上
///
/// codeBlock
/// 带到卡片上的控件
/// 列属性名
private void SendGridItemToCard(CodeBlock codeBlock, IUFControl control, string
colFieldID)
{
trol(ID, control).ControlValue =
new UFWebClientGridAdapter(id1).getSelectedValueText(colFieldID);
}
报表开发框架
报表开发流程
通过DataComand生成缺省模板
报表生成工具
设计UIModel
选择字段
配置报表
服务器
设计UIForm
选择结果栏目
设计报表模
设计报表参
版布局
数
选择缺省结
果栏目
UIForm和报表
模版绑定
设计数据源
和查询
选择条件栏
目
生成框架代
码
选择控制条
件
定义单元表
达式
设置报表栏
目属性
生成DataCommand框架
报表格式和数
代码
据处理处理
报表模版国
际化处理
设计取数
测试
发布报表
注册
报表开发基本工艺路线
DataCommand
应用设计器设计DataComand模型
生成代码,添加取数逻辑。
调试
报表模板
导入DataCommand生成缺省报表模板。
应用报表设计器设计报表模板
报表模板发布
报表UI设计
报表方案管理设计(公共)
报表Form设计(结果Form绑定报表模板)
报表格式/数据处理策略。(应用报表元数据服务)
客户端展现。
DataCommand开发
说明
当报表数据查询逻辑复杂到无法用SQL或OQL实现时需要自定义数据查询。
ReportServer是报表主要服务器,UBF报表用自定义扩展类接管U9报表的所有
数据读写功能。
数据查询扩展物理上与ReportServer运行于同一进程。
自定义的扩展类必须继承BaseReportDataCommand(基类提供接口的默认实现)。
用DataCommand实现复杂报表的设计步骤
1.创建专用的工程,引用下列报表服务提供的组件
2.继承BaseDataCommand类创建业务逻辑实现类,确定业务逻辑中需要的查询参数。
测试保证类能正确执行,特别是当参数无值是应按默认的参数值输出;
3.编译工程,并将动态库注册到报表设计器。
4.在报表设计器中创建新报表,创建数据查询,将数据来源映射到业务逻辑实现类中
(设计器提供特定的方法)。
5.创建查询参数(查询参数的数量和名称应该在业务逻辑中已事先确定),将查询参数
映射到报表参数。
6.执行查询取得结果集合的Schema之后设计报表格式。
7.发布动态库到报表服务器并注册。
8.在设计器中调试报表,确定成功后发布报表。
继承BaseReportDataCommand实现报表复杂业务逻辑
BaseReportDataCommand基本编程模式
BaseReportDataCommand用于支持服务器端业务逻辑编程模型,该类即实现了对报表
数据逻辑的扩展又实现了向下的编程接口,任何复杂业务逻辑都必须继承该类。
1. BaseReportDataCommand编程接口说明
属性:
DefaultConnectString
QueryContext
说明
默认的数据库连接字符串
用于报表查询的上下文,运行环境中报表上下文将包
含UBF系统上下文。
Parameters
Groups
Orders
报表查询参数集合
分组查询参数集合
排序参数集合
反映客户端栏目的变化
Select
IDataReader ExecuteDataReader()
可覆盖方法:
执行业务逻辑返回数据集
2. BaseReportDataCommand生存周期
使用查询参数
查询参数从基类的Parameters属性中获取,查询参数只用于业务逻辑中的数据过滤操
作。类接口详细说明如下表:
类/接口 属性/方法
查询参数描述
参数名称
条件表达式:如果关联了报表参数:则按SQL条件
语法返回当前条件项的条件表达式:如cDepCode
=’01’
DataType
Operator
参数类型:字符、数值、日期、逻辑
如果关联了报表参数:则返回界面输入比较方式,
如>,=,<,<>,between等否则默认为等于
Values 返回参数值集合:如报表条件输入Between 10 to
20 则 Values{value[0]=10,value[2]
=20} ,如果输入值:in (10,20,30,40)则
Values{value[0]=10,value[1]=20,value[2]=30}
Value 返回参数值集合的第一个元素,按参数类型转型。
将所有查询参数的条件表达式用 and 组织成不带
Where子句的条件串
ToString(indexlist:int[]):string 组织条件串,只用IndexList中枚举的查询参数
说明
IQueryParameter/QueryParameter
Name
Expression
QueryParameterCollection
ToString():string
ToString(nameList:string[]):string 组织条件串,只用nameList中枚举的查询参数
使用分组参数
类/接口 属性/方法
分组参数项
分组字段或表达式
分组参数集合
按SQL语法返回不带Group by关键字的分组子
句
说明
IGroupParameter/GroupParameter
FieldExpression
GroupParameterCollection
ToString():string
使用排序参数
类名 属性/方法
排序参数项
说明
IOrderParameter/OrderParameter
FieldExpression 排序字段或表达式
Order True 升序,false降序
排序参数集合
按SQL语句返回不带Order by关键字的排序子句
OrderParameterCollection
ToString()
使用栏目参数
类名 属性/方法
栏目参数项
栏目字段
栏目参数集合
所有方法都继承自List
说明
ISelectParameter/SelectParameter
FieldName
SelectParameterCollection
使用上下文
类名
QueryContext
属性/方法 说明
上下文参数,用于传递运行环境中的参数,或其它需要
从客户段收集的参数,所有用于传递的对象都必须可序
列化。
Add()
GetValue()
SetValue()
Contains()
Clear()
Remove()
ToBase64String()
FromBase64String()
增加上下文
取得上下文
设置上下文
判断指定名称的上下文是否存在
清除所有的上下文
删除特定的上下文
说明
DataCommand 功能
DataCommand 是利用 报表服务传递过来的 报表参数,Selects,Groups ,Orders 等集合组织
一个取数的逻辑。过程如下图所示:
3 步:给DataCommand设置数据源
4步:给DataCommand设置报表参数。
5步:给DataCommand设置上下文,包括Selects ,Groups,Orders等。
6步:调用DataCommand
7步:返回DataCommand的执行结果 IdataReader。
absDataCommand 实现的是上图中的第6步:执行具体的DataCommand执行取数逻辑。
该抽象类继承了报表引擎的 BaseReportDataCommand ,对该基类进行了简单封装,
所有DataCommand都必须继承此类。如下图:
在该类中提供了3中返回DataReader的方法:
A 重写 ExeDataReader 方法
对于简单报表可以重写该方法,不需要创建临时表,直接返回结果IdataReader
B 重写public virtual DataTable ExecuteDataTable() 方法。
对于需要从 DataTable返回数据的报表可以重写 该方法。
对于A,B 两种方式都需要自己处理ShowMode=0时,返回空集的情况,一般可以给结果
Oql加一个 where 0=1 的限定条件。
C 实现 GetOqlString()中的 ProcessData() 方法就可以了,该方式总是需要一个结果临时
表,处理完后把最终的数据放入该临时表,这里代码生成时临时表名称是
ResultTempTable 。
DataCommand 主要属性,方法说明
1 ShowMode 参数说明:
ShowMode=0:表示返回空的临时表,在报表第一次展现或者报表业务处理逻辑出现错误
时,返回空的临时表。
ShowMode=1 ,执行正常的报表逻辑,该常数在AbsReportDataCommand的已经做过处理。
2 EntityViewQuery : viewQuery
该对象主要用来执行Oql返回数据,创建临时表
注意: 利用该对象执行Oql时,需要使用一个数据库连接,该连接的状态有基类
BaseReportDataCommand来维护,在报表子类中不要处理,在整个报表业务逻辑处理要确保
使用一个EntityViewQuery,不要使用 New EntityViewQuery 来创建。
3 在DataCommand中 报表服务给报表传过来几个集合:
关于查询参数,分组参数,排序参数,上下文的说明,参见:上面介绍
Paramsters ,Selects ,Groups ,Orders ,QueryContext
Paramsters :中包含了报表UI给DataComand的传过来的查询条件,其中包含两部分:
控制参数 ControlParams
它主要是用来控制报表的格式,以及哪些条件,哪些栏目需要处理。一般不是作为报表的查
询条件使用的(每个控制参数都需要特殊处理)
查询参数: 这是直接作为报表查询条件的,其中大部分条件可以直接使用,但是有小部分
需要经过特殊处理后才能使用。(这是报表条件处理比较麻烦的一部分。)
GroupParameterCollection Groups
OrderParameterCollection Orders
SelectParameterCollection Select
Select:用户选择栏目
Groups : 包含行分组,列分组
Orders: 包含了哪些列需要进行排序,这个在DataCommand基类里已经做过处理。
4 List
AllSelectFieldList : 包含了全部用户可以选择的列,一般情况Select 集合中只有用户选择
的少量的列,而 AllSelectFieldList是全部列,应为DataCommand返回列总是固定的,所
有只有Select集合中的列才需要取数,而其它列则取Null就可以了。
5 public override IDataReader ExecuteDataReader()
ReportService 调用DataCommand只需要返回一个dataReader ,该方法已经在基类里做了默
认实现,在具体的DataCommand中就不需要实现了。在该方法中调用了报表取数的3中方
式。
A 该方法用于简单的报表,不需要创建临时表的情况
public virtual IDataReader ExeDataReader()
{
return null;
} //end ExecuteDataReader
B //该方法用于 返回DataTable的情况。
public virtual DataTable ExecuteDataTable()
{
return null;
} //
C protected internal abstract string GetOqlString();
代码生成时生成了GetOqlString()方法
该方法需要每个DataCommand中都去实现具体的逻辑,要根据设计文档去写。
public virtual string GetResultOql(string tableName, string showMode)
该方法是构造一个最终结果的Oql:从结果临时表上取数。
ShowMode=0 时:返回空的结果临时表
Select * from TempTable where 0=1
ShowMode=1 时返回正常的结果。
6 其它集合
FilterDefines FilterDefines
该集合是报表参数集合
FieldCollection FieldCollection
该集合是结果字段集合
List
该集合是DataCommand导入时,生成DataTable列的集合,如果该集合为空,则使用
DataCommand返回的所有列。
以上3个集合是在代码生成时自动生成。并且在Extend文件中留有手工添加子项的方
法块。
DataSource基类的说明
属性:
_util
说明
用于拼装结果Oql语句的工具类
方法:
Selection
Conditions
Groups
Orders
AddSelect(exp : string) : void
AddCondition(p:IQueryParameter)
AddGroup(exp : string) : void
Select 字段集合类
Condition 集合类
分组集合类
排序集合类
为结果Oql添加select 子项
为结果Oql添加条件 子项
为结果Oql添加分组 子项
为结果Oql添加排序 子项
返回_util工具类拼装好的Oql
用于给数据源手工指定连接(该方法
已经废弃)
AddOrder(exp : string, isAsc : bool)
GetOqlString() : String
SetCustomerJoinInfo(List
RemoveSelect(aliasName:string)
RemoveCondition(aliasName:string)
RemoveGroup(aliasName:string)
RemoveOrder(aliasName:string)
删除栏目
删除条件
删除分组
删除排序
说明: 该类主要是为DataCommand提供拼装Oql的功能 ,简化其复杂度。所有数据源都
必须继承该类.
AddSelect ,AddCondition,AddGroup,AddOrder方法都提供了多个重载.
工作原理:
实体别名Map: 主要是给实体定义别名影射,方便使用
("INVTotalCostLine" , "UFIDA::U9::InvTrans::MonthClose::INVTotalCostLine");
("ItemCategoryCross" , "UFIDA::U9::CBO::SCM::Item::ItemCategoryCross");
字段别名Map :定义字段别名影射
(INVTotalCostLine_SOB , "");
(INVTotalCostLine_CostField , "eld");
定义了实体Map,字段Map后 ,你可以使用 DataSourde提供的
AddSelect ,AddCondition ,AddGroup ,AddHaving,AddOrder 等方法来提供Oql元素,最后调
用 GetOqlString()来返回最终的Oql。
以上几个方法都提供了多种重载方法,请自己选择使用。
注意: 当你需要使用 Select Top 5 或者 Select distinct 的语句时 ,你需要先调用一下
SetSelectKey(”select top 5 “),这样在 返回Oql时 会加上该语句。
SetCustomerJoinInfo(CustomerJoin) 该方法主要是用在 设置两个没有直接关联关系的两个
实体建立连接的一种方式。
例如:
tomerJoinInfo(new
CustomerJoinInfo("fo
"", in));
调用该方法使 物料信息上的物料和物料交叉表通过物料的ID和物料交叉表的物料建立关
联。你就可以使用物料交叉表的数据了。
说明: 该方法(SetCustomerJoinInfo)将要废弃 ,因为它始终要把指定的两个表进行连接,
不管是否选取了 第二个实体的字段 ,这样会有效率问题。
现在推荐使用 如下方式 :
在 DataSource 中重写
GetCustomJoinMap() 方法
public override IDictionary
GetCustomJoinMap()
{
CustomerJoinInfo test1 = new
CustomerJoinInfo("fo
D", "", in);
IDictionary CustomerJoinInfo>(); CustomerJoinInfo test2 = new CustomerJoinInfo("o TYPE>.EntityID", "", in); //ionString = + "=1"; ("UFIDA::U9::CBO::SCM::Item::ItemCategoryCross", test1); ("UFIDA::U9::Lot::LotMaster", test2); return dic; } 这样在 只有在Oql中使用了 物料分类,批号中的属性时才会关联该表。 工具类的说明 方法:(静态方法) String GetSql(string oql) String GetSql(string oql,EntityViewQuery q) 将Oql翻译成Sql后返回 将Oql翻译成Sql后返回(用于带有临时表的 语句 方法:(静态方法) CreateTempTableByOql AppendNonQueryForTempTable 通过Oql创建临时表 将新的Oql返回的数据附加到指定的临时表中 GetTempTableDataSet(tempTable,strOql,q) 通过Oql创建临时表,并将表中的数据作为DataSet 返回。 GetTempTableDataSet(strOql,q) 通过Oql返回DataSet,q 用来读取临时表的数据 注意: q 必须和创建临时表的q 是同一个. ExecuteDataReader(oql, viewQuery: EntityViewQuery) ExecuteScalar(oql, viewQuery: EntityViewQuery) 执行Oql返回结果集的第一行,第一列的值 执行Oql从临时表中返回DataReader 方法:(静态方法) inCludeSingleComma) GetInString(DataSet ds,string 返回由 DataSet中某列构造的 In字符串 GetInString(List columnName, bool inCludeSingleComma) 代码结构说明 关于DataCommand中的元素国际化问题: 定义一个资源管理类如下: Public Class ResManager { Public static Test { Get { Return “Test”; } } } Oql使用说明 实体和数据库表的对应关系 实体属性有以下几种情况: A 普通类型 实体中的简单属性直接对应表中的字段(名称一致,类型一致) B 通用实体 实体中的通用实体属性对应表中的两个字段: 类型名称_EntityID(long),属性类型名称 _EntityType(varchar(100)) 关于通用实体实体类型如何取:(对于通用实体只有EntityID,EntityType ) 它会在本表中生成两个字段: 属性名_EntityID,属性名_EntityType Oql:select ID , Type from UFIDA::U9::SD::SaleOrder::SOShipline Sql select A.[SOSourceEntityKey_EntityID], A.[SOSourceEntityKey_EntityType] from SD_SOShipline as A C 属性类型 实体中的一个属性类型对应表中的n个字段,格式:属性类型名称_属性类型下的属性名(类 型一致) (有几个属性就会在表中产生几个字段,如果该字段是国际化字段,该字段会产生在对应的 国际化表中, 取这种字段时会关联国际化表) 关于属性类型的取值方式(不能直接使用属性类型,只能使用它下面的字段) 例子: Oql: select , from UFIDA::U9::SD::SaleOrder::SOShipline Sql: select A.[ShipmentPlanQtyTradeUOM_Amount], A2.[Name] from SD_SOShipline as A left join [Base_UOM] as A1 on (A.[ShipmentPlanQtyTradeUOM_UOM] = A1.[ID]) left join [Base_UOM_Trl] as A2 on (lag = 'zh-CN') and (A1.[ID] = A2.[ID]) 这个通过本表中的 ShipmentPlanQtyTradeUOM_UOM 再和UOM([Base_UOM])关联, 因为Name是国际化字段,所以要和[Base_UOM_Trl] 关联. // ProvideSupplier 是属性类型 Oql: select erName from UFIDA::U9::SD::SaleOrder::SOShipline Sql: select A1.[ProvideSupplier_SupplierName] from SD_SOShipline as A left join [SD_SOShipline_Trl] as A1 on (lag = 'zh-CN') and (A.[ID] = A1.[ID]) 因为ProvideSupplier 是属性类型 所以erName 在本表(SD_SOShipline) 中会有ProvideSupplier_SupplierName 又因为ProvideSupplier_SupplierName 是国际化字段, 所以要在SD_SOShipline 对应的国际化表中找。 D 实体类型 实体中的实体类型在本表中只保留一个Long型的字段(名称和属性名称一致) 当需要取该字段下的其他属性时(如:Name ) ,此时会产生和该实体的关联来取该实体的字 段. 如果它的字段是国际化字段还需要 关联它自己的国际化表. 产生表关联的情况:(默认为left jion 可以指定right join ,inner join ) A.B.C 产生A和B的关联, A.B (B 为实体字段此时B对应是一个Long型的字段)此时不产 生表的关联, 只有A.B.C 时才产生A和B的关联, 如果C是国际化字段还要关联B对应的国际化表.A.B B 为A中的国际化字段需要和A对 应的国际化表进行关联 E 枚举类型 枚举类型属性直接对应表中的字段( 0,1… ,value) 实际使用时 需要通过一个自定义函数 来取它的显示名称(text) 处理枚举值原则: 在取数过程中都使用 ( 0,1… ,value) value值,最后在 结果临时表中 使 用Update语句修改成 它的国际化名称(显示名称) 自定义函数的说明 1 数据库的标准函数可以直接使用 Oql : select count(), from UFIDA::U9::SD::SaleOrder::SOShipline Sql: select count(A.[ShipmentPlanQtyTradeUOM_Amount]), A.[ShipmentPlanQtyTradeUOM_UOM] from SD_SOShipline as A 2 参见:在OQL中使用SQL Server内置函数 3 自定义函数的使用(这部分可以共享) 自定义函数在中注册后就可以象Sql标准函数一样使用. 注意: 文件放在 测试项目的Dubug目录下 注册格式如下: 关于报表中使用存储过程的说明 报表中一般不使用存储过程,但是如果自定义 函数无法实现时也可以使用存储过程 临时表的使用说明(临时表是基于数据库连接的) 注意: 临时表是基于数据库连接的,数据库连接断了,临时表就消亡了。 所以:临时表操作的过程中必须使用同一个EntityView 1 基本操作 定义临时表结构 2 往临时表中附加(Append)数据(要求:类型,字段个数必须一致) 数据来源可以是实体,也可以是临时表 注意: 测试两个临时表Append操作,字段个数一致,对应数据类型一致,但是名称可以不同 合并后的字段名以第一个表为准. (这里一定要注意,可能引起数据错误) 3 修改临时表(udate ,delete ) Oql=”update temptable set field1=’xx’, field2= 1” eTempCollection(oql, null); 4 Union ,Union All 操作 5 case when 使用 6 临时表的关联 (需要手工指定连接类型和ON条件)) A 实体表和临时表的关联 注意: 实体必须写在前面,如果 需要临时表在前面 可以使用right join 否则 会抛未将对象引用设置到对象的实例。 B 临时表和临时表的关联 临时表的连接操作必须使用别名 如: aaa , bbb 都是先创建的临时表 select from aaa as a left join bbb as b on = 可以 select from aaa as a left join bbb on = 不可以 使用表关联时 最好不要用 a.* 的操作 否则可能抛异常 (前一个版本可以) 如 : select a.* from aaa as a left join bbb as b on = 不可以 ,抛下面的异常 "select ,b." Normal syntax error during parsing 临时表操作常见问题 : 1 更新临时表 的语句不能 使用 from 子句. 如: update aaa set Name='kkk' from aaa as a left join bbb as b on = 2 不能在 from 子句中 使用 Union (all) 如: select * from (select * from aaa union select * from bbb) as A 示例 参见OqlTest项目 报表DataCommand开发过程说明 报表DataCommnd开发过程分为下面 4步: 1 仔细阅读报表设计文档和需求文档 ,找出 本报表需要从哪个实体取数,需要这些实体的 哪些字段, 其中哪些字段用于select项 ,条件项 ,分组项,排序项。方便后面生成代码时使用。 并理解 该报表的具体业务逻辑。 2 使用代码生成工具来生成本报表的框架代码,具体过程请参见 6.2.7 代码生成工具介绍 3 代码生成完成后,打开 该项目 在新加的DataCommand类中的 GetOqlString() 方法中 添加必要的业务处理逻辑,以完善报表功能。 4 在测试项目对应的测试文件中填写测试代码 ,然后对该DataCommand进行 详细测试。 代码生成工具使用介绍 报表开发工具 选择报表报表代码生成向导,弹出 解决方案对话框 1. 服务组名称: 请在列表中选择一个服务组,该服务组名称决定了项目的名称。 如:选了Base : 则项目名称是: mmand. 如果以前生成过该项目,再次选择时会列出该项目的 生成路径,DataCommand模型,现有 项等信息。 并会把本次生成的 DataCommand,DataSource ,DataCommandTest 等文件加入到当前选中的 项目中。 2 生成路径: 生成的报表项目的存放路径。 3 DataCommand模型: 如果选择了DataCommand模型,就会把您上一次选择的信息,显示出来,您可以在该基础 上进行修改。 4 现有项: 现有项中列出了 该项目中已经存在的DataCommand和DataSoruce的名称 如果只想生成DataCommand . 选择 只生成 DataCommand 复选框,点击下一步就会直接跳 到 DataCommandInfo对话框 选择一个数据源,然后填写 DataCommand名称,控制参数后,点击确定即可。 点击下一步 弹出 选择字段信息对话框 点击 选择字段 按钮 ,弹出 选择实体信息对话框。 在 实体名称中输入要查询的实体,点击 查询按钮 ,列表中出现 你选择的 实 体信息。 在DataGrid中双击你要使用的实体,在下面的属性DataGrid中,就会列出该实体的全部属性。 注意: 实体全名是 实体导向的全称 如: Address下的Contact 实体名称 是: Contact 实体全名是: t 如下图: 注意: 粗体部分表示可以双击,进入该实体或者属性类型来选择它下面的字段属性。 选择实体字段的规则: 基本属性:作为当前实体的一个字段。 实体属性:自动选择实体的ID,Code,Name(没有就不取) 属性类型:自动取属性类型下的所有属性,如果该属性又是实体则取该实体的Code,Name 属性 模式匹配: 在模式匹配文本框中输入模式字符串,点击匹配,在属性DataGrid中就会列出匹配的字段 信息 点击显示全部属性,就会显示出该实体的全部属性。 选中DataGrid的多行后,在 DataGrid的“选中”列头上右击鼠标,回弹出 选中,取消菜 单,进行多选操作。 返回按钮: 从子实体中导航到主实体 如: rise 点击返回时: 直接显示 Address的属性 返回上级: 从子实体导航到上一级实体。 如: rise 点击返回时: 直接显示 Contact的属性 在所有的字段都选择完成后,点击确定按钮,你刚才选择的所有属性就出现在选择字段对话 框中的DataGrid中了。如下图: 报表参数 : 表示该字段是否作为报表参数。 结果栏目: 表示是否作为结果列。 缺省列: 如果选了该复选框,则在生成默认的报表模板时自动生成该字段。 是否排序:表示该字段是否可以作为排序项。 是否可选:表示该字段是否是固定栏目 是否行组:表示该字段是否时行分组 是否列组:表示该字段是否是列分组 操作提示: 1 在DataGrid的行上双击会弹出选择实体属性对话框,并在实体属性DataGrid中列出 实体全称的末级实体的所有属性。(双击当前行进入末级实体选择界面) 2 先选择DataGrid 的多行,在 每一个带CheckBox的列上点击右键可以对选择的多行 进行多选操作 3 删除多行: 选择DataGrid的多行,直接按键盘上的Delete键,弹出是否删除的确认框,选择是就 会删除所选的行。 点击下一步 弹出 DataCommand信息对话框。 在该对话框中输入 DataCommand ,DataSource 名称 ,如果该DataCommand有控制参数 , 则在控制参数DataGrid中添加 控制参数 添加控制参数的名称,标签,是否多值(表示该控制参数从UI过来是一个值还是多个值),类 型。选择完成后, 注意: 对于多值的参数,类型现在只能选择字符串类型,选择了其它类型也不起作用。 点击下一步 弹出信息确认对话框。 在该对话框中如果你选择了只生成 DataSoruce复选框 ,则将只生成DataSource . 在信息确认界面,如果你确认前面的选择无误后, 选中保存DataCommand模型,可以在下面的文本框中指定DataCommand模型的名称,如 果不指定 则默认为 DataCommandName+ DataSurceName+ “” 点击完成。稍等片刻 ,代码生成完成。 如果你选择了代码生成完成后自动打开 本项目复选框 ,将自动打开该项目。 打开该解决方案,把ReportTest做为 启动项目,并在 ReprotTestbinDebug 下 找到 修改数据库连接串后,就可以直接运行了。 插入临时表定义 打开 查询报表开发工具 ,选择报表插入临时表定义,弹出插入临时表定义对话框 在该对话框中输入你要建表的Oql语句,然后点击分析按钮,在下面的DataGird中 就会出现 Oql语句中的 所有字段,在最后一列中选择该字段 的数据类型。在 临时表名文本框中输入你要创建的临 时表的名称。在插入 文件文本框中输入要插入哪个DataCommand 。最后点击插入 按钮 临时表定义的函数代码 块就会插入到 DataCommand的临时表定义区域。 注意: 插入结果临时表时 ,结果临时表的名称必须是 ResultTempTable ,在前面生成 DataCommand时 已经自动生成了结果临时表的定义 ,此时应该取相同的名称来替换以前的定义。 其它临时表无此约束。 Oql测试工具 在上面的对话框输入 Oql语句,点击Oql解析按钮,下面的对话框中就会显示出翻译后的 Sql语句。 点击执行Sql按钮来检查翻译后的 Sql是否能正确执行。 返回字段按钮是用来返回 翻译后的Sql中有多少个字段。 查看类信息 kxl/ClassView/ 获取参照信息 查询开发框架 概述 BE查询方式的执行过程 根据BE实体的元数据来生成默认的CaseModel 用户在查询方案画面中,调整条件、栏目、排序 使用BEQueryStrategyImpl将CaseModel转化成UIView 调用平台的UIView机制生成并执行OQL,将返回的结果放入UIView中,然后绑 定到UIGrid 上 DTO查询方式的执行过程 根据所设计的DTO的元数据来生成默认的CaseModel 用户在查询方案画面中,调整条件、栏目、排序 使用DTOQueryStrategyImpl获得CaseModel转化成QryCommonParaObj,并传入到 查询BP中执行 查询BP根据QryCommonParaObj来实现具体的查询逻辑,并将结果返回并填充 UIView中,然后绑定到UIGrid 上 BE方式与DTO方式的比较 复杂度 逻辑简单 BE方式 DTO方式 逻辑复杂(多次查询、临时表) CaseModel根据BE元数据来生成CaseModel 根据DTO元数据来生成CaseModel 的生成方式 OQL 平台负责生成OQL 自己拼写OQL 实体间的关一个主实体,多个子实体,能使多个实体,之间为弱引用关系,不能通过 系 用A.B.C的oql语法 A.B.C的oql语句来查询,需要自己拼接oql 语句。或通过临时表来做二次查询。或使用 DataTable处理 BE方式查询的设计与开发 1.设计期—UI端 与列表UI开发的不同点:选择“查询模板”(没有删除和新增按钮),根据WebPart关 联方式来选择如何拖UIView中的字段(参见WebPart关联部分) 命名规范:与列表开发类似,但要将其中的BList变成BQry,一定要注意这点 UI端代码—Ation部分 //数据加载的扩展 private void OnLoadData_Extend(object sender, UIActionEventArgs e) { } //数据收集的扩展 private void OnDataCollect_Extend(object sender, UIActionEventArgs e) { Collect_DefaultImpl(sender,e);//应保留这行代码,否则会出现双击表格某一行后, //Data_DefaultImpl(sender,e); //应去掉这行代码 光标又回到第一行,且子WebPart不变化的缺陷。 } public void QueryAdjust() { IUFDataGrid UIGrid = ontrolByName(elContainer, "DataGrid1") as IUFDataGrid; BEQueryStrategyImpl beQryStrategyImpl = new BEQueryStrategyImpl(tState, EntityFullName, QryModelID, ine, UIGrid,1); (); = aultOpath((bForm)(tPart)); //如果本Webpart是消费者,则需要处理传入的Webpart关联参数,可以参见下面的方式(这部分要根 据自己的情况编写): if (ters != null && > 0) { string sOPath = alOPath; foreach (IUIParameter paradata in ters) { if(lue!=null) sOPath = e(, ng()); } += " and " + sOPath;//将“查询方案中的条件”与“Webpart 关联的传入参数”合到一起 } //处理排序 y = erByOpath((BaseWebForm)(tPart)); //增加代码,调整UIView (); age(null); if ( == 0) { ndowStatus(ecordSucessInfo()); } else { ndowStatus(dSucessInfo()); } } public void InitCaseModel() { IUFDataGrid UIGrid = ontrolByName(elContainer, "DataGrid1") as IUFDataGrid; BEQueryStrategyImpl beQryStrategyImpl = new BEQueryStrategyImpl(tState, EntityFullName, QryModelID, ine, UIGrid,1); //增加代码,调整BE元数据加载方式 CaseModel caseModel = Model(); //增加代码,调整CaseModel eModelToSession((BaseWebForm)(tPart), caseModel); } UI端代码—WebPart部分 public void AfterOnLoad() { } public void AfterCreateChildControls() { ndView(id1, ); //该代码解决了,在消费者画面中“当双击主webpart表格中的行后,子webpart中表格数据不刷新” 的问题。 Mode = ; //iding = true;//如果在Webpart关联中,本WebPart是提供者,则需要加入这段话 //绑定BE方式的分页事件 tance().AttachMakePageEvent(, id1); } public void BeforeUIModelBinding() { if (InitCaseModel(id1)) { seModel(); } //与列表中的代码不同,需要删除原来的代码 if (Adjust(id1)) { djust(); } else { dWidthToCase(tState, FormID, id1); } } public void AfterUIModelBinding() { um("DDLCase", this, elID); //加入调整UIGrid的代码 } UI端代码—BE正拖模型方式下的Action部分 以往做列表时,都是倒拖,即在UIView中拖子,从子找到主。 还有一种是正拖方式,即从主找到子,即生成CaseModel时,要加载集合特性的子。这需 要在InitCaseModel添加代码,如下颜色标记: public void InitCaseModel() { ession((BaseWebForm)(tPart)); IUFDataGrid UIGrid = ontrolByName(elContainer, "DataGrid1") as IUFDataGrid; BEQueryStrategyImpl beQryStrategyImpl = new BEQueryStrategyImpl(tState, EntityFullName, QryModelID, ew, UIGrid, 2); CollectionAttrs = true; … … 采用正拖模型,转成oql语句执行后,得到的结果是一个主对应多个子的形式,如下: ID(主ID) 1 1 2 2 主表中的字段 … … … … 子ID 3001 3002 4001 5001 子表中的字段 … … … … 。。。 如果是这种样式的记录,在添充到中时,平台对于重复ID的记录,只取第 一条记录。如下: ID(主ID) 主表中的字段 子ID 子表中的字段 。。。 1 2 … … 3001 4001 … … 因此,如果想要展现第一种样式的数据,必须对ID字段做一些处理,即生成一个顺序号来 代替主ID字段。这需要在QueryAdjust中改变UIView中UIField,代码如下: public void QueryAdjust() { IUFDataGrid UIGrid = ontrolByName(elContainer, "DataGrid1") as IUFDataGrid; BEQueryStrategyImpl beQryStrategyImpl = new BEQueryStrategyImpl(tState, EntityFullName, QryModelID, lSupply, UIGrid, 2); (); = aultOpath((BaseWebForm)(tPart)); y = erByOpath((BaseWebForm)(tPart)); //将原来的“ID”变成“顺序号row_number”,注意大小写(oql中的关键字应该全是小写的) IUIField uiField = ["ID"]; uteName = "row_number() over(order by ID asc)"; if (["PID"] == null) { //新增一个PID来存放“主表ID”-----------------------↓ID的别名------------↓字段类型 -----------------------↓原字段名 IUIField fieldParentID = new UIField(ew, "PID", e("64"), true, "0", "PID", "ID", false, true, false, "", false); (fieldParentID); } ieldIndexes();//调整UIView中UIField结构后,必须重建其字段索引 ["PayrollSupply"].Clear(); age(null); if ( == 0) { ndowStatus(ecordSucessInfo()); } else { ndowStatus(dSucessInfo()); } } 该段代码的CC路径:odePayrollSupplyUI DTO方式查询的设计与开发 DTO方式查询分为五个环节:设计期(UI端、DTO、BP端),代码(UI、BP) 设计期—UI端 与列表UI开发的不同点:选择“查询模板”(没有删除和新增按钮),根据WebPart关 联方式来选择如何拖UIView中的字段(参见WebPart关联文档) 命名规范:与列表开发类似,但要将其中的BList变成BQry,一定要注意这点 设计期—DTO设计 在本方案中用DTO来定义查询的待选项集合,并且该DTO必须作为查询BP的返回值 (IList 数据类型限制 一般来说,DTO中的每一个属性就对应一个待选项,作为约定,其数据类型必须是原 生类型、强类型的实体Key类型、枚举类型。下图的System下的前面若干项是可选的。xml、 对象类型、空类型、实体key类型是不可选的。 所谓的强类型实体key的定义应如下图: 先选上一个实体,然后在实体key选项框中打上勾。 作为约定,强类型的实体Key属性不作为待选项,但可以作为条件及排序待选项,并且不 能展开下级。 查询DTO设计中的注意事项: 必须有ID字段 如果返回的记录中ID列有重复, Grid会中会只显示一行记录。对于这种情况, 可以将row_number()做为ID列。(可参考《查询列表常见问题及解决办法》中的 “正拖模型”部分) 属性的名称用于拼OQL时Seclect子句的别名,同时也会对应UIView的UIField 名称及Grid的列名。(理解这点很重要) 选择合理的字段类型 根据业务需求,设计合理的查询属性(条件待选、栏目待选、排序待选、默认栏目) 每次调整DTO后,要注意重新构造并执行相应的sql脚本(发布元数据) 设计期—BP设计 入口参数 所有查询BP的入口参数的类型都必须是查询公共部份提供的DTO(查询BP通用入参DTO)。 此DTO中包含有已选栏目、过滤、排序等信息,BP开发人员可根据这些参数,构造符合业 务的OQL语句。定义方式如下图: 返回值 所有查询BP都必须以描述待选项集合的DTO集合为BP的返回值 应用版型 为了让查询BP在构造时产生骨架代码,在BP设计器中要选中该BP,点右键,点菜单[应 用版型],在树中选上“查询BP版型”,如下图: 步骤一: 步骤二: 在版型树上选中[查询BP版型]。 BP端代码示例 在设计BP时,给BP加上版型[查询BP版型],在构造时便会生成查询BP的骨架代码, 查询BP的开发人员,只需要在适当的位置按业务逻辑写上相应的代码即可。骨架代码分为 两个Partial类。其中第一部份只有一个Do方法,在Do方法中BP实现者要调用第二部份 的私有方法DoProcess方法,并将BP的参数作为方法的参数。如下: internal partial class SOShiplineSumBQueryBPImpementStrategy : BaseStrategy { public SOShiplineSumBQueryBPImpementStrategy() { } public override object Do(object obj) { SOShiplineSumBQueryBP bpObj = (SOShiplineSumBQueryBP)obj; return DoProcess(arameter);//BP实现者要加上这句话 } } private object DoProcess(monParaObj bpParameter) { inateService ps = new inateService pParameter, isNeedTempTable()); if (essBusiness) { string oql = DoLogic(bpParameter); return taByPage(GetEntityFullName(), oqlBuildByTempTable(), oql); } else { return taByPage(); } } internal partial class SOLineSumBQueryBPImpementStrategy { //主实体FullName private string GetEntityFullName() { return ""; } /// /// 分页内部是否需要使用临时表机制,对于数据量比较小的查询,没有必要采用临时表 /// 缓存第一次查询的结果,每次重查就行了,否则第一次查询时页面加载会慢些。由BP /// 开发人员自己判断。 /// /// private bool isNeedTempTable() { return true; }//end isTempTable /// /// 是否基于临时表构造的OQL,对于基于临时表的查询,分页服务内部不需要多语的处理; /// 基于业务表的查询,则需要。此处由BP开发人员根据实际情况返回正确的值。 /// /// private bool oqlBuildByTempTable() { return false; }//end isNeedMultiLang /// /// 执行业务逻辑,返回OQL串,由BP开发人员添加代码。 /// 参数bpParameter中带有已选栏目、过滤及排序信息 /// /// private string DoLogic(monParaObj bpParameter) { } //根据业务逻辑,返回OQL串 代码的第二部份中DoProcess方法,由前面的partial类中的Do方法调用。不需要BP开发 人员作任何处理。 需要BP开发人员作处理的是以下几个方法: 方法名称 GetEntityFullName isNeedTempTable 用途 主实体FullName,对于基于临时表的OQL则为临时表表名。 分页内部是否需要使用临时表机制,对于数据量比较小的查询,没有必要采用临时 表缓存第一次查询的结果,每次重查就行了,否则第一次查询时页面加载会慢些。 由BP开发人员自己判断。 oqlBuildByTempTable 是否基于临时表构造的OQL,对于基于临时表的查询,分页服务内部不需要多语的处 理;基于业务表的查询,则需要。此处由BP开发人员根据实际情况返回正确的值。 DoLogic 执行业务逻辑,返回OQL串,由BP开发人员添加代码。 参数bpParameter中带有已选栏目、过滤及排序信息。 辅助工具 如果所设计的查询DTO中的属性来源于多个实体,字段多,实体间关系复杂,则可以 使用SimpleOqlTool来拼接OQL语句。SimpleOqlTool的使用方法与报表DataCommand中 的DS设计相同。这里可以借用报表开发工具中的DataCommand代码生成工具,便捷的处 理DTO属性名称和实体字段的对应关系。比如,由辅助工具生成的代码片断如下: /// /// /// /// /// 销售订单计划行.交期 DateTime public readonly static string SOShipline_RequireDate = "SOShipline_RequireDate"; /// 销售订单计划行.数量2 Decimal public readonly static string SOShipline_ShipPlanQtyTBU = "SOShipline_ShipPlanQtyTBU"; // 销售订单计划行.交期 DateTime (SOShipline_RequireDate, "eDate"); // 销售订单计划行.数量2 Decimal (SOShipline_ShipPlanQtyTBU, "anQtyTBU"); 其中, SOShipline_RequireDate和SOShipline_ShipPlanQtyTBU就是我们在DTO定义的属性名称 eDate与anQtyTBU就是实体的字段 那么,最后通过工具拼接成OQL语句会是这样的: Select eDate as SOShipline_RequireDate, anQtyTBU as SOShipline_ShipPlanQtyTBU,… from UFIDA::U9::SM::SO::SOShipline as SOShipline 这样就建立起了DTO属性名称与实体字段的对应关系,并且通过这个辅助工具生成代 码,能极小减轻我们的工作量。再次强调,DTO设计期的字段名称要与辅助工具中定义的 别名一致。 在UBF中打开一个报表,然后选择“报表—DataCommand工具集 —DataCommand代码生成” 弹出“解决方案对话框” 1. 服务组名称:由于我们只是借用这个报表工具生成代码,所以服务组名可以随意选一个。 2 生成路径:生成的报表项目的存放路径。 3 DataCommand模型:对于查询开发,不需要选择该项 点击“下一步”弹出 选择字段信息对话框 点击“选择字段”按钮 ,弹出 选择实体信息对话框。 在实体名称中输入要查询的实体,点击“查询按钮”,列表中出现你选择的实 体信息。 在DataGrid中双击你要使用的实体,在下面的属性DataGrid中,就会列出该实体的全部属性。 在实体名称中,输入所需的,如Person,则会将与实体名称中包含Person的都列出来。 然后双击一个指定的实体,则会显示出该实体的全部字段。 这里面关键的一点是:要仔细写出各个字段的别名,这个别名要与DTO设计中的字段名一 致。(这点一定要注意) 如下图:
2024年7月14日发(作者:闳卓)
(GetScriptWithSetCtrlEnabled(lblIsTax, true)); //标签启用
//计入工资总额
(GetScriptWithSetCtrlEnabled(cbIsTotalPay, true)); //启用
(GetScriptWithSetCtrlEnabled(lblIsTotalPay, true)); //标签启用
//按日计算
(GetScriptWithSetCtrlEnabled(cbIsCalcByDay, false)); //不启用
(GetScriptWithSetCtrlValue(cbIsCalcByDay, false)); //不选中
(GetScriptWithSetCtrlEnabled(lblIsCalcByDay, false)); //标签不启用
//日工资计算项
(GetScriptWithSetCtrlEnabled(cbIsDailyPay, false)); //不启用
(GetScriptWithSetCtrlValue(cbIsDailyPay, false)); //不选中
(GetScriptWithSetCtrlEnabled(lblIsDailyPay, false)); //标签不启用
(" } ");
ion = ng();
(codeBlock);
#endregion
CreateAssCtrl(tribute131, "onchange", codeBlocks);
CreateAssCtrl(tribute131, "onchange", new CodeBlock());
}
public void AfterCreateChildControls()
{
RegisterClientScript();
}
以上是服务器端部分的代码,在Runtime,会在客户端生成以下脚本,从而实现客户端
控件之间的关联。以下给出了基于上述服务器端代码相应生成的客户端脚本。
function AssCtrl$FixupEventHandler()
{
tryAttachCtrlEvent('u_M_P47_ItemAttribute131','onchange',
handleru$M$P47$ItemAttribute131$ctl01);
……
}
if(Sys && ms)
{
tance().add_pageLoaded(function(){eo
ut(AssCtrl$FixupEventHandler, 0)});
}
else
{
eout(AssCtrl$FixupEventHandler, 0);
}
开发人员无需过多关注,客户端生成脚本,这是由UI代码框架生成的,而应该将主要
精力放在服务器端代码怎样定义关联控件和关联事件处理函数上(即CodeBlock代码)。如
果开发人员需要在运行时调试或单步跟踪的时候,可以通过断点(debugger)进行相关脚本
调试。
以上都是在客户端满足某种条件下,触发客户端关联。
页面加载后直接触发关联
某些情况下,页面加载后,无需出发条件,需要直接触发某些事件。下面的例子中,就
应用了这种触发方法。
public void AfterUIModelBinding()
{
InitDropDownList();
}
///
/// 初始化下拉框
///
private void InitDropDownList()
{
int dataType = pe;
//项目类型控件
UFWebClientDropDownListAdapter ddlItemType = new
UFWebClientDropDownListAdapter(ItemType107);
//项目属性控件
UFWebClientDropDownListAdapter ddlItemAttr = new
UFWebClientDropDownListAdapter(tribute131);
AssociationControl ass = new AssociationControl();
//数据类型为字符,项目类型显示‘档案项目’、‘手工录入’,增减属性显示‘其他项’
if (dataType == 0)
{
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemType, false, new int[] { 0,
1, 2 }));
(GetScriptWithAddRemoveItem(ddlItemType, true, new int[] { 0,
2 }));
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemAttr, false, new int[] { 0,
1, 2 }));
//(GetScriptWithAddRemoveItem(ddlItemAttr, true, new int[]
{ 2 }));
string a1 = "if($find('" + ID + "').get_Value()=="1"
|| $find('" + ID + "').get_Value()=="2")$find('" +
ID + "').ResetItem(false,'0,1,2');else $find('" +
ID + "').ResetItem(false,'2');";
(a1);
}
//数据类型为整型或小数,项目类型显示‘档案项目’、‘手工录入’、‘计算项目’,增
减属性显示‘增项’、‘减项’、‘其他项’
else if (dataType == 1 || dataType == 2)
{
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemType, false, new int[] { 0,
1, 2 }));
(GetScriptWithAddRemoveItem(ddlItemType, true, new int[] { 0,
1, 2 }));
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemAttr, false, new int[] { 0,
1, 2 }));
(GetScriptWithAddRemoveItem(ddlItemAttr, true, new int[] { 0,
1, 2 }));
}
//数据类型为日期、布尔,项目类型显示‘手工录入’,增减属性显示‘其他项’
else
{
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemType, false, new int[] { 0,
1, 2 }));
(GetScriptWithAddRemoveItem(ddlItemType, true, new int[]
{ 2 }));
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemAttr, false, new int[] { 0,
1, 2 }));
(GetScriptWithAddRemoveItem(ddlItemAttr, true, new int[]
{ 2 }));
}
}
以上实例中,就是实现了在页面加载后,对一个DropDownList控件直接初始化数据源。
总的来说,这种方式下:
先声明一个关联控件。
再指定该关联控件的源服务器控件。
然后给关联控件的
InitPara
的添加参数。这里的参数事件是一些可以执行的客户端脚本字符
串。
需要注意到是,这里并没有指定触发关联的事件名。因为这是在页面加载后,直接触发
的,所以无需制定事件名。
其关键代码如下:
ass = new AssociationControl();
ServerControl = pe162;
(GetScriptWithAddRemoveItem(ddlItemAttr, false, new int[] { 0,
1, 2 }));
string a1 = "if($find('" + ID + "').get_Value()=="1"
|| $find('" + ID + "').get_Value()=="2")$find('" +
ID + "').ResetItem(false,'0,1,2');else $find('" +
ID + "').ResetItem(false,'2');";
(a1);
其他实例:
//
AssociationControl assoC = new AssociationControl(); //关联控件实例
ServerControl = grame243; //源控件
ame = "onchange"; //触发事件
//一个CodeBock 就是一个if代码快
CodeBlock codeBlock_2 = new CodeBlock();
//
expression = " if( ";
expression +=
ClientControl(grame243).ClientInstance;
expression += ".Value";
expression += " == ";
expression += "0";
expression += " )";
codeBlock_ion = expression;
//代码块的目标控件组
codeBlock_trol(er299).ReadOnly = "false";
codeBlock_trol(ssDate659).ReadOnly = "false";
//
ck(codeBlock_2);
关联控件使用注意:
1 关联控件的触发控件限定
以下控件不能用:
向导控件,向导页控件,页签控件,分页控件,分组框,卡片控件,容器;
建议,最好使用大控件和按钮控件作为触发控件;
另外对于没有限定的控件,可用的控件事件可能不一样。
2 关联控件的触发表达式控件限定在:
下拉列表框,文本框,复选框,以后看需求,可以扩展。
下拉列表框的值类型选String;
复选框选的值类型bool
置空,类型选decimal,值为null
3 关联控件的响应控件限定在:
没有限定控件类型,都支持是否可用状态,不过CheckBox支持选中和非选中状态。
4 使能关联控件没有起到控制效果,一个checkbox,当点击时,如果其值为true,
则将另两个checkbox置为Disable,
结果是点击之后置灰了一会最后又变为可编辑了。
这是由于PostBack造成的,解决方案是都到后台了,那可以直接控制控件的状
态。
5 跑使能控件的时候,弹出错误:“falsedocument”未定义
定义多条触发表达式时需要用逻辑运算符(|| && )进行连接;
6 现在使能控件的问题不是使能控件本身,而是需要被使能的控件提供一些属性、方
法、事件供使能控件使用,
控件的Value属性,控件的Visiable属性,控件Enabled属性
Base控件适配器
UFWebClientBaseAdapter
是其他控件适配器的基类。可以用来引用其他类型的适配器。
功能
当前控件的实例。
使用Control属性来获取当前控件的实例。
获取当前服务器端件的客户端实例
使用ClientInstance属性当前控件的客户端实例。
获取控件的客户端ID
ControlID属性来获取控件的客户端ID。
获取或设置控件的事件名
EventName属性用来或者设置事件名称。
获取或设置控件的Value
使用控件的Key属性,即可实现此功能。
获取或设置控件的Value
使用控件的Value属性和ControlValue属性,即可实现此功能。
获取或设置控件的Text
使用控件的Text属性即可实现此功能。
获取或设置控件是否只读
访问控件的ReadOnly属性,可以获取控件是否为只读。
如果要设置控件是否为只读,则使用ReadOnly和ClientInstanceWithReadonly属性,
ClientInstanceWithReadonly属性会根据ReadOnly属性的值产生客户端脚本代码,调用客户
端的
set_ ReadOnly()
方法,来设置控件是否只读。
ReadOnlyValue属性和ReadOnly属性实现一样的功能。
ClientInstanceWithReadonlyValue属性和ClientInstanceWithReadonly属性实现一样的功
能。
获取或设置控件是否可编辑
访问控件的Enabled属性,可以获取控件是否为只读。
如果要设置控件是否为只读,则使用Enabled和ClientInstanceWithEnable属性,
ClientInstanceWithEnable属性会根据Enabled属性的值产生客户端脚本代码,调用客户端的
set_Enabled ()
方法,来设置控件是否只读。
EnabledValue属性和Enabled属性实现一样的功能。
ClientInstanceWithEnabledValue属性和ClientInstanceWithEnable属性实现一样的功能。
实例
UFWebClientBaseAdapter是其他控件适配器的基类,所以下面的实例中,ankAccountCombin78
和ettlementMethod205控件是TextBox控件,但是仍然作为UFWebClientBaseAdapter类的入口
参数,来创建了UFWebClientBaseAdapter的实例。
实例1
(new UFWebClientBaseAdapter(ankAccountCombin78).ClientInstance
+ ".set_Value('" + strBankAccountCombin + "');");
(new
UFWebClientBaseAdapter(ettlementMethod205).ClientInstance + ".set_Value('" +
strSettlementMethod_Name + "');");
return args;
数字控件适配器
如果需要访问数字控件,则在UI编程开发中应使用数字控件适配器,通过编写服务器
端代码,通过关联控件的框架生成相应的客户端脚本,来实现对数字控件的客户端关联操作。
功能
数字控件适配器(UFWebClientNumberAdapter)提供的主要功能有以下这些。
设置精度Scale
设置数字控件的精度,为
ClientInstanceWithScale
提供数字控件的精度
。
ClientInstanceWithScale属性会根据输入参数Scale,产生客户端脚本代码,调用客户端的
set_Scale()
方法,来设置数字控件的精度。
设置舍入值RoundValue
设置数字控件的舍入值,为
ClientInstanceWithRoundValue
提供数字控件的舍入值
。
根据
输入参数RoundValue,数字控件适配器的ClientInstanceWithRoundValue属性会产生客户
端脚本代码,调用客户端的
set_RoundValue()
方法,来设置数字控件的舍入值。
设置舍入类型NumberRoundType
设置数字控件的舍入类型,为
ClientInstanceWithNumberRoundType
提供数字控件的舍入类型
。
ClientInstanceWithNumberRoundType属性会根据输入参数NumberRoundType,产生客户
端脚本代码,调用客户端的
set_RoundType()
方法,来设置数字控件的舍入类型。
货币符号CurrencySymbol
设置数字控件的货币符号,为
ClientInstanceWithCurrencySymbol
提供数字控件的货币符号
。
ClientInstanceWithCurrencySymbol属性会根据输入参数CurrencySymbol,产生客户端脚
本代码,调用客户端的
set_CurrencySymbol()
方法,来设置数字控件的货币符号。
数字格式FormatString
设置数字控件的显示格式,为
ClientInstanceWithFormatString
提供数字控件的显示格式
。
通过对数字控件适配器的ClientInstance相关属性,可以调用控件的客户端js方法。
ClientInstanceWithFormatString属性会根据输入参数FormatString,产生客户端脚本代码,
调用客户端的
set_FormatString()
方法,来设置数字控件的显示格式。
实例
下面举一个使用数字控件适配器(UFWebClientNumberAdapter)的实例。
private void BankBACFCExTypeChangeMoney_1(CustomerActionEventArgs args, string Rate,
string RCBankBACRate)
{
if (().Length == 0)
Rate = "1";
decimal Money_FCMoney =
(decimal)lHead__OCMoney *
(RCBankBACRate) * (Rate);
decimal SettlementFee_FCMoney =
(decimal)lHead_mentFee_OCMoney *
(RCBankBACRate) * (Rate);
UFWebClientNumberAdapter num_Money_FCMoney = new
UFWebClientNumberAdapter(RecACCMoney_FCMoney0);
num_Money_ = Money_ng();
(num_Money_InstanceWithValue);
UFWebClientNumberAdapter num_RCToFCExRate = new
UFWebClientNumberAdapter(RCToFCExRate1);
num_ = ng();
(num_InstanceWithScale);
num_ = Rate;
(num_InstanceWithValue);
}
//收款币种对本币汇率类型
object assoC_DoRCToFCERTypeAction(CustomerActionEventArgs args)
{ BankBACFCExTypeChangeMoney_1(args, Rate, RCToRecBACExRate);
return args;
}
//收款币种对本币汇率类型
private void RCToFCERTypeChange()
{
AssociationControl assoC_5 = new AssociationControl();
assoC_ServerControl = ERType1;
assoC_ame = "onchange";
ClientCallBackFrm cF = new ClientCallBackFrm();
omerAction += new
Customer(assoC_DoRCToFCERTypeAction);
(ERType1);
(cBACExRate0);
(0);
(e271);
(assoC_5);
}
再举一个实例。
下面的例子中
assoC_DoRecBatchAction
是一个CallBack事件处理函数。
object assoC_DoRecBatchAction(CustomerActionEventArgs args)
{
string RC = sh[ch_ID].ToString();
//没有控制币种,恢复原来币符
if ( == 0 || RC == "-1" || RC == "0")
{
string oldRC = sh[ID].ToString();
ntityUIModelModel queryentityModel = new
ntityUIModelModel();
= " ID=" + oldRC;
();
(cy);
if ( > 0)
{
UFWebClientNumberAdapter num_Precision = new
UFWebClientNumberAdapter(RC_MoneyRound_Precision77);
num_ =
ound_ng();
(num_InstanceWithValue);
UFWebClientNumberAdapter num_RoundType = new
UFWebClientNumberAdapter(RC_MoneyRound_RoundType111);
num_ =
ound_ng();
(num_InstanceWithValue);
UFWebClientNumberAdapter num_RoundValue = new
UFWebClientNumberAdapter(RC_MoneyRound_RoundValue237);
num_ =
ound_ng();
(num_InstanceWithValue);
UFWebClientTextBoxAdapter txt_Symbol = new
UFWebClientTextBoxAdapter(RC_Symbol130);
txt_ = ;
(txt_InstanceWithValue);
}
}
return args;
}
下拉列表控件适配器
如果需要访问下拉列表控件,则在UI编程开发中应使用下拉列表控件适配器,通过编
写服务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现对下拉列表控件的客
户端关联操作。
主要功能
动态隐藏显示枚举项
使用下面这些相关属性可以实现该功能。
OptionOperHidden :控制Item是否隐藏,true为隐藏,false为显示。
OptionsOper:要控制的数据源Item的index集合。
ClientInstanceWithAddRemoveItem:根据OptionsOper和OptionOperHidden来隐藏或显示
DropDowmList的数据源,该属性生成客户端脚本代码。重置DropDownList的Item,调用
客户端的set_IsReloadItems(true)和AddRemoveItem()方法,从现有数据源中添加或删除Item。
ClientInstanceWithResetItem:根据OptionsOper和OptionOperHidden来隐藏或显示
DropDowmList的数据源,该属性生成客户端脚本代码。重置DropDownList的Item,调用
客户端的set_IsReloadItems(true) 和ResetItem()方法,重置DropDownList的数据源。
设置下来列表控件的被中的枚举值
通过使用SelectedValue属性设置DropDowmList控件的被选中的Item的value。
ClientInstanceWithSelectedValue属性会根据SelectedValue属性,生成一段客户端脚本代
码,用来设置DropDowmList控件中Item的value为SelectedValue被选中。
使用SelectedIndex属性可以设置DropDowmList控件的被选中的Item的Index。供
ClientInstanceWithSelectedIndex使用。根据指定SelectedIndex属性,通过
ClientInstanceWithSelectedIndex属性会生成一段客户端脚本代码,用来设置
DropDowmList控件中Item的index为SelectedIndex的Item被选中。
事件
通过以下事件可以使用。
Onchange
SelectedIndexChanged
OnValueChanged
实例
IUFClientAssoComponent dd =
ClientControl(ServerControl);
实例:
//设置DropDownList条目的隐藏/显示
((IUFClientAssoDropDownList)dd).OptionOperHidden = true; //false时添加
option,true时移除option
((IUFClientAssoDropDownList)dd).OptionsOper = new int[] { 0, 3 };
//
((IUFClientAssoDropDownList)dd).Value=2;
//
((IUFClientAssoDropDownList)dd).ReadOnly=”true”;
//
((IUFClientAssoDropDownList)dd).Reset();
//可扩展枚举实现
添加新Item
m(string strKey,string strValue)
例子1:
dd.
AddItem(“FieldName”,
“txtName”
);
例子2:
从引用Form上取返回数据添加到Item上
AssociationControl assoC_1 = new AssociationControl();
assoC_ServerControl = 2;
assoC_ame = "ContentChanged";
CodeBlock codeBlock_1 = new CodeBlock();
UFWebClientDropDownListAdapter dd=new
UFWebClientDropDownListAdapter(geRateType167);
UFWebClientLabelAdapter label = new UFWebClientLabelAdapter(2);
rItem = true;
urce=InstanceWithAllData("Code","Name");
codeBlock_trol(dd);
assoC_ck(codeBlock_1);
(assoC_1);
下面举SOB中的例子,可以看到如何在运行时动态隐藏或显示DropDowmList控件中的Item
项。
public void AfterUIModelBinding()
{
//依据组织初始值设置账簿类型的初始值
SetSOBTypeByOrgFunction(true);
//设置组织职能变化后账簿类型的值(带change事件)
SetSOBTypeByOrgFunction(false);
}
private void SetSOBTypeByOrgFunction(bool isInit)
{
SetofBooksRecord record = dRecord;
bool isAdded = (cordState == );
//如果有错误信息,说明是保存按钮提交失败,需要保存SOBType的信息
if (essage != null && orMessage)
{
isAdded = false;
}
UFWebClientDropDownListAdapter sobType = new
UFWebClientDropDownListAdapter(e);
UFWebClientDropDownListAdapter orgFunction = new
UFWebClientDropDownListAdapter(ction187);
AssociationControl assControl;
assControl = new AssociationControl();
ServerControl = ction187;
if (!isInit)
{
ame = "onchange";
}
//显示0 1 2
CodeBlock codeBlock;
string expression;
codeBlock = new CodeBlock();
expression = "if( " + ;
expression += " == '0' )";
ion = expression;
//将去掉的选项加回来
OperHidden = false;
sOper = new int[] { 0, 1, 2 };
if (e != 3)
{
edValue = ng();
}
else
{
edValue = "0";
}
();
if (isInit)
{
(expression + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType);
ck(codeBlock);
//隐藏3
UFWebClientDropDownListAdapter sobType11 = new
UFWebClientDropDownListAdapter(e);
CodeBlock codeBlock11;
string expression11;
codeBlock11 = new CodeBlock();
expression11 = "if( " + ;
expression11 += " == '0' )";
ion = expression11;
OperHidden = true;
sOper = new int[] { 3 };
if (e != 3)
{
edValue = ng();
}
else
{
edValue = "0";
}
();
if (isInit)
{
(expression11 + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType11);
ck(codeBlock11);
//隐藏0 1 2
UFWebClientDropDownListAdapter sobType2 = new
UFWebClientDropDownListAdapter(e);
CodeBlock codeBlock2;
string expression2;
codeBlock2 = new CodeBlock();
expression2 = "if( " + ;
expression2 += " != '0' )";
ion = expression2;
//将多余的选项去掉
OperHidden = true;
sOper = new int[] { 0, 1, 2 };
//edValue = ng();
edValue = "3";
();
if (isInit)
{
(expression2 + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType2);
ck(codeBlock2);
UFWebClientDropDownListAdapter sobType22 = new
UFWebClientDropDownListAdapter(e);
CodeBlock codeBlock22;
string expression22;
codeBlock22 = new CodeBlock();
expression22 = "if( " + ;
expression22 += " != '0' )";
ion = expression22;
//显示3
OperHidden = false;
sOper = new int[] { 3 };
//edValue = ng();
edValue = "3";
();
if (isInit)
{
(expression22 + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType22);
ck(codeBlock22);
}
private void SetSOBTypeByOrgFunction(bool isInit)
{
SetofBooksRecord record = dRecord;
bool isAdded = (cordState == );
//如果有错误信息,说明是保存按钮提交失败,需要保存SOBType的信息
if (essage != null && orMessage)
{
isAdded = false;
}
UFWebClientDropDownListAdapter sobType = new
UFWebClientDropDownListAdapter(e);
UFWebClientDropDownListAdapter orgFunction = new
UFWebClientDropDownListAdapter(ction187);
AssociationControl assControl;
assControl = new AssociationControl();
ServerControl = ction187;
if (!isInit)
{
ame = "onchange";
}
//显示0 1 2
CodeBlock codeBlock;
string expression;
codeBlock = new CodeBlock();
expression = "if( " + ;
expression += " == '0' )";
ion = expression;
//将去掉的选项加回来
OperHidden = false;
sOper = new int[] { 0, 1, 2 };
if (e != 3)
{
edValue = ng();
}
else
{
edValue = "0";
}
();
if (isInit)
{
(expression + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType);
ck(codeBlock);
//隐藏3
UFWebClientDropDownListAdapter sobType11 = new
UFWebClientDropDownListAdapter(e);
CodeBlock codeBlock11;
string expression11;
codeBlock11 = new CodeBlock();
expression11 = "if( " + ;
expression11 += " == '0' )";
ion = expression11;
OperHidden = true;
sOper = new int[] { 3 };
if (e != 3)
{
edValue = ng();
}
else
{
edValue = "0";
}
();
if (isInit)
{
(expression11 + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType11);
ck(codeBlock11);
//隐藏0 1 2
UFWebClientDropDownListAdapter sobType2 = new
UFWebClientDropDownListAdapter(e);
CodeBlock codeBlock2;
string expression2;
codeBlock2 = new CodeBlock();
expression2 = "if( " + ;
expression2 += " != '0' )";
ion = expression2;
//将多余的选项去掉
OperHidden = true;
sOper = new int[] { 0, 1, 2 };
//edValue = ng();
edValue = "3";
();
if (isInit)
{
(expression2 + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType2);
ck(codeBlock2);
UFWebClientDropDownListAdapter sobType22 = new
UFWebClientDropDownListAdapter(e);
CodeBlock codeBlock22;
string expression22;
codeBlock22 = new CodeBlock();
expression22 = "if( " + ;
expression22 += " != '0' )";
ion = expression22;
//显示3
OperHidden = false;
sOper = new int[] { 3 };
//edValue = ng();
edValue = "3";
();
if (isInit)
{
(expression22 + "{" +
InstanceWithAddRemoveItem
+ InstanceWithSelectedValue + "}");
}
trol(sobType22);
ck(codeBlock22);
}
日期控件适配器
如果需要访问日期控件,则在UI编程开发中应使用日期控件适配器,通过编写服务器
端代码,通过关联控件的框架生成相应的客户端脚本,来实现对日期控件的客户端关联操作。
功能
获取或设置日期控件的Value
如果是设置日期控件的值,则使用ClientInstanceWithValue属性,该属性根据Value或
ControlValue,产生客户端脚本代码,调用客户端的
set_Value()
方法,来设置日期控件的
Value。
获取日期控件的Text
使用ValueText属性可以获取日期控件的Text,产生客户端脚本代码,调用客户端的
get_Text()
方法,来设置。
设置日期控件是否可用
使用Enabled属性可以设置日期控件是否可用。
EnumClientAssoControlEnable
类型,可以获取或设置控件是否可用。两个枚举值为
False或True。
事件
以下事件可以使用:
Onchange
OnValueChanged
实例
以下实例设置通过
UFWebClientDatePickerAdapter
设置了日期控件的Value。
private object IsSelectChangeCallBackFrm_DoCustomerAction(CustomerActionEventArgs args)
{
UFWebClientDatePickerAdapter startDate = new
UFWebClientDatePickerAdapter(iodStartDate260);
= arrStartDate[0].ToShortDateString();
UFWebClientDatePickerAdapter endDate = new
UFWebClientDatePickerAdapter(iodEndDate194);
= arrEndDate[ - 1].ToShortDateString();
(InstanceWithValue);
(InstanceWithValue);
return args;
}
参照控件适配器
如果需要访问参照控件,则在UI编程开发中应使用参照控件适配器,通过编写服务器
端代码,通过关联控件的框架生成相应的客户端脚本,来实现对参照控件的客户端关联操作。
功能
获取参照的值
获取参照控件的Code,通过访问ValueCode属性实现。
获取参照空间的Name,通过访问ValueName属性实现。
获取参照控件的Key,通过访问ValuePK属性实现。
参照控件赋值
ClientInstanceWithValue根据PKValue 、CodeValue和NameValue三个属性,来对参照
控件赋值。
设置参照控件的Key
其对应的属性为PKValuel,ClientInstanceWithPK会根据PKValue的值对参照控件的Key
进行赋值操作。
设置参照控件的Code
其对应属性为CodeValue。ClientInstanceWithCode根据CodeValue,产生客户端脚本代
码,调用客户端的set_Text()方法,来设置参照控件的Name。
设置参照控件的Name
其对应属性为NameValue。ClientInstanceWithName根据NameValue,产生客户端脚本
代码,调用客户端的set_Text()方法,来设置参照控件的Name。
设置参照控件是否弹出参照Form
其对应属性为IsShowForm和ClientInstanceWithIsShowForm。设置IsShowForm后,调
用ClientInstanceWithIsShowForm属性产生客户端脚本,通用客户端中的
set_IsShowForm(),来实现此功能。
指定参照控件是否做PostBack
其对应属性为AutoPostBack。通过ClientInstanceWithAutoPostBack属性产生客户端脚
本,通用客户端中的set_AutoPostBack()方法。
获取或设置参照类型
对应属性为RefType。如果设置参照类型,则通过使用ClientInstanceWithRefType属性
根据RefType的值,产生客户端脚本代码,调用客户端的set_RefType()方法,来设置参照控
件的RefType。
添加参照的参数
通过AddParam方法实现。调用ClientInstanceWithAddPara属性可以实现在客户段添
加参照控件的参数功能。
实例代码
public void AfterCreateChildControls()
{
SetCustLabelPartID();
SetCustMiscInfo();
}
private void SetCustMiscInfo()
{
//客户lable
ScriptBlockBuilder scriptBuilder1 = new ScriptBlockBuilder();
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("Code",
{0}._Value());}}", "Cust_Customer0", "ClientID"));
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("Name",
{0}._Text());}}", "Cust_Customer0", "ClientID"));
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("IsMisc",
{0}._Value());}}", "Cust_Customer_IsMISC114", "ClientID"));
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("MiscID",
{0}._Key());}}", "Cust_Customer0", "ClientID"));
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("CustSiteCode",
{0}._Value());}}", "CustSite_CustomerSite1", "ClientID"));
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("CustSiteName",
{0}._Text());}}", "CustSite_CustomerSite1", "ClientID"));
(new UFScriptDescriptor("if($get("{0}")){{",
"Label3086", "ClientID"));
(new UFScriptDescriptor("{0}.control", "Label3086",
"ClientID"));
(new UFScriptDescriptor(".AddParam("CustSiteID",
{0}._Key());}}", "CustSite_CustomerSite1", "ClientID"));
if ( > 0)
{
ontrol = (l)3086;
ame = "BeforeLoadData";
//(scriptBuilder1);
}
if ( > 0)
{
ontrol = (l)3092;
ame = "BeforeLoadData";
//(scriptBuilder1);
}
}
设置参照控件的参数
通过setCustomerParam方法向参照控件添加参数,调用
ClientInstanceWithResetCustomerParam属性实现。
清除参照控件的自定义参数,通过ClientInstanceWithRemoveCustomerParam属性实现。
事件
以下事件可以使用
通过选择参照,发生值改变的时候,触发的事件为Onchange事件。
通过代码给参照赋值,参照的值发生改变的时候,触发的事件为OnValueChange事件。
实例
实例1
AssociationControl assoC_reserve = new AssociationControl();
//assoC_CallBack = true;
assoC_ServerControl = eDate170;
assoC_ame = "onchange"; //
ClientCallBackFrm cF2 = new ClientCallBackFrm();
omerAction += new
Customer(assoC_DoReserveDateAction);
(202);
(eDate170);
(ePeriodNumber53);
(alPostPeriod128);
(assoC_reserve);
Object assoC_DoReserveDateAction(CustomerActionEventArgs args)
{
//制单日期变化,得到该日期的对应期间的顺序号
string sobid = sh[ID].ToString();
if ( > 0 &&
sh[ID].ToString().Trim().Length > 0)
{
try
{
DateTime createDate =
(GetDateTimeString(sh[ID].ToString()));
SOBAccountingPeriodData getPeriod =
AccountPeriodUI((sobid), createDate);
//赋值制单期间的顺序号
(new
UFWebClientBaseAdapter(ePeriodNumber53).ClientInstance + ".set_Value('" +
ng() +"')");
//赋值记账期间
UFWebClientRefControlAdapter ref1 = new
UFWebClientRefControlAdapter(alPostPeriod128);
e = ng();
lue = ng();
lue = ng();
(InstanceWithValue);
}
catch (Exception ex)
{
(new
UFWebClientBaseAdapter(ePeriodNumber53).ClientInstance + ".set_Value('1')");
}
}
return args;
}
实例2
///
/// 物料参照设置
///
private void GridItemRef_DoBeforeCallback()
{
AssociationControl assoCGrid = new AssociationControl();
ServerControl = id11;
ame = "OnCellFocusEnter";
((UFWebClientGridAdapter)Control).("ItemInfo_ItemID");
ClientCallBackFrm callBackFrm = new ClientCallBackFrm();
omerAction += new
Customer(assoCGrid_DoBeforeItemAction);
(id11);
(assoCGrid);
(callBackFrm);
}
///
/// 物料参照设置
///
///
///
Object assoCGrid_DoBeforeItemAction(CustomerActionEventArgs args)
{
//接收到存储地点ID
ArrayList list =
(ArrayList)sh[_GRIDDATA_SelectedRows];
if ( <= 0) {
return args;
}
int curIndex = (list[0].ToString());
Hashtable hashT =
(Hashtable)((ArrayList)sh[ID])[curIndex];
object oWhID = hashT["Wh"];
String strWhere = getItemCustomerFilter(oWhID);
//
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id11);
olumnEditorAttribute("ItemInfo_ItemID",
utes_AddParam, new string[] { "UBF_AddCustomerFilter",
strWhere });
//
//test 控制最大最小值
olumnEditorAttribute("SUQty",
utes_MinValue, "111");
olumnEditorAttribute("SUQty",
utes_MaxValue, "888");
//返回
(InstanceWithRefAddParam);
(InstanceWithMaxValue);
(InstanceWithMinValue);
return args;
}
实例3
///
/// 存储地点参照
///
private void GridWh_DoBeforeCallback()
{
AssociationControl assoCGrid = new AssociationControl();
ServerControl = id11;
ame = "OnBeforeCellFocusEnter";
((UFWebClientGridAdapter)Control).("Wh");
ClientCallBackFrm callBackFrm = new ClientCallBackFrm();
omerAction += new
Customer(assoCGrid_DoBeforeWhAction);
(id11);
(assoCGrid);
(callBackFrm);
}
///
/// 存储地点参照
///
Object assoCGrid_DoBeforeWhAction(CustomerActionEventArgs args)
{
//接收到料品ID、单据日期
ArrayList list =
(ArrayList)sh[_GRIDDATA_SelectedRows];
int curIndex = (list[0].ToString());
Hashtable hashT =
(Hashtable)((ArrayList)sh[ID])[curIndex];
object oItemID = hashT["ItemInfo_ItemID"];
object oHeadDate = hashT["HeadDate"];
StringBuilder strB = new StringBuilder();
//1、库存异动-存储地点约束及消耗关系
(" IsStage = 0 ");
//设置存储地点的参照条件
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id11);
olumnEditorAttribute("Wh",
utes_AddParam, new string[] { "UBF_AddCustomerFilter",
ng() });
(InstanceWithRefAddParam);
return args;
}
文本控件适配器
如果需要访问文本控件,则在UI编程开发中应使用文本控件适配器,通过编写服务器
端代码,通过关联控件的框架生成相应的客户端脚本,来实现对文本控件的客户端关联操作。
功能
获取或设置日期控件的Value
通过Value属性可以获取或设置文本控件的值。如果是设置文本控件的值,则通过调用
ClientInstanceWithValue属性,该属性会根据Value属性产生客户端脚本代码,调用客户端的
set_Value()
方法,来设置文本控件的Value。
实例
下面的例子中演示了如何设置文本控件的值。其中RC_Symbol130是一个文本控件。
object assoC_DoCusSiteAction(CustomerActionEventArgs args)
{
UFWebClientTextBoxAdapter Symbol = new UFWebClientTextBoxAdapter(RC_Symbol130);
= symbol;
(InstanceWithValue);
return args;
}
下拉按钮控件适配器
如果需要访问下拉按钮控件,则在UI编程开发中应使用下拉按钮控件适配器,通过编
写服务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现对下拉按钮控件的客
户端关联操作。
功能
设置下拉按钮是否可用
使用ClientInstanceWithReadonly和ClientInstanceWithEnable属性可实现此功能。
可以为
False或True两种
类型。
当为
False
时置灰按钮,设置按钮不可点击,使有事
件的按钮不响应事件。相当于按钮Disabeld。
设置下拉按钮菜单项是否可用
使用SetEnabled方法和ClientInstanceOfMenuItemEnabled共同实现。
SetEnabled方法定义为
public void SetEnabled(string strIndex, bool enable)
,指定菜单
项的Index和是否可用即可。然后调用ClientInstanceOfMenuItemEnabled属性,该属性将产
生一段客户端脚本代码,调用客户端的
SetMenuItemEnable()
方法,从而设置菜单是否可用。
实例
实例1
下面的实例中演示了如何根据指定的条件设置菜单项是否可用。
private void CallbackControlBtnStatus()
{
AssociationControl ass = new AssociationControl();
ServerControl = id8;
ame = "OnRowClick";
CodeBlock block = new CodeBlock();
string condi = "if(";
condi += new UFWebClientGridAdapter(id8).ClientInstance +
".GetSelectedRows().length<=0)";
ion = condi;
UFWebClientPopUpItemAdapter item = new UFWebClientPopUpItemAdapter(el);
bled("0", false);
bled("1", false);
bled("2", false);
trol(item);
ck(block);
block = new CodeBlock();
string condi1 = "if(";
condi1 += new UFWebClientGridAdapter(id8).ClientInstance
+".GetSelectedRows().length>0)";
ion = condi1;
UFWebClientPopUpItemAdapter item1 = new UFWebClientPopUpItemAdapter(el);
bled("0", true);
bled("1", true);
bled("2", true);
trol(item1);
ck(block);
}
Label控件适配器
如果需要访问Label控件,则在UI编程开发中应使用Label控件适配器,通过编写服
务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现对Label控件的客户端关
联操作。
功能
操作事件Label控件
设置Label控件的PartID属性。通过调用ClientInstanceWithPartID属性,会根据PartID
属性,产生客户端脚本代码,调用客户端的
set_PartID()
方法,来设置Label控件的PartID,
弹出Form的URL。
通过TitleLinkWindowWidth属性设置弹出Form的Width属性。通过
TitleLinkWindowHeight设置设置弹出Form的Height属性。设置TitleLinkWindowWidth和
TitleLinkWindowHeight两个属性之后,通过调用
ClientInstanceWithTitleLinkWindowWidthHeight属性,来生成一段客户端脚本代码,设置弹
出Form的宽度和高度。
获取弹出Form返回的数据
使用以下两个方法可以实现。
ClientInstanceWithGetData方法其定义为
public string ClientInstanceWithGetData(string
strField)
ClientInstanceWithAllData方法其定义为
public string ClientInstanceWithAllData(string
strCode,string strName)
设置Label是否可用
有两个相关属性ClientInstanceWithLabelEnabledValue和ClientInstanceWithLabelEnable。
如果Lable是弹出Form的Label控件(即设置了PartID属性)这两个属性才生效。
ClientInstanceWithLabelEnabledValu同_EnabledValue一起使用。如果使用了_EnabledValue
属性,则可以使用ClientInstanceWithLabelEnabledValue属性来使控件是否可编辑。
ClientInstanceWithLabelEnable同
Enabled
一起使用。如果使用了_
Enabled
属性,则可以
使用ClientInstanceWithLabelEnable属性来使控件是否可编辑。
ClientInstanceWithEnable和ClientInstanceWithEnabledValue如果Lable不是弹出Form的
Label控件(即没有设置了PartID属性或PartID为null或空串)这两个属性才生效。
实例
实例1
private void RecBatchDocTypeChange()
{
AssociationControl assoC_5 = new AssociationControl();
assoC_ServerControl = ch_RecDocType41;
assoC_ame = "OnValueChanged";
ClientCallBackFrm cF = new ClientCallBackFrm();
omerAction += new
Customer(assoC_DoRecBatchDocTypeAction);
(ch_RecDocType41);
(ntType152);
(assoC_5);
}
object assoC_DoRecBatchDocTypeAction(CustomerActionEventArgs args)
{
UFWebClientLabelAdapter lab_DocumentType = new UFWebClientLabelAdapter(Label988);
lab_d = False;
(lab_InstanceWithEnable);
return args;
}
实例2 弹出Form Label控件
下面的实例中演示了如何设置一个Label控件为如果设置弹出Form的控件。
private void SetCustLabelPartID()
{
AssociationControl assoC_5 = new AssociationControl();
assoC_ServerControl = _Customer_IsMISC114;
assoC_ame = "onchange";
ClientCallBackFrm cF = new ClientCallBackFrm();
omerAction += new
Customer(assoC_DoPartIDAction);
(_Customer_IsMISC114);
(assoC_5);
}
object assoC_DoPartIDAction(CustomerActionEventArgs args)
{
bool isMisc =
(sh[_Customer_ID].ToString());
UFWebClientLabelAdapter lable0 = new UFWebClientLabelAdapter(3086);
UFWebClientLabelAdapter lable1 = new UFWebClientLabelAdapter(3092);
if (isMisc)
{
= "fef30b89-e43b-4c65-83ac-1cd3da3c3a67";
inkWindowHeight = 100;
inkWindowWidth = 315;
= "b220f790-7f8c-4073-b15b-7ad03d25023c";
inkWindowHeight = 100;
inkWindowWidth = 315;
}
else
{
= "c60a3c61-932c-45f9-9745-162e0807d1c9";
inkWindowHeight = 504;
inkWindowWidth = 992;
= "c60a3c61-932c-45f9-9745-162e0807d1c9";
inkWindowHeight = 504;
inkWindowWidth = 992;
}
(InstanceWithPartID);
(InstanceWithTitleLinkWindowWidthHeight);
(InstanceWithPartID);
(InstanceWithTitleLinkWindowWidthHeight);
return args;
}
表达式列表控件适配器
如果需要访问表达式控件,则在UI编程开发中应使用表达式控件适配器,通过编写服
务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现对表达式控件的客户端关
联操作。
设置控件的值
根据Value或ControlValue,通过调用ClientInstanceWithValue属性产生客户端脚本代码,
调用客户端的
set_Value()
方法,来设置表达式控件的Value。
CheckBox控件适配器
如果需要访问CheckBox控件,则在UI编程开发中应使用CheckBox控件适配器,通过
编写服务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现对CheckBox控件
的客户端关联操作。
功能
获取或设置CheckBox控件的值
通过Value属性可以获取或设置CheckBox控件的值,如果是设置控件的值,则可以使
用ClientInstanceWithValue属性,该属性会根据Value属性产生客户端脚本代码,通过调用
中的
set_Value()
方法,从而设置控件的值。
设置控件是否只读
通过调用ClientInstanceWithReadonly,该属性会根据控件的ReadonlyValue属性,产生
客户端脚本代码,调用客户端的
set_ ReadOnly()
方法,来设置控件是否只读。
设置控件是否可用
通过调用ClientInstanceWithEnable,该属性会根据控件的Enable属性,产生客户端脚本
代码,调用客户端的
set_ Enabled()
方法,来设置控件是否可编辑。
实例
下面的实例中
IsForeign428
是一个CheckBox控件,启用了该控件的
onclick
事件来触发关联。
CodeBlock codeBlockIsMatchPO264 = new CodeBlock();
assoC_ServerControl = ign428;
assoC_ame = "onclick";
expression = " if( !";
expression += new UFWebClientCheckBoxAdapter(ign428).Value;
expression += " )";
ion = expression;
assoC_ck(codeBlockIsMatchPO264);
Wizard控件适配器
如果需要访问Wizard控件,则在UI编程开发中应使用Wizard控件适配器,通过编写
服务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现对Wizard控件的客户
端关联操作。
清空Wizard页中的数据
设置IsClearData属性,指定是否清除Page的数据。通过调用ClientInstanceWithClearData
属性,产生客户端脚本代码,调用客户端的
Clear()
方法,用来清除控件上的数据。
DataGrid控件适配器
基本概念
如果需要访问DataGrid控件,则在UI编程开发中应使DataGrid控件适配器,通过编写
服务器端代码,通过关联控件的框架生成相应的客户端脚本,来实现DataGrid控件的客户
端关联操作。
DataGrid控件的适配器对应于
UFWebClientGridAdapter
类,多在CallBack中使用,相当
于DataGrid控件的一个可控实例,对DataGrid控件的操作可以通过
UFWebClientGridAdapter
来实现。
常量属性
ALL_GRIDDATA
这是
UFWebClientGridAdapter
的一个静态常量,通过
ALL_GRIDDATA可以
在CallBack中获取
DataGrid客户端收集到服务器端的数据。
其定义为
public static string ALL_GRIDDATA = "ALL_GRIDDATA";
ALL_GRIDDATA_SelectedRows
这是
UFWebClientGridAdapter
的一个静态常量,通过
ALL_GRIDDATA_SelectedRows可以
在
CallBack中获取DataGrid客户端的所有选中行信息。
其定义为
public static string ALL_GRIDDATA_SelectedRows = "ALL_GRIDDATA_SelectedRows";
下面的实例说明了该常量的使用。
assoC_3_DoLinePopFormAction
是一个已定义的CallBack的处理函数。代码演示了在该处理
函数中(服务器端)获取当前客户端选中的行集信息。
object assoC_3_DoLinePopFormAction(CustomerActionEventArgs args)
{
if (((ArrayList)sh[_GRIDDATA_SelectedRows]).Count
<= 0)
return null;
string rowIndex =
((ArrayList)sh[_GRIDDATA_SelectedRows])[0].ToString();
//返回被选种的行号
……
}
FocusRow
这是
UFWebClientGridAdapter
的一个静态常量,通过
ALL_GRIDDATA_FocusRow可以
在CallBack
中获取DataGrid客户端的所有焦点行。
其定义为
public static string FocusRow = "ALL_GRIDDATA_FocusRow";
下面的实例说明了怎样通过FocusRow来获取焦点行当信息。
Do_CurMoneyChangedCallBack
是一个已定义的CallBack的处理函数。代码演示了在该处理函数
中(服务器端)获取当前客户端焦点行信息
object Do_CurMoneyChangedCallBack(CustomerActionEventArgs args)
{
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id0);
//获取焦点行
string rowIndex = sh[ow].ToString();
//取当DataGrid的数据信息
ArrayList res = (ArrayList)sh[ID];
//取当前行的内容
Hashtable hsCurRow = (Hashtable)res[(rowIndex)];
}
FocusColumn
这是
UFWebClientGridAdapter
的一个静态常量,通过
ALL_GRIDDATA_FocusColumn可以
在
CallBack中获取DataGrid客户端的焦点列。
其定义为
public static string FocusColumn = "ALL_GRIDDATA_FocusColumn";
下面的实例说明了怎样通过FocusColumn来获取当前DataGrid焦点列信息。
GridCellValueChange_CallBack_Action
一个已定义的CallBack的处理函数。代码演示了在该处
理函数中(服务器端)获取当前客户端焦点列信息。
private Object GridCellValueChange_CallBack_Action(CustomerActionEventArgs args)
{
long startTime = ;
Receivement_RcvLinesRecord lineRecord =
ement_dRecord;
string strIndex = sh[ow].ToString();
string strColumnIndex =
sh[olumn].ToString();
int curIndex = (strIndex);
int curColumnIndex = (strColumnIndex);
IUFDataGrid srcDataGrid = rceGrid();
string fieldID = s[curColumnIndex].UIFieldID;
Hashtable
}
hashT =
(Hashtable)((ArrayList)sh[ID])[curIndex];
BtnAdd
这是
UFWebClientGridAdapter
的一个静态常量,通过
BtnAdd可以
在CallBack中获取DataGrid
客户端的浮动菜单上的新增按钮。
其定义为
public static string BtnAdd = "AddButton";
BtnDel
这是
UFWebClientGridAdapter
的一个静态常量,通过
BtnAdd可以
在CallBack中获取DataGrid
客户端的浮动菜单上的删除按钮。
其定义为
public static string BtnDel = "DelButton";
BtnInsert
这是
UFWebClientGridAdapter
的一个静态常量,通过
BtnAdd可以
在CallBack中获取DataGrid
客户端的浮动菜单上的插入按钮。
其定义为
public static string BtnInsert = "InsertButton";
主要功能
获取或设置菜单是否显示
对应属性为MenuVisible,用来控制DataGrid的菜单项是否显示。
新增DataGrid的行
对应属性为AddRow。返回一段客户端脚本代码,用来调用中的
AddNewRow ()
方法。使用ClientInstanceWithAddRow属性可以实现这样的功能。
指定隐藏或显示的列的集合
ColumnsVisbled属性指定隐藏或显示的列的集合,为ClientInstanceWithColumnsVisbled
提供参数。
ArrayList 类
型元素为形如字符串数组
string[]{"fieldId","true/false"},
即指定
FieldID和true或false,true为可见,
false
表示隐藏。
使用ClientInstanceWithColumnsVisbled提供参数。根据ColumnsVisbled属性,产生客
户端脚本代码,调用客户端的
SetColumnVisible()
方法,来设置DataGrid中的指
定的列可见或隐藏。
获取DataGrid中的当前行的索引
使用CurrentRowIndex 属性,该属性产生客户端脚本,调用客户端中的
get_CurrentRowIndex()
方法。
清除DataGrid中的数据
如果
IsClearData属性
为true,则可以启用
ClientInstanceClearData
属性,如果为false,则
ClientInstanceClearData
返回为空串。使用ClientInstanceClearData属性,该属性返回一段客户
端脚本代码,通过调用客户端中的
ClearData()
方法,来清除DataGrid表体中的数
据,同时清楚DataGrid对应的UIModel中相应View的数据。
ClientInstanceWithClearData属性同ClientInstanceClearData实现一样的功能。
删除DataGrid中的数据
启动IsRemoveData属性,如果IsRemoveData为true,则可以启用
ClientInstanceWithRemoveData
属性,如果为false,则
ClientInstanceWithRemoveData
返回为空串。
ClientInstanceWithRemoveData属性返回一段客户端脚本代码,通过调用客户端
中的
ClearData()
方法,来清除DataGrid表体中的数据,而不清除DataGrid对应
的UIModel中相应View的数据。
设置Datagrid中可编辑的列集合
使用EnabledCols属性可以实现。
其定义为
public ist EnabledCols
常用方法
EnabledCols的中的元素对象为一个对象的数组(
Object[]
),格式如下:
第一个元素为指定的列的FieldName,
第二个元素为该列是否可编辑,即true/false,
第三个元素指定行的rowIndex,如果为空串默认为当前行。
例如如下代码:
(new Object[] { "IsMainVers", "false", "" });
其含义是设置当前行fieldName为“
IsMainVers
”的列不可用。
实例代码
AssociationControl assControl;
CodeBlock codeBlock;
string expression;
assControl = new AssociationControl();
ServerControl = id8;
ame = "OnBeforeCellFocusEnter";
//等级可用
codeBlock = new CodeBlock();
expression = " if( ";
expression += new
UFWebClientGridAdapter(id8).getSelectedValuePK("Item_IsGradeControl");
expression += " == ";
expression += "'true'";
expression += " )";
ion = expression;
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id8);
("FromDegree");
(new Object[] { "FromDegree", "true", "" });
("ToDegree");
(new Object[] { "ToDegree", "true", "" });
trol(grid);
ck(codeBlock);
设置DataGrid中的指定触发事件列
设置FireEventCols属性可以实现。该属性的定义为
public ist
FireEventCols。
常用方法
EnabledCols的中的元素对象为一个对象的数组(
Object[]
),格式如下:
第一个元素为指定的列的FieldName,
第二个元素为该列是否可编辑,即true/false,
第三个元素指定行的rowIndex,如果为空串默认为当前行。
实例代码
AssociationControl assControl;
CodeBlock codeBlock;
string expression;
assControl = new AssociationControl(); ;
ServerControl = id8;
ame = "OnBeforeCellFocusEnter";
codeBlock = new CodeBlock();
expression = " if( (";
expression += new
UFWebClientGridAdapter(id8).getSelectedValuePK("IsExecuted");
expression += " == ";
expression += "'true')";
expression += " && (";
expression += new
UFWebClientGridAdapter(id8).getSelectedValuePK("IsMainVers");
expression += " == ";
expression += "'true'";
expression += " ))";
ion = expression;
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id8);
("IsMainVers");
(new Object[] { "IsMainVers", "false", "" });
SetGridColEnable("false", grid);
trol(grid);
ck(codeBlock);
设置隐藏列集合
通过设置HiddenCols属性,可以设置隐藏列集合。
其定义为
public ist HiddenCols
常用方法
HiddenCols的中的元素对象为一个对象的数组(
Object[]
),格式如下:
第一个元素为指定的行的rowIndex,
第一个元素为指定的列的fieldId,
第二个元素为该列是否可编辑,即true/false,
第三个元素指定行的rowIndex,如果为空串默认为当前行。
设置DataGrid的一个Cell的Value
ClientInstanceWithValue与CellValue属性一共使用可以实现此功能。CellValue定义为
public ist CellValue
其定义为
public ist HiddenCols
常用方法
rowIndex,columnIndex,value
HiddenCols的中的元素对象为一个对象的数组(
Object[]
),格式如下:
第一个元素为指定的行的rowIndex,
第二个元素为指定的列的columnIndex,
第三个元素为指定行指定列的要赋的Value。如果是为一个参照列赋值。则第三个元素应该
是一个含有3个元素的字符串数组,分别是参照的ID、Code和Name的字符串形式。
设置了CellValue,后,使用该属性,可以生成一段客户端脚本代码,用来设置DataGrid
中的CellValue。
设置DataGrid的浮动菜单条中新增、插入和删除是否可用
ClientInstanceWithResetMenuStatus属性生产客户端脚本,设置DataGrid的浮动菜单条
中新增、插入和删除是否可用。
DataGrid条件合计
ConditionAggrList属性其代码定义如下:
public struct AggrColumnFlagFieldNameValue
{
public string AggregateColumnName;
public string ConditionFieldName;
public string ConditionFieldValue;
}
使用ClientInstanceWithResetCalculateAggregationsByCondition,ConditionAggrList存储
了根据指定条件列的Value进行合计时,被合计列的列名、条件列的列名、条件列的Value
三者之间的对应关系。通过调用中的
AddAggregateColumnFieldNameValue()
和
ResetCalculateAggregations()
方法在客户端合计当前DataGrid的列的数据。
DataGrid合计
使用ClientInstanceWithResetCalculateAggregations属性可以实现此功能,该属性通过调
用中的
ResetCalculateAggregations()
方法在客户端合计当前DataGrid的列的数据。
达到客户端合计达目的。
下面的实例使用了该属性,用于客户端合计。
public void AfterCreateChildControls()
{
Set_SumMoneyChange();
}
//处理合计行
private void Set_SumMoneyChange()
{
AssociationControl _asso = new AssociationControl();
_ServerControl = id0;
((IUFClientAssoGrid)_Control).("ThisDisposeMoney");
_ame = "OnCellDataValueChanged";
CodeBlock codeBlock = new CodeBlock();
string expression = "";
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id0);
ion = InstanceWithResetCalculateAggregations;
_ck(codeBlock);
}
再举一例
object assoC_DoRCPersionChangeAction(CustomerActionEventArgs args)
{
string RC_Symbol = sh[_ID].ToString();
//没有币种
if (RC_().Length == 0)
return null;
string RC_MoneyRound_RoundValue =
sh[_MoneyRound_ID].ToString();
string RC_MoneyRound_RoundType =
sh[_MoneyRound_ID].ToString();
string RC_MoneyRound_Precision =
sh[_MoneyRound_ID].ToString();
if (edIndex == 0)//当前页
{
#region 修改符号精度等
//如果帐号币种为空,帐号币种=收款币种07-7-17
//返回被选种的行号
ArrayList res = (ArrayList)sh[ID];
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id4);
int rowcount = -1;
for (int j = 0; j <= rowcount; j++)
{
(new Object[] { ng(),
"RecBillHead_RC_MoneyRound_Precision", new string[] { RC_MoneyRound_Precision,
RC_MoneyRound_Precision, RC_MoneyRound_Precision } });
(new Object[] { ng(),
"RecBillHead_RC_MoneyRound_RoundType", new string[] { RC_MoneyRound_RoundType,
RC_MoneyRound_RoundType, RC_MoneyRound_RoundType } });
(new Object[] { ng(),
"RecBillHead_RC_MoneyRound_RoundValue", new string[] { RC_MoneyRound_RoundValue,
RC_MoneyRound_RoundValue, RC_MoneyRound_RoundValue } });
(new Object[] { ng(), "RecBillHead_RC_Symbol",
new string[] { RC_Symbol, RC_Symbol, RC_Symbol } });
}
umnDefaultValue("RecBillHead_RC_Symbol", RC_Symbol);
umnDefaultValue("RecBillHead_RC_MoneyRound_Precision",
RC_MoneyRound_Precision);
umnDefaultValue("RecBillHead_RC_MoneyRound_RoundType",
RC_MoneyRound_RoundType);
umnDefaultValue("RecBillHead_RC_MoneyRound_RoundValue",
RC_MoneyRound_RoundValue);
(InstanceWithResetDefaultValue);
(InstanceWithValue);
////处理符号
string expression = "";
expression = Instance +
".ResetCurrencySymbolByColumnName('Money_OCMoney','" + RC_Symbol + "')";
(expression);
expression = Instance +
".ResetCurrencySymbolByColumnName('SettlementFee_OCMoney','" + RC_Symbol + "')";
(expression);
expression = Instance +
".ResetCurrencySymbolByColumnName('TotalMoney_OCMoney','" + RC_Symbol + "')";
(expression);
#endregion
(InstanceWithResetCalculateAggregations);
}
同一列的不同单元格内显示不同的控件
某些场景下,DataGrid中的同一列中不同行的数据类型也不同,因此不同单元格对应的
的控件也不同。例如同一列中,第一行数据是文本类型,第二行是日期类型,第三行是
CheckBox类型。此时需要用到DataGrid的运行时动态交换列控件的功能。
DataGrid需要定义不同的列,要显示多少种控件类型就定义多少列,除了显示列以外,
其余列都是隐藏列。在关联控件中,使用ClientInstanceWithSwitchColumnControl,该属性生
成客户端脚本,通过调用客户端的
SwitchColumnControl()
方法来交换列控件,使得隐藏列
的控件可以显示到显示列中来,这样实现了在同一列的不同单元格内显示不同的控件。
设置DataGrid的行的背景色
使用ClientInstanceWithReSetBgColor可以设置DataGrid的行的背景色。
判断指定列是否包含当前指定值
ClientInstanceWithIsContainOf方法可以实现此功能。
该方法有两个参数:
第一个参数为DataGrid列名FieldName。
第二个参数为Value。
其作用是生成客户端脚本代码,用来判断指定列(列名为FieldName的列)是否包含当
前值(Value)。
其定义为
public string ClientInstanceWithIsContainOf(string strFieldName,string strValue)
删除指定列的数据
ClientInstanceWithClearColumnData使用
ClearColumnData(string column)
方法,将要删除
数据的列都加入到一个类型为
ArrayList
的
_clearColumns
变量中,然后使用
ClientInstanceWithClearColumnData来生成客户端脚本,执行删除指定列的数据。
获取DataGrid的当前行信息
ClientInstanceWithRows获取DataGrid的当前行信息,产生客户端脚本代码,调用客户
端的
.get_Rows()
方法。返回DataGrid所有行的行数(count)。
获取DataGrid当前列的列索引
ClientInstanceWithCurrentColumnIndex获取DataGrid当前列的列索引,产生客户端脚本
代码,调用客户端的
get_CurrentColumnIndex()
方法。
获取DataGrid当前列的列索引
ClientInstanceWithRowStatus获取DataGrid当前列的列索引,产生客户端脚本代码,调
用客户端的
SetRowStatus ()
方法。
SetRowStatus ()
有两个参数,分别是行索引
rowindex,第二个参数为行状态state,SetRowStatus方法的定义为
SetRowStatus :
function(rowIndex,state)。
设置DataGrid是否为只读
ClientInstanceWithReadonly根据
Enabled
属性,来设置DataGrid是否为只读。产生客户
端脚本,通过调用客户端中的
set_ReadOnly()
来设置DataGrid是否只读。
获取客户端DataGrid的当前行的行索引
ClientInstanceWithCurrentRowIndex属性的作用就是是获取客户端DataGrid的当前行的
行索引。在服务器端调用该属性,可生成客户端脚本代码,通过调用客户端
get_CurrentRowIndex()
方法,来获取当前行的行索引。
使用ClientInstanceWithCurrentRows属性也可以实现ClientInstanceWithCurrentRowIndex
一样的功能。
设置DataGrid中的指定列是否不可编辑
使用ClientInstanceWithEnable属性。如果程序中指定了
EnabledCols
,即指定了某些特定
列为不可编辑列,则只使这些特定列为不可编辑。
如果没有对
EnabledCols
赋值,则指定整个DataGrid不可编辑。
设置某一列是否可以编辑
使用ClientInstanceWithSetColumnEditable属性和
ResetColumnEditable
方法一起使用。
如果使用了
ResetColumnEditable
方法可以设置了某些列为可编辑。
设置DataGrid控件的行状态
使用ClientInstanceWithReSetRowStatus属性,该属性生成一段客户点脚本代码,用来设
置客户端DataGrid的行状态。
设置DataGrid列为Form引用列
使用ClientInstanceWithReSetPartID属性,可以设置DataGrid中某一列为弹出Form列,
来设置该列为弹出Form的列。
以下实例代码演示了该属性的使用。
public string GetResetPartIDScript(UFWebClientGridAdapter grid, DataTable dt, string colName,
string judgeField)
{
string ex = "";
ex += " if(!" + Instance + ") return;n";
ex += " if(" + InstanceWithRows + "==0) return;n";
if (dt != null && > 0)
{
ex += " var judgeFieldValue=" + ectedValue(tRowIndex,
judgeField);
ex += " ;n";
foreach (DataRow row in )
{
if (row[0] != null && row[1] != null && row[2] != null && row[3] != null)
{
ex += " if(rCase()=='" +
row[0].ToString().ToLower() + "')";
ex += " { n";
olumnPartID(colName, row[1].ToString(), row[2].ToString(),
row[3].ToString());
ex += InstanceWithReSetPartID;
ex += " return;n";
ex += " } n";
}
}
}
return ex;
}
//同币种核销---行的选择
private void RowSelected(IUFDataGrid dataGrid, string maxMoneyCol, string curMoneyCol,
string MaxDiscountCol, string discountCol)
{
AssociationControl assControl = new AssociationControl(); ;
CodeBlock codeBlock = new CodeBlock();
ServerControl = dataGrid;//Grid的控件名
((IUFClientAssoGrid)Control).EventName = "OnBodyRowSelected";
//OnCellFocusOut
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(dataGrid);
string expression = "";
expression += " if(!" + Instance + ") return; n";
expression += " if(" + InstanceWithRows + "==0) return; n";
expression += " if(" + hecked(tRowIndex) + ")";
expression += " { n";
expression += " var maxMoney=" + ectedValue(tRowIndex,
maxMoneyCol);
expression += " ;n ";
expression += " if(maxMoney=='') return;n";
expression += gridSetCellValue(grid, tRowIndex, curMoneyCol,
"maxMoney");
expression += " } n";
expression += " else ";
expression += " { n";
expression += gridSetCellValue(grid, tRowIndex, curMoneyCol, "0");
expression += gridSetCellValue(grid, tRowIndex, discountCol, "0");
expression += " } n";
expression += Instance + ".SetRowStatus(" + tRowIndex +
","Mod"); n";
expression += etPartIDScript(new UFWebClientGridAdapter(dataGrid),
tIDTable_AP(), "DocNo", "IsPeriodBegin");
ion = expression;
ck(codeBlock);
}
设置当前的Cell为获取焦点的Cell
使用ClientInstanceWithFocus属性可以达到此功能,该属性返回一段客户端脚本代码,
通过调用客户端中的
FocusCurrentCell()
方法,来设置当前的Cell为获取焦点的
Cell。
触发DataGrid控件的PostBack
使用ClientInstanceWithPostBack属性,该属性返回一段客户端脚本代码,通过调用客户
端中的
FirePostBack()
方法,来触发PostBack。该属性与
PostBackTag
和
EventName
一起使用
。PostBackTag
属性也可以不设置。
动态移动DataGrid行数据
在关联控件中,SetSwitchRowDataInfo方法和
ClientInstanceWithSwitchRowData
属性,可以实
现在运行时动态移动DataGrid的行数据的功能。SetSwitchRowDataInfo方法中指定并设定
SwitchRowType,
支持以下四种交换,默认为
MoveFirstRow
。
public enum SwitchRowType
{
MoveFirstRow = 1,
MoveLastRow = 2,
MoveNextRow = 3,
MovePreviousRow = 4
}
SetSwitchRowDataInfo方法定义为
public void SetSwitchRowDataInfo(string[] strInChangeFields, SwitchRowType type)
第一个参数
strInChangeFields
第二个参数
type
判断某列是否包含指定值
使用ClientInstanceWithIsContainOf方法可以判断某列是否包含指定值。该方法
生成一段客户端脚本代码,通过调用客户端中的
ContainOf()
方法用来判断FieldName为第一个参数的指定的列中是否包含指定值。
两个参数:
第一个参数strFieldName,指定列的FieldName。
第一个参数strValue,指定的值。
判断指定的行是否被选中
使用RowIsChecked方法可以判断指定的行是否被选中。
该方法获取是指定的行是否被选中。参数为行索引(RowIndex)
清除列数据
使用ClearColumnData方法,用来设置要清除数据的列。通过调用
ClientInstanceWithClearColumnData属性,来产生一段客户端脚本,清除指定列的数据。
设置行索引为rowIndex的行当状态
使用SetRowStatus方法或ResetRowStates方法设置行索引为rowIndex的行当状态。
为指定列设置属性
使用ResetColumnEditorAttribute方法可以为指定列设置属性。
其代码定义为
public void ResetColumnEditorAttribute(string fieldName, string attribute, object value)
参数列表:
fieldName:DataGrid的列的fieldName
attribute:属性
Value:属性值
设置指定列的弹出Form的PartID
使用ResetColumnPartID方法,可以为columnName所在列设置弹出Form的PartID。
其代码定义为
public void ResetColumnPartID(string columnName,string partID,string w,string h)
参数列表如下:
columnName:列名
partID:弹出Form的partID
w弹出Form的宽度
h:弹出Form高度
ResetColumnEditable
设置DataGrid的columnName所在列可编辑
使用ResetColumnEditable方法可以设置DataGrid的columnName所在列可编辑,其
代码定义为:
public void ResetColumnEditable(string columnName, bool bEditable)
在rowIndex处插入行
使用InsertRow方法,可以实现这样的功能。其代码定义为:
public string InsertRow(int rowIndex)
设置DataGrid的rowIndex所在行是否被选中
使用SelectRow方法可以设置DataGrid的rowIndex所在行是否被选中,如果不指定
rowIndex,则为当前行。
其代码定义为
public string SelectRow(int rowIndex, bool bSelect)
public string SelectRow(string rowIndex, bool bSelect)
该方法用来返回一段客户端js脚本代码,用来设置指定行时候被选中。
该方法有两个参数:
第一个指定行索引rowIndex
第一个指定是否被选中。
如果是对当前行CurrentRow进行设置是否被中状态,则可以使用
public string SelectRow(bool bSelect)
这个方法。
设置rowIndwx所在行是否可编辑
SetColumnEditEnable方法可以设置rowIndwx所在行是否可编辑。其代码定义为
public string SetColumnEditEnable(int rowIndex, bool bEnabled)
设置rowIndex所在行的背景色
SetRowBackgroundColor方法可以设置rowIndex所在行的背景色。其代码定义为
public string SetRowBackgroundColor(int rowIndex, string strColor)
设置rowIndex所在行的字体
SetRowFrontColor方法可以设置rowIndex所在行的字体。其代码定义为
public string SetRowFrontColor(int rowIndex, string strColor)
设置Cell的字体颜色
SetCellFrontColor方法可以设置RowIndex所在行Column所在列的字体颜色。其代码定
义为
public string SetCellFrontColor(int rowIndex,string fieldName, string strColor)
SetCellBackgroundColor方法可是实现设置rowIndex所在行fieldName所在列的颜色。
其代码定义为
public string SetCellBackgroundColor(int rowIndex,string fieldName, string strColor)
设置列的默认值
使用SetColumnDefaultValue方法可以设置fieldName所在列的默认值。
public string SetColumnDefaultValue(string fieldName, string[] oV)
第一个参数为filedName
第二个参数为一个字符串数组。对于参照列,需要需要指明id code name这样一个string数组。
实例
该实例设置了参照列的默认值
//设置默认结算方式,银行帐号
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(id4);
if (sh[ch_DefRecBank35] != null)
{
string strPk2 = sh[ch_DefRecBank35].ToString();
string strCode2 = sh[ch_ID +
"_Value"].ToString();
string strName2 = sh[ch_ID +
"_Text"].ToString();
umnDefaultValue("RecBk", new string[] { strPk2, strCode2,
strName2 });
(InstanceWithResetDefaultValue);
}
if (sh[ch_DefRecBank35] != null)
(new Object[] { rowIndex, "RecBk", new string[]
{ sh[ch_ID].ToString(),
sh[ch_ID + "_Value"].ToString(),
sh[ch_ID + "_Text"].ToString() } });
(InstanceWithValue);
Status((rowIndex), ed);
(InstanceWithRowStatus);
SetColumnDefaultValue方法还有一个代码实现如下
public string SetColumnDefaultValue(string fieldName, object oV)
设置指定行的制定列的单元格Cell的Text值
ValueName方法代码定义为
public string ValueName(string rowIndex, string strField)
含义是生成一段客户端脚本代码,用来设置指定行的制定列的单元格Cell的Text值。如果
不指定rowIndex为空字符串,则为rowIndex为当前行的索引。
该方法有两个参数:
第一个参数rowInde,指定行的行索引。
第二个参数strField,指定列的FieldName。
获取DataGrid的rowIndex所在行strField所在列的单元格Cel的Code的值
使用ValueCode方法获取DataGrid的rowIndex所在行strField所在列的单元格Cell的
Code的值,如果不指定rowIndex为空字符串,则为rowIndex为当前行。
其代码定义为
public string ValueCode(string rowIndex, string strField)
获取DataGrid的rowIndex所在行strField所在列的单元格的Value
使用ValuePK方法可以获取DataGrid的rowIndex所在行strField所在列的单元格的
Value,如果不指定rowIndex为空字符串,则为rowIndex为当前行的索引。其代码定义
为
public string ValuePK(string rowIndex, string strField)
获取当前行指定的列名称所在列的Value
getSelectedValueText方法返回一段脚本代码字符串,用来获取当前行指定的列名称所在
列的Value。其代码定义为
public string getSelectedValueText(string strField)
获取当前行指定的列名称所在列的Value
getSelectedValuePK方法返回一段脚本代码字符串,用来获取当前行指定的列名称所在
列的Value。其代码定义为
public string getSelectedValuePK(string strField)
获取fieldName 所在列的列索引
getColumnIndexByFieldName方法返回一段脚本代码字符串,用来获取fieldName 所在
列的列索引(Index)。其代码定义为
public string getColumnIndexByFieldName(string strField)
获取rowIndwx所在行指定列(strField)的cell的Value
getSelectedValue方法返回一段脚本代码字符串,用来获取rowIndwx所在行指定列
(strField)的cell的Value。其代码定义为
public string getSelectedValue(string rowIndex, string strField)
获取当前行指定列的Cell的Code
getSelectedValueCode方法返回一段脚本代码字符串,用来获取当前行指定列(strField)
的cell的Code。其代码定义为
public string getSelectedValueCode(string strField)
设置codeCol所在列的步长(step)
SetCodeColAndStep方法用于设置自增号步长。
其代码定义为:
public void SetCodeColAndStep(string codeCol, string step)
主要事件
DataGrid可以使用的事件列表如下:
function DataGridEvent(){}
RowSelectedChange="OnBodyRowSelectedChange";
RowSelectedValueChange="OnBodyRowSelectedValueChange";
RowSelected="OnBodyRowSelected";
reRowInsert="OnBeforeRowInsert";
reRowDelete="OnBeforeRowDelete";
rRowInserted="OnAfterRowInserted";
rRowDeleted="OnAfterRowDeleted";
FocusEnter="OnCellFocusEnter";
FocusOut="OnCellFocusOut";
Click="OnCellClick";
DbClick="OnCellDbClick";
hanged="OnRowChanged";
lick="OnRowClick";
Page="OnMovePage";
ress="Onkeypress";
reOpenDialog="OnBeforeOpenDialog";
rOpenDialog="OnAfterOpenDialog";
reCustomerPostBack="OnBeforeCustomerPostBack";
rRowAdded="OnAfterRowAdded";
reCellFocusEnter="OnBeforeCellFocusEnter";
DataChanged="OnCellDataChanged";
DataValueChanged="OnCellDataValueChanged";
reRowAdd="OnBeforeRowAdd";
ctAllRecords="OnSelectAllRecords";
rolValueChange="OnControlValueChange";
实例
下面实例1、实例2和实例3都是在AfterCreateChildControls中客户端代码,实现客户端关
联。
public void AfterCreateChildControls()
{
rent().AsyncPostBackTimeout =
32("90000");
erScript_OnCellDataValueChanged();
erScript_OnCellDataChanged();
erScript_OnBeforeCellFocusEnter();
}
实例1,使用
"OnBeforeCellFocusEnter"
事件
private void RegisterScript_OnBeforeCellFocusEnter()
{
IUFDataGrid ufGrid = id1;
AssociationControl ass1 = new AssociationControl();
ServerControl = ufGrid;
ame = "OnBeforeCellFocusEnter";
((IUFClientAssoGrid)Control).("DynamicCreate");
CodeBlock block;
UFWebClientGridAdapter grid;
block = new CodeBlock();
grid = new UFWebClientGridAdapter(ufGrid);
ion = "if(" + ectedValuePK("BE_Create") + "=='0')";
(new string[] { "DynamicCreate", "false", "" });
trol(grid);
ck(block);
}
实例2,使用
"OnCellDataChanged"
事件
private void RegisterScript_OnCellDataChanged()
{
IUFDataGrid ufGrid = id1;
AssociationControl ass1 = new AssociationControl();
ServerControl = ufGrid;
ame = "OnCellDataChanged";
((IUFClientAssoGrid)Control).("BE_Create");
CodeBlock block;
UFWebClientGridAdapter grid;
//设置系统记录编码、名称不可改
block = new CodeBlock();
grid = new UFWebClientGridAdapter(ufGrid);
ion = "if(" + ectedValuePK("BE_Create") + "=='0')";
ion += "{";
(new object[] { "", "DynamicCreate", new string[]
{"-1","","" } });
ion += InstanceWithValue;
ion += "}";
trol(grid);
ck(block);
}
实例3使用
"OnCellDataChanged"
事件
private void RegisterScript_OnCellDataValueChanged()
{
IUFDataGrid ufGrid = id1;
AssociationControl ass1 = new AssociationControl();
ServerControl = ufGrid;
ame = "OnCellDataChanged";
((IUFClientAssoGrid)Control).("BE");
CodeBlock block;
UFWebClientGridAdapter grid;
//增加
block = new CodeBlock();
grid = new UFWebClientGridAdapter(ufGrid);
//ion = "";
(new object[] { "", "DynamicCreate", new string[] { "-1", "",
"" } });
trol(grid);
ck(block);
//修改
block = new CodeBlock();
grid = new UFWebClientGridAdapter(ufGrid);
//ion = "if("+ ectedValuePK("SegmentType")+"=='2')";
(new object[] { "", "DynamicDelete", new string[] { "-1", "",
"" } });
trol(grid);
ck(block);
//删除
block = new CodeBlock();
grid = new UFWebClientGridAdapter(ufGrid);
(new object[] { "", "DynamicUpdate", new string[] { "-1", "",
"" } });
trol(grid);
ck(block);
//读取
block = new CodeBlock();
grid = new UFWebClientGridAdapter(ufGrid);
(new object[] { "", "DynamicSearch", new string[] { "-1", "",
"" } });
trol(grid);
ck(block);
}
实例4、使用
OnCellDataChanged
事件
private void OnEndCellEditing_IsDefaultCurrency()
{
AssociationControl assoCGrid2 = new AssociationControl();
CodeBlock codeBlock = new CodeBlock();
ServerControl = rrency;
ame = "OnCellDataChanged";//OnCellFocusOut
((IUFClientAssoGrid)Control).("IsDefaultCurrency");
//
ClientCallBackFrm cF2 = new ClientCallBackFrm();
omerAction += new
Customer(assoCGrid_DoCustomerAction);
(rrency);
(assoCGrid2);
(cF2);
}
///
/// GridCallBack事件处理
///
///
///
private object assoCGrid_DoCustomerAction(CustomerActionEventArgs args)
{
int foucusIndex =
(((ArrayList)sh["ALL_GRIDDATA_SelectedRows"])[0].ToString());
ArrayList gridData = (ArrayList)sh[ID];
Hashtable foucusRow = (Hashtable)gridData[foucusIndex];
UFWebClientGridAdapter grid = new UFWebClientGridAdapter(rrency);
if (foucusRow["IsDefaultCurrency"] != null &&
!OrEmpty(foucusRow["IsDefaultCurrency"].ToString()))
{
int index = foucusRow["IsDefaultCurrency"].ToString().Trim().IndexOf("$");
string strIsBase;
if (index > 0)
{
strIsBase = foucusRow["IsDefaultCurrency"].ToString().Trim().Substring(0,
index);
}
else
{
strIsBase = foucusRow["IsDefaultCurrency"].ToString().Trim();
}
if ((strIsBase))
{
for (int i = 0; i < ; i++)
{
if (i != foucusIndex)
{
(new Object[] { ng(),
"IsDefaultCurrency", new string[] { "false", "□", "□" } });
}
}
}
(InstanceWithValue);
}
return args;
}
实例5、使用OnCellClick事件
下面的示例中演示了,通过注册
OnCellClick
事件,将DataGrid上一列的数据如何赋值到Card
上控件上。
private void setCardData()
{
AssociationControl assoC_3 = new AssociationControl();
CodeBlock codeBlock = new CodeBlock();
assoC_ServerControl = id1;
assoC_ame = "OnCellClick";
////客户端赋值部分
ion = "";
SendGridItemToCard(codeBlock, ccount218, "Account");
SendGridItemToCard(codeBlock, rrorMessage0, "ErrorDescription");
assoC_ck(codeBlock);
//服务器赋值部分
ClientCallBackFrm cF = new ClientCallBackFrm();
omerAction += new
Customer(assoC_3_DoSetCardDataAction);
(id1);
(ign428);
(mo);
(assoC_3);
}
///
/// 把grid某一列的值赋到卡片上
///
/// codeBlock
/// 带到卡片上的控件
/// 列属性名
private void SendGridItemToCard(CodeBlock codeBlock, IUFControl control, string
colFieldID)
{
trol(ID, control).ControlValue =
new UFWebClientGridAdapter(id1).getSelectedValueText(colFieldID);
}
报表开发框架
报表开发流程
通过DataComand生成缺省模板
报表生成工具
设计UIModel
选择字段
配置报表
服务器
设计UIForm
选择结果栏目
设计报表模
设计报表参
版布局
数
选择缺省结
果栏目
UIForm和报表
模版绑定
设计数据源
和查询
选择条件栏
目
生成框架代
码
选择控制条
件
定义单元表
达式
设置报表栏
目属性
生成DataCommand框架
报表格式和数
代码
据处理处理
报表模版国
际化处理
设计取数
测试
发布报表
注册
报表开发基本工艺路线
DataCommand
应用设计器设计DataComand模型
生成代码,添加取数逻辑。
调试
报表模板
导入DataCommand生成缺省报表模板。
应用报表设计器设计报表模板
报表模板发布
报表UI设计
报表方案管理设计(公共)
报表Form设计(结果Form绑定报表模板)
报表格式/数据处理策略。(应用报表元数据服务)
客户端展现。
DataCommand开发
说明
当报表数据查询逻辑复杂到无法用SQL或OQL实现时需要自定义数据查询。
ReportServer是报表主要服务器,UBF报表用自定义扩展类接管U9报表的所有
数据读写功能。
数据查询扩展物理上与ReportServer运行于同一进程。
自定义的扩展类必须继承BaseReportDataCommand(基类提供接口的默认实现)。
用DataCommand实现复杂报表的设计步骤
1.创建专用的工程,引用下列报表服务提供的组件
2.继承BaseDataCommand类创建业务逻辑实现类,确定业务逻辑中需要的查询参数。
测试保证类能正确执行,特别是当参数无值是应按默认的参数值输出;
3.编译工程,并将动态库注册到报表设计器。
4.在报表设计器中创建新报表,创建数据查询,将数据来源映射到业务逻辑实现类中
(设计器提供特定的方法)。
5.创建查询参数(查询参数的数量和名称应该在业务逻辑中已事先确定),将查询参数
映射到报表参数。
6.执行查询取得结果集合的Schema之后设计报表格式。
7.发布动态库到报表服务器并注册。
8.在设计器中调试报表,确定成功后发布报表。
继承BaseReportDataCommand实现报表复杂业务逻辑
BaseReportDataCommand基本编程模式
BaseReportDataCommand用于支持服务器端业务逻辑编程模型,该类即实现了对报表
数据逻辑的扩展又实现了向下的编程接口,任何复杂业务逻辑都必须继承该类。
1. BaseReportDataCommand编程接口说明
属性:
DefaultConnectString
QueryContext
说明
默认的数据库连接字符串
用于报表查询的上下文,运行环境中报表上下文将包
含UBF系统上下文。
Parameters
Groups
Orders
报表查询参数集合
分组查询参数集合
排序参数集合
反映客户端栏目的变化
Select
IDataReader ExecuteDataReader()
可覆盖方法:
执行业务逻辑返回数据集
2. BaseReportDataCommand生存周期
使用查询参数
查询参数从基类的Parameters属性中获取,查询参数只用于业务逻辑中的数据过滤操
作。类接口详细说明如下表:
类/接口 属性/方法
查询参数描述
参数名称
条件表达式:如果关联了报表参数:则按SQL条件
语法返回当前条件项的条件表达式:如cDepCode
=’01’
DataType
Operator
参数类型:字符、数值、日期、逻辑
如果关联了报表参数:则返回界面输入比较方式,
如>,=,<,<>,between等否则默认为等于
Values 返回参数值集合:如报表条件输入Between 10 to
20 则 Values{value[0]=10,value[2]
=20} ,如果输入值:in (10,20,30,40)则
Values{value[0]=10,value[1]=20,value[2]=30}
Value 返回参数值集合的第一个元素,按参数类型转型。
将所有查询参数的条件表达式用 and 组织成不带
Where子句的条件串
ToString(indexlist:int[]):string 组织条件串,只用IndexList中枚举的查询参数
说明
IQueryParameter/QueryParameter
Name
Expression
QueryParameterCollection
ToString():string
ToString(nameList:string[]):string 组织条件串,只用nameList中枚举的查询参数
使用分组参数
类/接口 属性/方法
分组参数项
分组字段或表达式
分组参数集合
按SQL语法返回不带Group by关键字的分组子
句
说明
IGroupParameter/GroupParameter
FieldExpression
GroupParameterCollection
ToString():string
使用排序参数
类名 属性/方法
排序参数项
说明
IOrderParameter/OrderParameter
FieldExpression 排序字段或表达式
Order True 升序,false降序
排序参数集合
按SQL语句返回不带Order by关键字的排序子句
OrderParameterCollection
ToString()
使用栏目参数
类名 属性/方法
栏目参数项
栏目字段
栏目参数集合
所有方法都继承自List
说明
ISelectParameter/SelectParameter
FieldName
SelectParameterCollection
使用上下文
类名
QueryContext
属性/方法 说明
上下文参数,用于传递运行环境中的参数,或其它需要
从客户段收集的参数,所有用于传递的对象都必须可序
列化。
Add()
GetValue()
SetValue()
Contains()
Clear()
Remove()
ToBase64String()
FromBase64String()
增加上下文
取得上下文
设置上下文
判断指定名称的上下文是否存在
清除所有的上下文
删除特定的上下文
说明
DataCommand 功能
DataCommand 是利用 报表服务传递过来的 报表参数,Selects,Groups ,Orders 等集合组织
一个取数的逻辑。过程如下图所示:
3 步:给DataCommand设置数据源
4步:给DataCommand设置报表参数。
5步:给DataCommand设置上下文,包括Selects ,Groups,Orders等。
6步:调用DataCommand
7步:返回DataCommand的执行结果 IdataReader。
absDataCommand 实现的是上图中的第6步:执行具体的DataCommand执行取数逻辑。
该抽象类继承了报表引擎的 BaseReportDataCommand ,对该基类进行了简单封装,
所有DataCommand都必须继承此类。如下图:
在该类中提供了3中返回DataReader的方法:
A 重写 ExeDataReader 方法
对于简单报表可以重写该方法,不需要创建临时表,直接返回结果IdataReader
B 重写public virtual DataTable ExecuteDataTable() 方法。
对于需要从 DataTable返回数据的报表可以重写 该方法。
对于A,B 两种方式都需要自己处理ShowMode=0时,返回空集的情况,一般可以给结果
Oql加一个 where 0=1 的限定条件。
C 实现 GetOqlString()中的 ProcessData() 方法就可以了,该方式总是需要一个结果临时
表,处理完后把最终的数据放入该临时表,这里代码生成时临时表名称是
ResultTempTable 。
DataCommand 主要属性,方法说明
1 ShowMode 参数说明:
ShowMode=0:表示返回空的临时表,在报表第一次展现或者报表业务处理逻辑出现错误
时,返回空的临时表。
ShowMode=1 ,执行正常的报表逻辑,该常数在AbsReportDataCommand的已经做过处理。
2 EntityViewQuery : viewQuery
该对象主要用来执行Oql返回数据,创建临时表
注意: 利用该对象执行Oql时,需要使用一个数据库连接,该连接的状态有基类
BaseReportDataCommand来维护,在报表子类中不要处理,在整个报表业务逻辑处理要确保
使用一个EntityViewQuery,不要使用 New EntityViewQuery 来创建。
3 在DataCommand中 报表服务给报表传过来几个集合:
关于查询参数,分组参数,排序参数,上下文的说明,参见:上面介绍
Paramsters ,Selects ,Groups ,Orders ,QueryContext
Paramsters :中包含了报表UI给DataComand的传过来的查询条件,其中包含两部分:
控制参数 ControlParams
它主要是用来控制报表的格式,以及哪些条件,哪些栏目需要处理。一般不是作为报表的查
询条件使用的(每个控制参数都需要特殊处理)
查询参数: 这是直接作为报表查询条件的,其中大部分条件可以直接使用,但是有小部分
需要经过特殊处理后才能使用。(这是报表条件处理比较麻烦的一部分。)
GroupParameterCollection Groups
OrderParameterCollection Orders
SelectParameterCollection Select
Select:用户选择栏目
Groups : 包含行分组,列分组
Orders: 包含了哪些列需要进行排序,这个在DataCommand基类里已经做过处理。
4 List
AllSelectFieldList : 包含了全部用户可以选择的列,一般情况Select 集合中只有用户选择
的少量的列,而 AllSelectFieldList是全部列,应为DataCommand返回列总是固定的,所
有只有Select集合中的列才需要取数,而其它列则取Null就可以了。
5 public override IDataReader ExecuteDataReader()
ReportService 调用DataCommand只需要返回一个dataReader ,该方法已经在基类里做了默
认实现,在具体的DataCommand中就不需要实现了。在该方法中调用了报表取数的3中方
式。
A 该方法用于简单的报表,不需要创建临时表的情况
public virtual IDataReader ExeDataReader()
{
return null;
} //end ExecuteDataReader
B //该方法用于 返回DataTable的情况。
public virtual DataTable ExecuteDataTable()
{
return null;
} //
C protected internal abstract string GetOqlString();
代码生成时生成了GetOqlString()方法
该方法需要每个DataCommand中都去实现具体的逻辑,要根据设计文档去写。
public virtual string GetResultOql(string tableName, string showMode)
该方法是构造一个最终结果的Oql:从结果临时表上取数。
ShowMode=0 时:返回空的结果临时表
Select * from TempTable where 0=1
ShowMode=1 时返回正常的结果。
6 其它集合
FilterDefines FilterDefines
该集合是报表参数集合
FieldCollection FieldCollection
该集合是结果字段集合
List
该集合是DataCommand导入时,生成DataTable列的集合,如果该集合为空,则使用
DataCommand返回的所有列。
以上3个集合是在代码生成时自动生成。并且在Extend文件中留有手工添加子项的方
法块。
DataSource基类的说明
属性:
_util
说明
用于拼装结果Oql语句的工具类
方法:
Selection
Conditions
Groups
Orders
AddSelect(exp : string) : void
AddCondition(p:IQueryParameter)
AddGroup(exp : string) : void
Select 字段集合类
Condition 集合类
分组集合类
排序集合类
为结果Oql添加select 子项
为结果Oql添加条件 子项
为结果Oql添加分组 子项
为结果Oql添加排序 子项
返回_util工具类拼装好的Oql
用于给数据源手工指定连接(该方法
已经废弃)
AddOrder(exp : string, isAsc : bool)
GetOqlString() : String
SetCustomerJoinInfo(List
RemoveSelect(aliasName:string)
RemoveCondition(aliasName:string)
RemoveGroup(aliasName:string)
RemoveOrder(aliasName:string)
删除栏目
删除条件
删除分组
删除排序
说明: 该类主要是为DataCommand提供拼装Oql的功能 ,简化其复杂度。所有数据源都
必须继承该类.
AddSelect ,AddCondition,AddGroup,AddOrder方法都提供了多个重载.
工作原理:
实体别名Map: 主要是给实体定义别名影射,方便使用
("INVTotalCostLine" , "UFIDA::U9::InvTrans::MonthClose::INVTotalCostLine");
("ItemCategoryCross" , "UFIDA::U9::CBO::SCM::Item::ItemCategoryCross");
字段别名Map :定义字段别名影射
(INVTotalCostLine_SOB , "");
(INVTotalCostLine_CostField , "eld");
定义了实体Map,字段Map后 ,你可以使用 DataSourde提供的
AddSelect ,AddCondition ,AddGroup ,AddHaving,AddOrder 等方法来提供Oql元素,最后调
用 GetOqlString()来返回最终的Oql。
以上几个方法都提供了多种重载方法,请自己选择使用。
注意: 当你需要使用 Select Top 5 或者 Select distinct 的语句时 ,你需要先调用一下
SetSelectKey(”select top 5 “),这样在 返回Oql时 会加上该语句。
SetCustomerJoinInfo(CustomerJoin) 该方法主要是用在 设置两个没有直接关联关系的两个
实体建立连接的一种方式。
例如:
tomerJoinInfo(new
CustomerJoinInfo("fo
"", in));
调用该方法使 物料信息上的物料和物料交叉表通过物料的ID和物料交叉表的物料建立关
联。你就可以使用物料交叉表的数据了。
说明: 该方法(SetCustomerJoinInfo)将要废弃 ,因为它始终要把指定的两个表进行连接,
不管是否选取了 第二个实体的字段 ,这样会有效率问题。
现在推荐使用 如下方式 :
在 DataSource 中重写
GetCustomJoinMap() 方法
public override IDictionary
GetCustomJoinMap()
{
CustomerJoinInfo test1 = new
CustomerJoinInfo("fo
D", "", in);
IDictionary CustomerJoinInfo>(); CustomerJoinInfo test2 = new CustomerJoinInfo("o TYPE>.EntityID", "", in); //ionString = + "=1"; ("UFIDA::U9::CBO::SCM::Item::ItemCategoryCross", test1); ("UFIDA::U9::Lot::LotMaster", test2); return dic; } 这样在 只有在Oql中使用了 物料分类,批号中的属性时才会关联该表。 工具类的说明 方法:(静态方法) String GetSql(string oql) String GetSql(string oql,EntityViewQuery q) 将Oql翻译成Sql后返回 将Oql翻译成Sql后返回(用于带有临时表的 语句 方法:(静态方法) CreateTempTableByOql AppendNonQueryForTempTable 通过Oql创建临时表 将新的Oql返回的数据附加到指定的临时表中 GetTempTableDataSet(tempTable,strOql,q) 通过Oql创建临时表,并将表中的数据作为DataSet 返回。 GetTempTableDataSet(strOql,q) 通过Oql返回DataSet,q 用来读取临时表的数据 注意: q 必须和创建临时表的q 是同一个. ExecuteDataReader(oql, viewQuery: EntityViewQuery) ExecuteScalar(oql, viewQuery: EntityViewQuery) 执行Oql返回结果集的第一行,第一列的值 执行Oql从临时表中返回DataReader 方法:(静态方法) inCludeSingleComma) GetInString(DataSet ds,string 返回由 DataSet中某列构造的 In字符串 GetInString(List columnName, bool inCludeSingleComma) 代码结构说明 关于DataCommand中的元素国际化问题: 定义一个资源管理类如下: Public Class ResManager { Public static Test { Get { Return “Test”; } } } Oql使用说明 实体和数据库表的对应关系 实体属性有以下几种情况: A 普通类型 实体中的简单属性直接对应表中的字段(名称一致,类型一致) B 通用实体 实体中的通用实体属性对应表中的两个字段: 类型名称_EntityID(long),属性类型名称 _EntityType(varchar(100)) 关于通用实体实体类型如何取:(对于通用实体只有EntityID,EntityType ) 它会在本表中生成两个字段: 属性名_EntityID,属性名_EntityType Oql:select ID , Type from UFIDA::U9::SD::SaleOrder::SOShipline Sql select A.[SOSourceEntityKey_EntityID], A.[SOSourceEntityKey_EntityType] from SD_SOShipline as A C 属性类型 实体中的一个属性类型对应表中的n个字段,格式:属性类型名称_属性类型下的属性名(类 型一致) (有几个属性就会在表中产生几个字段,如果该字段是国际化字段,该字段会产生在对应的 国际化表中, 取这种字段时会关联国际化表) 关于属性类型的取值方式(不能直接使用属性类型,只能使用它下面的字段) 例子: Oql: select , from UFIDA::U9::SD::SaleOrder::SOShipline Sql: select A.[ShipmentPlanQtyTradeUOM_Amount], A2.[Name] from SD_SOShipline as A left join [Base_UOM] as A1 on (A.[ShipmentPlanQtyTradeUOM_UOM] = A1.[ID]) left join [Base_UOM_Trl] as A2 on (lag = 'zh-CN') and (A1.[ID] = A2.[ID]) 这个通过本表中的 ShipmentPlanQtyTradeUOM_UOM 再和UOM([Base_UOM])关联, 因为Name是国际化字段,所以要和[Base_UOM_Trl] 关联. // ProvideSupplier 是属性类型 Oql: select erName from UFIDA::U9::SD::SaleOrder::SOShipline Sql: select A1.[ProvideSupplier_SupplierName] from SD_SOShipline as A left join [SD_SOShipline_Trl] as A1 on (lag = 'zh-CN') and (A.[ID] = A1.[ID]) 因为ProvideSupplier 是属性类型 所以erName 在本表(SD_SOShipline) 中会有ProvideSupplier_SupplierName 又因为ProvideSupplier_SupplierName 是国际化字段, 所以要在SD_SOShipline 对应的国际化表中找。 D 实体类型 实体中的实体类型在本表中只保留一个Long型的字段(名称和属性名称一致) 当需要取该字段下的其他属性时(如:Name ) ,此时会产生和该实体的关联来取该实体的字 段. 如果它的字段是国际化字段还需要 关联它自己的国际化表. 产生表关联的情况:(默认为left jion 可以指定right join ,inner join ) A.B.C 产生A和B的关联, A.B (B 为实体字段此时B对应是一个Long型的字段)此时不产 生表的关联, 只有A.B.C 时才产生A和B的关联, 如果C是国际化字段还要关联B对应的国际化表.A.B B 为A中的国际化字段需要和A对 应的国际化表进行关联 E 枚举类型 枚举类型属性直接对应表中的字段( 0,1… ,value) 实际使用时 需要通过一个自定义函数 来取它的显示名称(text) 处理枚举值原则: 在取数过程中都使用 ( 0,1… ,value) value值,最后在 结果临时表中 使 用Update语句修改成 它的国际化名称(显示名称) 自定义函数的说明 1 数据库的标准函数可以直接使用 Oql : select count(), from UFIDA::U9::SD::SaleOrder::SOShipline Sql: select count(A.[ShipmentPlanQtyTradeUOM_Amount]), A.[ShipmentPlanQtyTradeUOM_UOM] from SD_SOShipline as A 2 参见:在OQL中使用SQL Server内置函数 3 自定义函数的使用(这部分可以共享) 自定义函数在中注册后就可以象Sql标准函数一样使用. 注意: 文件放在 测试项目的Dubug目录下 注册格式如下: 关于报表中使用存储过程的说明 报表中一般不使用存储过程,但是如果自定义 函数无法实现时也可以使用存储过程 临时表的使用说明(临时表是基于数据库连接的) 注意: 临时表是基于数据库连接的,数据库连接断了,临时表就消亡了。 所以:临时表操作的过程中必须使用同一个EntityView 1 基本操作 定义临时表结构 2 往临时表中附加(Append)数据(要求:类型,字段个数必须一致) 数据来源可以是实体,也可以是临时表 注意: 测试两个临时表Append操作,字段个数一致,对应数据类型一致,但是名称可以不同 合并后的字段名以第一个表为准. (这里一定要注意,可能引起数据错误) 3 修改临时表(udate ,delete ) Oql=”update temptable set field1=’xx’, field2= 1” eTempCollection(oql, null); 4 Union ,Union All 操作 5 case when 使用 6 临时表的关联 (需要手工指定连接类型和ON条件)) A 实体表和临时表的关联 注意: 实体必须写在前面,如果 需要临时表在前面 可以使用right join 否则 会抛未将对象引用设置到对象的实例。 B 临时表和临时表的关联 临时表的连接操作必须使用别名 如: aaa , bbb 都是先创建的临时表 select from aaa as a left join bbb as b on = 可以 select from aaa as a left join bbb on = 不可以 使用表关联时 最好不要用 a.* 的操作 否则可能抛异常 (前一个版本可以) 如 : select a.* from aaa as a left join bbb as b on = 不可以 ,抛下面的异常 "select ,b." Normal syntax error during parsing 临时表操作常见问题 : 1 更新临时表 的语句不能 使用 from 子句. 如: update aaa set Name='kkk' from aaa as a left join bbb as b on = 2 不能在 from 子句中 使用 Union (all) 如: select * from (select * from aaa union select * from bbb) as A 示例 参见OqlTest项目 报表DataCommand开发过程说明 报表DataCommnd开发过程分为下面 4步: 1 仔细阅读报表设计文档和需求文档 ,找出 本报表需要从哪个实体取数,需要这些实体的 哪些字段, 其中哪些字段用于select项 ,条件项 ,分组项,排序项。方便后面生成代码时使用。 并理解 该报表的具体业务逻辑。 2 使用代码生成工具来生成本报表的框架代码,具体过程请参见 6.2.7 代码生成工具介绍 3 代码生成完成后,打开 该项目 在新加的DataCommand类中的 GetOqlString() 方法中 添加必要的业务处理逻辑,以完善报表功能。 4 在测试项目对应的测试文件中填写测试代码 ,然后对该DataCommand进行 详细测试。 代码生成工具使用介绍 报表开发工具 选择报表报表代码生成向导,弹出 解决方案对话框 1. 服务组名称: 请在列表中选择一个服务组,该服务组名称决定了项目的名称。 如:选了Base : 则项目名称是: mmand. 如果以前生成过该项目,再次选择时会列出该项目的 生成路径,DataCommand模型,现有 项等信息。 并会把本次生成的 DataCommand,DataSource ,DataCommandTest 等文件加入到当前选中的 项目中。 2 生成路径: 生成的报表项目的存放路径。 3 DataCommand模型: 如果选择了DataCommand模型,就会把您上一次选择的信息,显示出来,您可以在该基础 上进行修改。 4 现有项: 现有项中列出了 该项目中已经存在的DataCommand和DataSoruce的名称 如果只想生成DataCommand . 选择 只生成 DataCommand 复选框,点击下一步就会直接跳 到 DataCommandInfo对话框 选择一个数据源,然后填写 DataCommand名称,控制参数后,点击确定即可。 点击下一步 弹出 选择字段信息对话框 点击 选择字段 按钮 ,弹出 选择实体信息对话框。 在 实体名称中输入要查询的实体,点击 查询按钮 ,列表中出现 你选择的 实 体信息。 在DataGrid中双击你要使用的实体,在下面的属性DataGrid中,就会列出该实体的全部属性。 注意: 实体全名是 实体导向的全称 如: Address下的Contact 实体名称 是: Contact 实体全名是: t 如下图: 注意: 粗体部分表示可以双击,进入该实体或者属性类型来选择它下面的字段属性。 选择实体字段的规则: 基本属性:作为当前实体的一个字段。 实体属性:自动选择实体的ID,Code,Name(没有就不取) 属性类型:自动取属性类型下的所有属性,如果该属性又是实体则取该实体的Code,Name 属性 模式匹配: 在模式匹配文本框中输入模式字符串,点击匹配,在属性DataGrid中就会列出匹配的字段 信息 点击显示全部属性,就会显示出该实体的全部属性。 选中DataGrid的多行后,在 DataGrid的“选中”列头上右击鼠标,回弹出 选中,取消菜 单,进行多选操作。 返回按钮: 从子实体中导航到主实体 如: rise 点击返回时: 直接显示 Address的属性 返回上级: 从子实体导航到上一级实体。 如: rise 点击返回时: 直接显示 Contact的属性 在所有的字段都选择完成后,点击确定按钮,你刚才选择的所有属性就出现在选择字段对话 框中的DataGrid中了。如下图: 报表参数 : 表示该字段是否作为报表参数。 结果栏目: 表示是否作为结果列。 缺省列: 如果选了该复选框,则在生成默认的报表模板时自动生成该字段。 是否排序:表示该字段是否可以作为排序项。 是否可选:表示该字段是否是固定栏目 是否行组:表示该字段是否时行分组 是否列组:表示该字段是否是列分组 操作提示: 1 在DataGrid的行上双击会弹出选择实体属性对话框,并在实体属性DataGrid中列出 实体全称的末级实体的所有属性。(双击当前行进入末级实体选择界面) 2 先选择DataGrid 的多行,在 每一个带CheckBox的列上点击右键可以对选择的多行 进行多选操作 3 删除多行: 选择DataGrid的多行,直接按键盘上的Delete键,弹出是否删除的确认框,选择是就 会删除所选的行。 点击下一步 弹出 DataCommand信息对话框。 在该对话框中输入 DataCommand ,DataSource 名称 ,如果该DataCommand有控制参数 , 则在控制参数DataGrid中添加 控制参数 添加控制参数的名称,标签,是否多值(表示该控制参数从UI过来是一个值还是多个值),类 型。选择完成后, 注意: 对于多值的参数,类型现在只能选择字符串类型,选择了其它类型也不起作用。 点击下一步 弹出信息确认对话框。 在该对话框中如果你选择了只生成 DataSoruce复选框 ,则将只生成DataSource . 在信息确认界面,如果你确认前面的选择无误后, 选中保存DataCommand模型,可以在下面的文本框中指定DataCommand模型的名称,如 果不指定 则默认为 DataCommandName+ DataSurceName+ “” 点击完成。稍等片刻 ,代码生成完成。 如果你选择了代码生成完成后自动打开 本项目复选框 ,将自动打开该项目。 打开该解决方案,把ReportTest做为 启动项目,并在 ReprotTestbinDebug 下 找到 修改数据库连接串后,就可以直接运行了。 插入临时表定义 打开 查询报表开发工具 ,选择报表插入临时表定义,弹出插入临时表定义对话框 在该对话框中输入你要建表的Oql语句,然后点击分析按钮,在下面的DataGird中 就会出现 Oql语句中的 所有字段,在最后一列中选择该字段 的数据类型。在 临时表名文本框中输入你要创建的临 时表的名称。在插入 文件文本框中输入要插入哪个DataCommand 。最后点击插入 按钮 临时表定义的函数代码 块就会插入到 DataCommand的临时表定义区域。 注意: 插入结果临时表时 ,结果临时表的名称必须是 ResultTempTable ,在前面生成 DataCommand时 已经自动生成了结果临时表的定义 ,此时应该取相同的名称来替换以前的定义。 其它临时表无此约束。 Oql测试工具 在上面的对话框输入 Oql语句,点击Oql解析按钮,下面的对话框中就会显示出翻译后的 Sql语句。 点击执行Sql按钮来检查翻译后的 Sql是否能正确执行。 返回字段按钮是用来返回 翻译后的Sql中有多少个字段。 查看类信息 kxl/ClassView/ 获取参照信息 查询开发框架 概述 BE查询方式的执行过程 根据BE实体的元数据来生成默认的CaseModel 用户在查询方案画面中,调整条件、栏目、排序 使用BEQueryStrategyImpl将CaseModel转化成UIView 调用平台的UIView机制生成并执行OQL,将返回的结果放入UIView中,然后绑 定到UIGrid 上 DTO查询方式的执行过程 根据所设计的DTO的元数据来生成默认的CaseModel 用户在查询方案画面中,调整条件、栏目、排序 使用DTOQueryStrategyImpl获得CaseModel转化成QryCommonParaObj,并传入到 查询BP中执行 查询BP根据QryCommonParaObj来实现具体的查询逻辑,并将结果返回并填充 UIView中,然后绑定到UIGrid 上 BE方式与DTO方式的比较 复杂度 逻辑简单 BE方式 DTO方式 逻辑复杂(多次查询、临时表) CaseModel根据BE元数据来生成CaseModel 根据DTO元数据来生成CaseModel 的生成方式 OQL 平台负责生成OQL 自己拼写OQL 实体间的关一个主实体,多个子实体,能使多个实体,之间为弱引用关系,不能通过 系 用A.B.C的oql语法 A.B.C的oql语句来查询,需要自己拼接oql 语句。或通过临时表来做二次查询。或使用 DataTable处理 BE方式查询的设计与开发 1.设计期—UI端 与列表UI开发的不同点:选择“查询模板”(没有删除和新增按钮),根据WebPart关 联方式来选择如何拖UIView中的字段(参见WebPart关联部分) 命名规范:与列表开发类似,但要将其中的BList变成BQry,一定要注意这点 UI端代码—Ation部分 //数据加载的扩展 private void OnLoadData_Extend(object sender, UIActionEventArgs e) { } //数据收集的扩展 private void OnDataCollect_Extend(object sender, UIActionEventArgs e) { Collect_DefaultImpl(sender,e);//应保留这行代码,否则会出现双击表格某一行后, //Data_DefaultImpl(sender,e); //应去掉这行代码 光标又回到第一行,且子WebPart不变化的缺陷。 } public void QueryAdjust() { IUFDataGrid UIGrid = ontrolByName(elContainer, "DataGrid1") as IUFDataGrid; BEQueryStrategyImpl beQryStrategyImpl = new BEQueryStrategyImpl(tState, EntityFullName, QryModelID, ine, UIGrid,1); (); = aultOpath((bForm)(tPart)); //如果本Webpart是消费者,则需要处理传入的Webpart关联参数,可以参见下面的方式(这部分要根 据自己的情况编写): if (ters != null && > 0) { string sOPath = alOPath; foreach (IUIParameter paradata in ters) { if(lue!=null) sOPath = e(, ng()); } += " and " + sOPath;//将“查询方案中的条件”与“Webpart 关联的传入参数”合到一起 } //处理排序 y = erByOpath((BaseWebForm)(tPart)); //增加代码,调整UIView (); age(null); if ( == 0) { ndowStatus(ecordSucessInfo()); } else { ndowStatus(dSucessInfo()); } } public void InitCaseModel() { IUFDataGrid UIGrid = ontrolByName(elContainer, "DataGrid1") as IUFDataGrid; BEQueryStrategyImpl beQryStrategyImpl = new BEQueryStrategyImpl(tState, EntityFullName, QryModelID, ine, UIGrid,1); //增加代码,调整BE元数据加载方式 CaseModel caseModel = Model(); //增加代码,调整CaseModel eModelToSession((BaseWebForm)(tPart), caseModel); } UI端代码—WebPart部分 public void AfterOnLoad() { } public void AfterCreateChildControls() { ndView(id1, ); //该代码解决了,在消费者画面中“当双击主webpart表格中的行后,子webpart中表格数据不刷新” 的问题。 Mode = ; //iding = true;//如果在Webpart关联中,本WebPart是提供者,则需要加入这段话 //绑定BE方式的分页事件 tance().AttachMakePageEvent(, id1); } public void BeforeUIModelBinding() { if (InitCaseModel(id1)) { seModel(); } //与列表中的代码不同,需要删除原来的代码 if (Adjust(id1)) { djust(); } else { dWidthToCase(tState, FormID, id1); } } public void AfterUIModelBinding() { um("DDLCase", this, elID); //加入调整UIGrid的代码 } UI端代码—BE正拖模型方式下的Action部分 以往做列表时,都是倒拖,即在UIView中拖子,从子找到主。 还有一种是正拖方式,即从主找到子,即生成CaseModel时,要加载集合特性的子。这需 要在InitCaseModel添加代码,如下颜色标记: public void InitCaseModel() { ession((BaseWebForm)(tPart)); IUFDataGrid UIGrid = ontrolByName(elContainer, "DataGrid1") as IUFDataGrid; BEQueryStrategyImpl beQryStrategyImpl = new BEQueryStrategyImpl(tState, EntityFullName, QryModelID, ew, UIGrid, 2); CollectionAttrs = true; … … 采用正拖模型,转成oql语句执行后,得到的结果是一个主对应多个子的形式,如下: ID(主ID) 1 1 2 2 主表中的字段 … … … … 子ID 3001 3002 4001 5001 子表中的字段 … … … … 。。。 如果是这种样式的记录,在添充到中时,平台对于重复ID的记录,只取第 一条记录。如下: ID(主ID) 主表中的字段 子ID 子表中的字段 。。。 1 2 … … 3001 4001 … … 因此,如果想要展现第一种样式的数据,必须对ID字段做一些处理,即生成一个顺序号来 代替主ID字段。这需要在QueryAdjust中改变UIView中UIField,代码如下: public void QueryAdjust() { IUFDataGrid UIGrid = ontrolByName(elContainer, "DataGrid1") as IUFDataGrid; BEQueryStrategyImpl beQryStrategyImpl = new BEQueryStrategyImpl(tState, EntityFullName, QryModelID, lSupply, UIGrid, 2); (); = aultOpath((BaseWebForm)(tPart)); y = erByOpath((BaseWebForm)(tPart)); //将原来的“ID”变成“顺序号row_number”,注意大小写(oql中的关键字应该全是小写的) IUIField uiField = ["ID"]; uteName = "row_number() over(order by ID asc)"; if (["PID"] == null) { //新增一个PID来存放“主表ID”-----------------------↓ID的别名------------↓字段类型 -----------------------↓原字段名 IUIField fieldParentID = new UIField(ew, "PID", e("64"), true, "0", "PID", "ID", false, true, false, "", false); (fieldParentID); } ieldIndexes();//调整UIView中UIField结构后,必须重建其字段索引 ["PayrollSupply"].Clear(); age(null); if ( == 0) { ndowStatus(ecordSucessInfo()); } else { ndowStatus(dSucessInfo()); } } 该段代码的CC路径:odePayrollSupplyUI DTO方式查询的设计与开发 DTO方式查询分为五个环节:设计期(UI端、DTO、BP端),代码(UI、BP) 设计期—UI端 与列表UI开发的不同点:选择“查询模板”(没有删除和新增按钮),根据WebPart关 联方式来选择如何拖UIView中的字段(参见WebPart关联文档) 命名规范:与列表开发类似,但要将其中的BList变成BQry,一定要注意这点 设计期—DTO设计 在本方案中用DTO来定义查询的待选项集合,并且该DTO必须作为查询BP的返回值 (IList 数据类型限制 一般来说,DTO中的每一个属性就对应一个待选项,作为约定,其数据类型必须是原 生类型、强类型的实体Key类型、枚举类型。下图的System下的前面若干项是可选的。xml、 对象类型、空类型、实体key类型是不可选的。 所谓的强类型实体key的定义应如下图: 先选上一个实体,然后在实体key选项框中打上勾。 作为约定,强类型的实体Key属性不作为待选项,但可以作为条件及排序待选项,并且不 能展开下级。 查询DTO设计中的注意事项: 必须有ID字段 如果返回的记录中ID列有重复, Grid会中会只显示一行记录。对于这种情况, 可以将row_number()做为ID列。(可参考《查询列表常见问题及解决办法》中的 “正拖模型”部分) 属性的名称用于拼OQL时Seclect子句的别名,同时也会对应UIView的UIField 名称及Grid的列名。(理解这点很重要) 选择合理的字段类型 根据业务需求,设计合理的查询属性(条件待选、栏目待选、排序待选、默认栏目) 每次调整DTO后,要注意重新构造并执行相应的sql脚本(发布元数据) 设计期—BP设计 入口参数 所有查询BP的入口参数的类型都必须是查询公共部份提供的DTO(查询BP通用入参DTO)。 此DTO中包含有已选栏目、过滤、排序等信息,BP开发人员可根据这些参数,构造符合业 务的OQL语句。定义方式如下图: 返回值 所有查询BP都必须以描述待选项集合的DTO集合为BP的返回值 应用版型 为了让查询BP在构造时产生骨架代码,在BP设计器中要选中该BP,点右键,点菜单[应 用版型],在树中选上“查询BP版型”,如下图: 步骤一: 步骤二: 在版型树上选中[查询BP版型]。 BP端代码示例 在设计BP时,给BP加上版型[查询BP版型],在构造时便会生成查询BP的骨架代码, 查询BP的开发人员,只需要在适当的位置按业务逻辑写上相应的代码即可。骨架代码分为 两个Partial类。其中第一部份只有一个Do方法,在Do方法中BP实现者要调用第二部份 的私有方法DoProcess方法,并将BP的参数作为方法的参数。如下: internal partial class SOShiplineSumBQueryBPImpementStrategy : BaseStrategy { public SOShiplineSumBQueryBPImpementStrategy() { } public override object Do(object obj) { SOShiplineSumBQueryBP bpObj = (SOShiplineSumBQueryBP)obj; return DoProcess(arameter);//BP实现者要加上这句话 } } private object DoProcess(monParaObj bpParameter) { inateService ps = new inateService pParameter, isNeedTempTable()); if (essBusiness) { string oql = DoLogic(bpParameter); return taByPage(GetEntityFullName(), oqlBuildByTempTable(), oql); } else { return taByPage(); } } internal partial class SOLineSumBQueryBPImpementStrategy { //主实体FullName private string GetEntityFullName() { return ""; } /// /// 分页内部是否需要使用临时表机制,对于数据量比较小的查询,没有必要采用临时表 /// 缓存第一次查询的结果,每次重查就行了,否则第一次查询时页面加载会慢些。由BP /// 开发人员自己判断。 /// /// private bool isNeedTempTable() { return true; }//end isTempTable /// /// 是否基于临时表构造的OQL,对于基于临时表的查询,分页服务内部不需要多语的处理; /// 基于业务表的查询,则需要。此处由BP开发人员根据实际情况返回正确的值。 /// /// private bool oqlBuildByTempTable() { return false; }//end isNeedMultiLang /// /// 执行业务逻辑,返回OQL串,由BP开发人员添加代码。 /// 参数bpParameter中带有已选栏目、过滤及排序信息 /// /// private string DoLogic(monParaObj bpParameter) { } //根据业务逻辑,返回OQL串 代码的第二部份中DoProcess方法,由前面的partial类中的Do方法调用。不需要BP开发 人员作任何处理。 需要BP开发人员作处理的是以下几个方法: 方法名称 GetEntityFullName isNeedTempTable 用途 主实体FullName,对于基于临时表的OQL则为临时表表名。 分页内部是否需要使用临时表机制,对于数据量比较小的查询,没有必要采用临时 表缓存第一次查询的结果,每次重查就行了,否则第一次查询时页面加载会慢些。 由BP开发人员自己判断。 oqlBuildByTempTable 是否基于临时表构造的OQL,对于基于临时表的查询,分页服务内部不需要多语的处 理;基于业务表的查询,则需要。此处由BP开发人员根据实际情况返回正确的值。 DoLogic 执行业务逻辑,返回OQL串,由BP开发人员添加代码。 参数bpParameter中带有已选栏目、过滤及排序信息。 辅助工具 如果所设计的查询DTO中的属性来源于多个实体,字段多,实体间关系复杂,则可以 使用SimpleOqlTool来拼接OQL语句。SimpleOqlTool的使用方法与报表DataCommand中 的DS设计相同。这里可以借用报表开发工具中的DataCommand代码生成工具,便捷的处 理DTO属性名称和实体字段的对应关系。比如,由辅助工具生成的代码片断如下: /// /// /// /// /// 销售订单计划行.交期 DateTime public readonly static string SOShipline_RequireDate = "SOShipline_RequireDate"; /// 销售订单计划行.数量2 Decimal public readonly static string SOShipline_ShipPlanQtyTBU = "SOShipline_ShipPlanQtyTBU"; // 销售订单计划行.交期 DateTime (SOShipline_RequireDate, "eDate"); // 销售订单计划行.数量2 Decimal (SOShipline_ShipPlanQtyTBU, "anQtyTBU"); 其中, SOShipline_RequireDate和SOShipline_ShipPlanQtyTBU就是我们在DTO定义的属性名称 eDate与anQtyTBU就是实体的字段 那么,最后通过工具拼接成OQL语句会是这样的: Select eDate as SOShipline_RequireDate, anQtyTBU as SOShipline_ShipPlanQtyTBU,… from UFIDA::U9::SM::SO::SOShipline as SOShipline 这样就建立起了DTO属性名称与实体字段的对应关系,并且通过这个辅助工具生成代 码,能极小减轻我们的工作量。再次强调,DTO设计期的字段名称要与辅助工具中定义的 别名一致。 在UBF中打开一个报表,然后选择“报表—DataCommand工具集 —DataCommand代码生成” 弹出“解决方案对话框” 1. 服务组名称:由于我们只是借用这个报表工具生成代码,所以服务组名可以随意选一个。 2 生成路径:生成的报表项目的存放路径。 3 DataCommand模型:对于查询开发,不需要选择该项 点击“下一步”弹出 选择字段信息对话框 点击“选择字段”按钮 ,弹出 选择实体信息对话框。 在实体名称中输入要查询的实体,点击“查询按钮”,列表中出现你选择的实 体信息。 在DataGrid中双击你要使用的实体,在下面的属性DataGrid中,就会列出该实体的全部属性。 在实体名称中,输入所需的,如Person,则会将与实体名称中包含Person的都列出来。 然后双击一个指定的实体,则会显示出该实体的全部字段。 这里面关键的一点是:要仔细写出各个字段的别名,这个别名要与DTO设计中的字段名一 致。(这点一定要注意) 如下图: