一、引言
STARLIMS IDE:
Applications中的Form类型:
此处仅记录HTML form的编写笔记。
【注意】:
每一个展示页在STARLIMS中都是一个FORM;
使用toolbox设计HTML form:
toolbox里面是form的各种控件。
二、STARLIMS中的HTML控件简介
每个控件包含:
• Properties • Events • Methods【备注】: 可以将每个控件,当做一个封装了特定功能和属性的class。 【注意】: 首字母都是大写的!!!
当鼠标选中html form中的某个具体的控件时,控件的properties会在右下角显示:
1、properties
属性的类别包括影响标识、外观、布局、行为和数据绑定的属性。2、event
事件触发器和处理可以在属性窗口中定义。 双击就定义了一个新的事件处理程序,代码会自动生成。 【示例】:双击Button控件的onclick事件 会后台code中自动生成一个function框架 【备注】: 1、事件处理程序是javaScript函数,会在事件发生时,自动执行。 2、如果想看整个form中的代码,可以在form design层右击,选择code view测试应用程序:
编辑完代码后,要先保存,再点击运行按钮。若是不保存,最新的更新将不会奏效。
html form会在浏览器中启动。
三、版本控制
form和脚本script的控制:
- check in
- check out
1、check out:签出
新建的form和脚本,默认是check out;
必须签出现有的表单或脚本以进行编辑,防止冲突。
2、check in:签入
编辑好的form和脚本,需要check in,让其他用户可见,否则运行时,更新将不生效。
【备注】:
版本控制可以查看历史记录。
四、事件处理程序介绍
事件处理程序是javaScript函数,会在事件发生时,自动执行。
4-1、常用的控件事件
1、DataGrid
OnRowChange():
当光标从一行移动到另一行时触发;OnUpdatingCell():
当一个单元格被更新时被触发;2、Form
OnLoad():
浏览器解析完页面之后就会自动触发的事件,即,打开form的时候会执行。Onclose():
当form即将被关闭的时候触发。3、ComboBox,ListBox
OnSelectionChange():
在进行选择时被触发。4、TabControl
OnTabChange()
在选中一个tabPage时触发。5、button
onclick():
当按钮被点击的时候触发。
4-2、事件处理程序中可以处理什么逻辑
1、form.ShowModalDialog()
打开一个新的html form,可以实现form之间参数的传递。
form.ShowModalDialog(lims.GetFormSource("窗口路径"),[参数集合]);
【示例】:
var sValue = await form.ShowModalDialog(lims.GetFormSource("ReportsApprovalNew.AddPatientRecord"),[sSampleNo,sFolderNo,sPid,sMetadataGuid]);
弹出窗口,窗口路径使用lims.GetFormSource("form路径"),调用其他窗体。
【备注】:
后跳出的窗体中可以用form.formArguments[序号]获取前一个窗体的传值。
2、lims.CallServer()
同步调用Server Scripts脚本。【备注】: lims.CallServerAsync(); 异步调用Server Scripts脚本(async是立即返回的)。
lims.CallServer("server script脚本路径",[方法参数集合]);
【示例】:
var aRetVal = lims.CallServer("ReportsApprovalNew.CreateMetadata", [sFolderNo]);
【备注】:
server script中通过:PARAMETERS关键字获取传参。
五、相对布局
Form, Group Box, Panel, Split Container Panel,有一些属性用于调整网页上的自己的布局和子控件的布局。
5-1、Layout 布局
控制父容器内的控件的安排。有3种方法:
- ABSOLUTE (default);
- VBOX;
- HBOX ;
ABSOLUTE (default):
控件展示就是手动放置的地方,所见即所得:
HBOX :
控制件按添加到容器的顺序水平排列(并排)side-by-side
VBOX:
控件按它们被添加到容器中的顺序垂直排列。
【注意】:
Layout布局,除了ABSOLUTE选项,其余的VBOX和HBOX选项,都是针对控件插入的顺序布局的。
5-2、Align布局
用于控制父容器中包含的子项的对齐方式。
- BEGIN (default);
- MIDDLE
- END
- STRETCH
- STRETCHMAX(分布在上边,但是,所有控件取最大控件的高度/宽度)
【注意】:
Align布局和Layout布局要放在一起才能生效!!!
Layout=HBOX+Align:垂直方向
此时Align调节的是垂直方向的布局 (上、中、下)
Layout=VBOX+Align: 水平方向
此时Align调节的是水平方向的布局 (左、中、右)
5-3、pack布局
控制子项如何在容器中打包在一起。它可以通过三种方式来实现。
- START (default);
- END;
- CENTER
【注意】:
pack布局和Layout布局要放在一起才能生效!!!
Layout=HBOX+pack:水平对齐
Layout=VBOX+pack:垂直对齐
5-4、Padding布局
设置要应用于父容器中的所有子项的填充。控制控件之间的间距(像素)。
【注意】: 1、Padding布局和Layout布局要放在一起才能生效!!! 2、若是Padding设置的是30px,则控件的上、下、左、右都是30px。
Layout=HBOX+Padding:
Layout=VBOX+Padding:
5-5、Stretch布局
指定最后一个子控件是否会延伸,以使其占用父容器中的所有剩余空间。
- False (default)
- True
【注意】:
Stretch布局和Layout布局+pack布局(默认是start)一起用,拉伸控制取决于包装。
LayOut=HBOX+Stretch
LayOut=VBOX+Stretch
六、控件布局:anchor和dock
anchor和dock是控件的两个公用的布局属性:
- anchor:锚定,将空间固定于某个位置;
- Dock:将控件停靠在一侧或中央
【注意】:
1、两个属性不同时设置!!!没有意义!
2、都是将控件连接到他们父窗体的某个位置。
3、此时将Layout设置为abstract,否则可能不生效。
不设置anchor和dock的时候,控件位置是固定的,不会随着窗口大小自适应!!!
不设置anchor和dock的时候
1、anchor布局
黑色表示选中,如图例,始终保持本控件和其所直属父控件的右侧及上侧距离不变,因此窗口大小改变的时候,控件会移动位置,保持距离窗口的右侧和上侧的距离会不变。
由于例中设定上、下、左、右距离都保持不变,因此当窗口大小改变,控件的大小也会随之改变,以保证其对窗口的上、下、左、右距离都保持不变。
2、dock布局
【注意】:
会自适应!!!最终的停靠效果取决于控件添加的顺序!
3、第五节的布局VS第六节的布局
第五节说的相对布局,控制的是控件和自己的子控件直接的布局;
第六节说的布局,控制的是控件和自己的直接父控件之间的布局。
七、常见的选择框控件(selectBox)
- ComboBox
- ListBox
- CheckedListBox
- MultiChoice
1、静态数据集合
2、动态数据绑定
data source:
八、常用的控件说明
8-1、TEXTBOX文本框控件
常用于,单行输入模式:可以水平拉伸变宽,不能垂直拉伸变高。
1、常用属性:
font-字体
emptyText:文本框空白时的提示文字,鼠标点击,文字消失。
2、常用杂项:
Password:true输入时展示星号保密;
Readonly:true只读,不可以输入;
OnKeyPress:快捷键的设置。
3、示例:
两个文本框内的数字相加
async function btAdd_OnClick( sender, eventArgs )
{
alert(txtA + txtB);
}
async function btAdd_OnClick( sender, eventArgs )
{
// String 装 int类型
var num1 = parseInt(txtA.Text);
// String 装 int类型
var num2 = Int32.Parse(txtB.Text);
var res = num1 + num2;
alert(res);
}
8-2、checkBox复选框控件
【备注】:
一般和label控件一起用。
1、相关属性:
Text:文本显示
Checked:(true/false)是否被选中
2、相关事件:
onCheckedChange:选中状态发生变化,可以是用户点击,也可以是代码的修改,如:
checkBox1.Checked = true;
3、示例
用复选框控制textBox的密码属性
8-3、radioButton单选按钮控件
【注意】:
一个窗体上,如果不对RadioButton控件进行分组,那么无论有多少个单选按钮,我们都只能选择一个。若我们需要有多组的单选按钮,就需要用到分组控件GroupBox或者Panel控件了
1、示例:
点击按钮,获取选中的单选按钮的值。
async function btRadioBt_OnClick( sender, eventArgs )
{
var radios = gbRadioBt.All(SL.RadioButton);
for(var i = 0; i < radios.Count; i++){
if(radios[i].Checked){
alert(radios[i].Text);
}
}
}
【注意】:
GroupBox(控件组)控件一般是作为其他控件的组的容器的形式存在的,这样有利于用户识别,使界面变得更加友好。
当移动单个GroupBox控件时,它所包含的所有控件也将一起移动。
8-4、TreeView控件
1、静态集合
2、相关属性:
CheckBoxes属性,控制node前面是否有复选框。
async function treeView1_OnAfterCheck( sender, eventArgs )
{
var node = eventArgs["node"];
if(node.Checked){
if(node.Text == "DDL"){
alert("DDL choose!!!");
}else{
alert(" not DDL choose!!!");
}
}
}
3、动态数据绑定
【示例】:
data source:
select
FOLDERNO as name,
FOLDERNO as text,
FOLDERNO as value,
'' as parent
from FOLDERS
where FOLDERNO = 'X00023738'
or FOLDERNO = 'X00023737'
union
select
ORDNO as name,
ORDNO as text,
ORDNO as value,
FOLDERNO as parent
from ORDERS
where FOLDERNO = 'X00023738'
or FOLDERNO = 'X00023737'
结果展示:
8-5、datagrid表格控件
1、使用data属性,添加数据源(推荐)
data source:
:DECLARE sqlStr;
sqlStr := "select ORIGREC, name, sex, comments from WSTEST where 1=1";
:RETURN GetDataSet(sqlStr);
右击,选择root table designer,设置显示的列和列名
【注意】:
此时打开root table designer,data source中的表名和列名已存在!
2、使用代码添加数据源
datagridID.Data = lims.GetDataSource("data source路径");
var dgWsTestTable = form.All( "dgWsTestTable" ); // DataGrid
async function Form1_OnLoad( sender, eventArgs )
{
dgWsTestTable.Data = lims.GetDataSource("WsTest.ListWsTestTable");
}
右击,选择root table designer,添加root table和列
【注意】:
此时打开root table designer,是空白的,要自己新增表和列,名字要和data source中的表名和列名一样!!!
3、常用的属性:
SelectionMode:multiple,允许按住shift健多选
filterRowVisible:ture,允许每一列有查询功能
GroupbyBoxVisible:true,允许表可以分组。
单元格可以使其他控件类型,默认是文本框
4、示例
【示例1】 :改变datagrid中某一列的单元格类型
【注意】:
datagrid的update功能是自动实现的。不需要额外写代码。
【示例2】:添加搜索功能
js代码:
async function btNameSearch_OnClick( sender, eventArgs )
{
var nameSearch = tbNameSearch.Text + "%";
dgWsTestTable.Data = lims.GetDataSource("WsTest.ListWsTestTable",[nameSearch]);
}
data source代码:
:PARAMETERS name := "";
:DECLARE sqlStr, StrWhr;
StrWhr := "1=1";
:IF .NOT. empty(name);
StrWhr := StrWhr + " and name like '" + name + "%'";
:ENDIF;
sqlStr := "select ORIGREC, name, sex, comments from WSTEST where " + StrWhr;
usrmes(sqlStr);
:RETURN GetDataSet(sqlStr);
【示例3】:展示datagrid中每一行数据的详情
js代码:
// 默认显示首行,选中行数改变,改事件便会被触发
async function dgWsTestTable_OnRowChange( sender, eventArgs )
{
var currentRowData = dgWsTestTable.GetCurrentDataRow();
txtName.Text = currentRowData[1];
txtSex.Text = currentRowData[2];
txtComm.Text = currentRowData[3];
}
【示例4】:使用代码给datagrid添加行列值
async function btFill_OnClick( sender, eventArgs )
{
var dt = new System.Data.DataTable();
// 列的id
dt.Columns.Add("namekey");
dt.Columns.Add("namevalue");
dt.Rows.Add("Marian", "Veteanu");
dt.Rows.Add("Claudiu", "Codreanu");
var ds = new System.Data.DataSet();
ds.Tables.Add(dt);
dGrid.DataSet = ds;
}
【注意】:
1、datagrid要先和数据库中的表绑定,否则只能新增行,不能新增行内的数据,而且,因为datagrid更新事件是自动的,所以,不和数据库中的表绑定的话,新增行后,自动更新时会报错!!!
2、列中的caption属性要有值,否则列表头不展示!!!
3、datagrid <—— dataset <—— dataTable(添加:行,列)
4、如果用户更新了数据网格中的任何数据,并且没有保存这些更改,那么所有未保存的数据都将在数据单元格中显示为红色标志。
九、控件属性的调整
2种方式调整控件属性:
- 使用“设计器”的“属性”面板;
- 代码调整
1、使用“设计器”的“属性”面板
2、代码调整
【示例】:通过点击第二个按钮控制第一个按钮的是否可以点击的属性
async function btnDisplayBtn_OnClick( sender, eventArgs )
{
if(btnDisplayBtn.Text.StartsWith("D")){
btnSaveUser.Enabled = false;
btnDisplayBtn.Text = "enable button";
}else{
btnSaveUser.Enabled = true;
btnDisplayBtn.Text = "Display button";
}
}
十、数据绑定
【示例】:listBox的数据绑定,使其展示的数据动态来源于数据库
1、使用“设计器”的属性面板
data属性:
在data source中定义,表名应该获取哪些数据。
【注意】:
要定义成SQL类型,不要定义成STARLIMS类型。
displayMember属性:
从获取的数据中,应该显示哪些数据,例如显示哪个列。
2、代码调整
async function Form1_OnLoad( sender, eventArgs )
{
var folderno ="T00015304";
comboBox.Data = lims.GetDataSource ("WsTest.ComBoxData", [folderno]);
}
WsTest.ComBoxData:
:PARAMETERS folderNumber := 'T00015302';
select ORDNO from ORDERS where FOLDERNO LIKE @folderNumber
【示例】:使用按钮,修改multiChoice控件的item的值
async function btClear_OnClick( sender, eventArgs )
{
multiChoice.Items.Clear();
alert("clear all ok");
}
async function btAddItem_OnClick( sender, eventArgs )
{
// 第一个参数是value,第二个参数是显示值
multiChoice.Items.Add("1","AAA");
multiChoice.Items.Add("2","BBB");
multiChoice.Items.Add("3","CCC");
}
async function btChange_OnClick( sender, eventArgs )
{
multiChoice.DataBindingBehavior = "replace";
multiChoice.DisplayMember = "FOLDERNO";
multiChoice.ValueMember = "ORDNO";
multiChoice.Data = lims.GetDataSource("WsTest.ComBoxData");
}
WsTest.ComBoxData:
select top 10 ORDNO, FOLDERNO from ORDERS
十一、同步函数和异步函数
1、同步函数:
两个同步任务必须相互感知,并且一个任务必须以某种依赖于另一个任务的方式执行,例如:等待另一个任务的执行结果。
function doSomething( param1, param2 )
{
}
2、异步函数
不必等待另一个函数的操作完成才能完成其他任务。意味着该函数的执行不会阻塞后面代码的执行。
async function Form1_OnLoad( sender, eventArgs )
{
}
【注意】:
关键字async。
async——异步
async就是用来声明一个异步方法,作为一个关键字放在函数前面,表示该函数是一个异步函数。await = async wait
await是用来等待异步方法执行。因此async/await的作用就是将异步逻辑,转化为同步的顺序来书写。
十二、表单Form与业务逻辑(script脚本)进行沟通
- lims.CallSever()
- lims.CallServerAsync()
1、lims.CallSever()
调用Server Scripts脚本(同步)
调用脚本并等待服务器完成请求,然后再执行其他代码。
lims.CallServer("server script脚本路径",[方法参数集合]);
示例:
async function btAdd_OnClick( sender, eventArgs )
{
// String 装 int类型
var num1 = parseInt(txtA.Text);
// String 装 int类型
var num2 = Int32.Parse(txtB.Text);
var res = num1 + num2;
alert(res);
}
async function btRemoteAdd_OnClick( sender, eventArgs )
{
var num1 = parseInt(txtA.Text);
var num2 = Int32.Parse(txtB.Text);
var sum = lims.CallServer("ZZZ.WSTEST001", [num1, num2]);
alert(sum);
}
2、lims.CallServerAsync()
异步调用Server Scripts脚本(async是立即返回的)
调用该脚本,而不等待服务器完成该请求。
lims.CallServerAsync("脚本路径",[方法参数集合]);
【注意】:
使用await调用lims.CallServerAsync()函数,就是同步执行了!!!
示例:
async function btnLong_OnClick( sender, eventArgs )
{
var a = parseInt(txtA.Text);
var b = Int32.Parse(txtB.Text);
try {
// 同步执行
// var result = lims.CallServerAsync("ZZZ.LongResponse",[a,b]);
var result = await lims.CallServerAsync("ZZZ.LongResponse",[a,b]);
alert("I got the result from the long script and it is " + result.toString());
}
catch(error) {
alert("The long Script generated an exception and the detail is " + error);
}
finally {
alert("This is the finally");
}
}
ZZZ.LongResponse(SSL)代码:
:PARAMETERS a,b;
:DEFAULT a, 5;
:DEFAULT b, 7;
:DECLARE number, startTime, endTime;
number := 0;
startTime := Now();
usrmes("startTime:Hour: ", startTime:Hour);
usrmes("startTime:Minute ", startTime:Minute);
usrmes("startTime:Second ", startTime:Second);
:WHILE (number +=1) < 1000;
usrmes(" " + str(number) + " ");
:ENDWHILE;
endTime := Now();
usrmes("endTime:Hour: ", endTime:Hour);
usrmes("endTime:Minute ", endTime:Minute);
usrmes("endTime:Second ", endTime:Second);
:RETURN a+b;
吐槽一下:
SSL处理while循环的10000条打印输出,要四十几秒,而java只要几十毫秒,1s不到。
十三、弹出窗口
两种打开弹出窗口的方式:
- form.ShowModalDialog(lims.GetFormSource("form路径"), [参数1, 参数2]);
- form.ShowModelessDialog(lims.GetFormSource("form路径"), [参数1, 参数2]);
1、form.ShowModalDialog(lims.GetFormSource("form路径"), [参数1, 参数2]);
模态形式已经抓住了用户的焦点,直到被驳回。
示例:
async function btShowModalDialog_OnClick( sender, eventArgs )
{
form.ShowModalDialog(lims.GetFormSource("SampleReception.frmLocationManagement_Covid"));
}
2、form.ShowModelessDialog(lims.GetFormSource("form路径"), [参数1, 参数2]);
Modeless允许您返回到调用表单。
示例:
async function btShowModelessDialog_OnClick( sender, eventArgs )
{
form.ShowModelessDialog(lims.GetFormSource("SampleReception.frmLocationManagement_Covid"));
}
【注意】:
弹窗右上角的×,是默认自动回带的。可以点击关闭弹窗。
3、弹窗之间的传值:
- form.formArguments();
- form.returnValue();
3-1、 form.formArguments();
当弹出窗口打开时,打开窗口传入的参数可以通过表单的这个属性作为数组访问。
async function btShowModalDialog_OnClick( sender, eventArgs )
{
alert(txtFirst.Text);
var augments = [txtFirst.Text, "999"];
// 弹窗传值,用数组形式!!!
var returnValue = await form.ShowModalDialog(lims.GetFormSource("WsTest.popupForm2"), augments);
// 获取弹出窗口的返回值。
if(returnValue != null){
txtFirst.Text = returnValue[1];
}else{
txtFirst.Text = "ppp";
}
}
打开的弹窗:
async function Form1_OnLoad( sender, eventArgs )
{
if(form.formArguments != null){
var ds0 = form.formArguments[0];
txtFirst.Text = ds0;
}else{
txtFirst.Text = "222";
}
}
async function btClose_OnClick( sender, eventArgs )
{
// 返回值
form.returnValue = [txtSecond.Text, txtFirst.Text];
form.Close();
}
3-2、 form.formArguments();
任何需要传递回ShowModalDialog()的数据都可以作为数组加载到表单的这个属性中,并在表单关闭时传递。
示例:
form1:
async function btEdit_OnClick( sender, eventArgs )
{
var initialData = [lblFname.Text, lblLname.Text, lblEmail.Text];
// alert(initialData);
var editData = await form.ShowModelessDialog(lims.GetFormSource("WsTest.editPersion"), initialData);
FillControll(editData);
}
function FillControll(data)
{
if(data != null){
lblFname.Text = data[0];
lblLname.Text = data[1];
lblEmail.Text = data[2];
}
}
async function btClose_OnClick( sender, eventArgs )
{
await form.Close();
}
edit form2:
async function Form1_OnLoad( sender, eventArgs )
{
// 获取form1的传值
var persionData = form.formArguments;
if(persionData != null){
txtFName.Text = persionData[0];
txtLname.Text = persionData[1];
txtEmail.Text = persionData[2];
}
}
async function btOk_OnClick( sender, eventArgs )
{
// 将值返回给form1
form.returnValue = [txtFName.Text, txtLname.Text, txtEmail.Text];
form.Close();
}
3-3、form.ExecFunction(“FunctionName”, [parameters]);
当function定义在另一个form中时,从当前form以外调用函数。
示例:以上示例,改成在edit form2中点击apply按钮,调用form1中的FillControll()函数,以实现在form2中修改的textbox中的值能回传到form1中
form1:
async function btEdit_OnClick( sender, eventArgs )
{
var initialData = [lblFname.Text, lblLname.Text, lblEmail.Text];
// alert(initialData);
var editData = await form.ShowModelessDialog(lims.GetFormSource("WsTest.editPersion"), initialData);
// FillControll(editData);
}
function FillControll(data)
{
if(data != null){
lblFname.Text = data[0];
lblLname.Text = data[1];
lblEmail.Text = data[2];
}
}
async function btClose_OnClick( sender, eventArgs )
{
await form.Close();
}
edit form2:
async function Form1_OnLoad( sender, eventArgs )
{
var persionData = form.formArguments;
if(persionData != null){
txtFName.Text = persionData[0];
txtLname.Text = persionData[1];
txtEmail.Text = persionData[2];
}
}
async function btOk_OnClick( sender, eventArgs )
{
form.returnValue = [txtFName.Text, txtLname.Text, txtEmail.Text];
form.Close();
}
async function btApply_OnClick( sender, eventArgs )
{
var openForm = form.opener;
// 调用form1中的函数
openForm.ExecFunction("FillControll", [GetEditValues()]);
}
function GetEditValues(){
return [txtFName.Text, txtLname.Text, txtEmail.Text];
}
十四、Forms 和 Navigator变量
在一个form中的object之间的传值,或者,不同form之间的传值,可是使用如下变量:- form变量:
只要form open,变量值就一直存在。
- Navigator变量:
只要浏览器打开,变量值就一直存在。
1、form变量:
范围:form。
存值:
form.Variables["company"] = "STARLIMS Corp.";
取值:
alert(form.Variables["company"]);
2、navigator变量:
范围:浏览器。
存值:
navigator.Variables["city"] = "Hollywood, FL.";
取值:
alert(navigator.Variables["city"]);
3、应用:
【示例1】:在当前同一个form中不同的scripts之间交换数据。
【示例2】:可以在navigator变量中存放任意类型,甚至是一个form引用。
form1:
async function btOpen_OnClick( sender, eventArgs )
{
// form.ShowModelessDialog(lims.GetFormSource("WsTest.wsPopupTest"), null, "BorderStyle=FixedToolWindow");
form.ShowModelessDialog(lims.GetFormSource("WsTest.wsPopupTest"));
}
async function bt_close_OnClick( sender, eventArgs )
{
var frmpop = navigator.Variables["formPop"];
if(frmpop != null){
navigator.Variables.Remove("formPop");
frmpop.Close();
}else{
alert("111");
}
}
form2:
async function Form1_OnLoad( sender, eventArgs )
{
// 放了当前的form
navigator.Variables.Set("formPop", form);
}
十五、HTML公共对话框
类型:
- MessageBox
- InputBox
- MultiChoiceDialog
- CheckListBoxDialog
- OpenFileDialog
- ColorDialog
1、MessageBox
Dialogs.MessageBox(message, caption, buttons, icon);
【示例】:
async function btMessageBox_OnClick( sender, eventArgs )
{
var res1 = Dialogs.MessageBox(form.Resources["hello1"]);
var res2 = Dialogs.MessageBox(form.Resources["hello2"], form.Resources["welcome"]);
var res3 = Dialogs.MessageBox(form.Resources["saveFailed"], form.Resources["warning"], "AbortRetryIgnore");
var res3 = Dialogs.MessageBox(form.Resources["saveFailed"], form.Resources["star"], "AbortRetryIgnore", "Warning");
}
2、InputBox
Dialogs.InputBox(message, caption, buttons, icon); 【示例】:async function btInputBox_OnClick( sender, eventArgs )
{
var s1 = Dialogs.InputBox("John Doe", form.Resources["entryName"]);
var s2 = Dialogs.InputBox("John Doe", form.Resources["entryName"], form.Resources["editPers"]);
var s3 = Dialogs.InputBox("John Doe", form.Resources["entryName"],form.Resources["editPers"], lims.GetDataSource("QUICKINTRO.GETNAMES"));
alert(form.Resources["inputMes"]+s1+form.Resources["mes2"]+s2+form.Resources["mes3"]+s3);
}
3、MultiChoiceDialog
async function btMultiChoiceDialog_OnClick( sender, eventArgs )
{
var data = lims.GetDataSource("QUICKINTRO.GETNAMES");
var arr1 = Dialogs.ShowMultiChoiceDialog("please select users", "team members", data);
// 初始就已选中两项
var arr2 = Dialogs.ShowMultiChoiceDialog("please select users", "team members", data, ["John Doe", "Fred Pelish"]);
//先alert,再展示MultiChoiceDialog
alert("your selection:\n Dialog 1: " + arr1 + "\n Dialog 2: " + arr2);
}
4、CheckListBoxDialog
async function btCheckListBoxDialog_OnClick( sender, eventArgs )
{
var data = lims.GetDataSource("QUICKINTRO.GETNAMES");
var arr1 = await Dialogs.ShowCheckListBoxDialog("please select users", "team members", data);
var arr2 = await Dialogs.ShowCheckListBoxDialog("please select users", "team members", data, ["John Doe", "Fred Pelish"]);
alert("your selection:\n Dialog 1: " + arr1 + "\n Dialog 2: " + arr2);
}
5、OpenFileDialog
打开文件窗口
【示例】:
async function btOpenFileDialog_OnClick( sender, eventArgs )
{
var file = await Dialogs.ShowOpenFileDialog();
alert("select files:" + file);
}
6、ColorDialog
颜色弹窗。
【示例】:
async function btColorDialog_OnClick( sender, eventArgs )
{
var color1 = await Dialogs.ShowColorDialog();
var color2 = await Dialogs.ShowColorDialog("#FF00FF");
alert(form.Resources["selectColors"] + color1 + form.Resources["selectColor2"] + color2);
}
十六:sender和eventArgs参数
窗体程序有很多的事件,比如按钮点击事件,双击事件,Form_Load事件,这些事件的实现里都有两个参数:一个是object类型的sender参数,另一个是派生自EventArgs类。
1、Sender参数
Sender参数指的是引发事件的对象。在事件处理程序中,我们经常需要知道是哪个对象引发了事件。通过sender参数,我们可以按需要访问该对象并执行相应的操作。
例如:button的点击事件,那么这个sender就代表这个button自己。
示例:点击左边的按钮,在右边的输入框中显示点击过的按钮的text。
function handlePhoneKey( sender){
// 使用sender参数,获取触发事件的对象
var key = sender.Text;
if((key != '#') && (key != '*') ){
txtPhoneNo.Text += key;
}
}
每一个按钮的onclick事件都添加这个函数。
2、eventArgs参数:
记录事件传递过来的额外信息。
一般用于传递用户点击的位置啊,键盘按下的键等事件的额外信息。
例如鼠标点击的位置、按下、释放等信息。
示例:
async function callBt_OnClick( sender, eventArgs )
{
var btn = sender.Text;
alert("You clicked button " + btn);
// 调用Form1_OnClose()函数
form.Close();
}
async function Form1_OnClose( sender, eventArgs )
{
var ret = await Dialogs.MessageBox(form.Resources["cancelo"], form.Resources["question"], "YesNoCancel", "Question");
eventArgs.Set("Cancel", ret != "Yes");
}
十七、Frame控件
在一个form中插入另一个form,使用frame控件
示例:
async function bt_frameShow_OnClick( sender, eventArgs )
{
// 有进度条可以拖动内容
//frameShow.ContentOverflow = "SCROLL";
// 没有进度条可以拖动内容
frameShow.ContentOverflow = "ANCHOR";
// 在frame中展示另一个form的页面
await frameShow.Navigate(lims.GetFormSource("SampleReception.frmLocationManagement_Covid"));
}
十八、动态的创建HTML控件
示例:点击一个按钮,动态创建另一个按钮。
async function button1b_OnClick( sender, eventArgs )
{
var btnDynamic = new Button();
btnDynamic.Id = "btnDynamic";
btnDynamic.Text = "dynamic button new";
btnDynamic.Left = 140;
btnDynamic.Top = 140;
btnDynamic.Width = 160;
btnDynamic.OnClick = "HandleBtnDynamic(sender, eventArgs)";
// 将控件添加到form中
form.Controls.Add(btnDynamic);
}
async function HandleBtnDynamic( sender, eventArgs )
{
await Dialogs.MessageBox(form.Resources["message"] + sender.Id);
}