概述
dorado中的日历组件经常用在日程管理的软件里面。本示例的链接如下:
准备工作
新建一工程calendar,并且配置好数据库,具体步骤参考3.1.2节。
开发步骤
添加Dataset
步骤1:添加一Common ViewModel,文件名Calendar。
步骤2:添加一AutoSqlDataset,选择schedule表,选择所有字段,AutoSqlDataset属性设置如下:
属性 | 值 |
|---|---|
id | datasetSchedule |
originTable | SCHEDULE |
keyFields | ID |
为datasetScedule添加两个BaseMatchRule,属性分别设置如下:
属性 | 值 |
|---|---|
level | 1 |
dataType | datetime |
value | :start_time |
escapeEnabled | false |
table | SCHEDULE |
originField | start_time |
operator | > |
属性 | 值 |
|---|---|
level | 1 |
dataType | datetime |
value | :end_time |
escapeEnabled | false |
table | SCHEDULE |
operator | < |
originField | start_time |
步骤3:为datasetScedule的"START_TIME"、"END_TIME"和"TASK"添加Required Validator。
步骤4:为datasetScedule的afterInsert事件添加如下代码:
var calendarDate = calendarSchedule.getDate();
if (calendarDate != null) {
var day = formatDate(calendarDate, "yyyy-MM-dd");
dataset.setValue("start_time", parseDate(day + " 08:00:00"));
dataset.setValue("end_time", parseDate(day + " 08:00:00"));
}
为datasetScedule的onFilterRecord事件添加如下代码:
var date = record.getValue("start_time");
var calendarDate = calendarSchedule.getDate();
if (date != null && calendarDate != null) {
return (date.getFullYear() == calendarDate.getFullYear() &&
date.getMonth() == calendarDate.getMonth() &&
date.getDate() == calendarDate.getDate());
}
else {
return true;
}
return true;
步骤5:设置datasetScedule的id字段的updatable为false。
添加SubWindow和ListDropDown
步骤1:添加一SubWindow,属性设置如下:
属性 | 值 |
|---|---|
id | subwindowTask |
status | hidden |
步骤2:为subwindow的afterHide事件添加如下代码:
if (datasetSchedule.getCurrent() != null) {
datasetSchedule.cancelRecord();
}
步骤3:添加一ListDropDown,id设置为dropdownTask,添加三个DropDownItem,value分别设置为:"开会"、"外出"、"约会"。
并且设置datasetSchedule的TASK字段的dropDown为dropdownTask。
添加DataTable和Button
步骤1:添加一DataTable,属性设置如下:
属性 | 值 |
|---|---|
id | tableSchedule |
dataset | datasetSchedule |
height | 100% |
width | 200 |
showHScrollBar | false |
showIndicator | false |
rowHeight | 50 |
步骤2:为tableSchedule其添加一字段,属性设置如下:
属性 | 值 |
|---|---|
name | description |
label | 任务描述 |
步骤3:为tableSchedule的onRecordDblClick方法写入如下代码:
buttonEdit.click();
步骤4:为tableSchedule的description字段的onRefresh事件添加如下代码:
var HTML = record.getString("task") + "<br>" +
formatDate(record.getValue("start_time"), "HH:mm") + " 至 " +
formatDate(record.getValue("end_time"), "HH:mm");
cell.innerHTML = HTML;
cell.title = record.getValue("cmnt");
return false;
步骤5:添加一Button,属性设置如下:
属性 | 值 |
|---|---|
id | buttonAdd |
value | 添加 |
为buttonAdd的onClick事件添加如下代码:
datasetSchedule.insertRecord(); subwindowTask.show(true, true);
步骤6:添加一Button,属性设置如下:
属性 | 值 |
|---|---|
id | buttonEdit |
value | 编辑 |
为buttonEdit的onClick事件添加如下代码:
subwindowTask.show(true, true);
步骤7:添加一Button,属性设置如下:
属性 | 值 |
|---|---|
id | buttonDelete |
value | 删除 |
为buttonDelete的onClick事件添加如下代码:
if (datasetSchedule.getCurrent() != null) {
datasetSchedule.deleteRecord();
commandSave.execute();
}
添加Calendar
步骤1:添加一Calendar,属性设置如下:
属性 | 值 |
|---|---|
id | calendarSchedule |
width | 100% |
height | 100% |
calendarType | schedule |
dataset | datasetSchedule |
field | start_time |
date | 2006-4-3 |
步骤2:为calendarSchedule的afterDateChange事件写入如下代码:
calendar.disableBinding(); datasetSchedule.refreshControls(); calendar.enableBinding(); buttonEdit.disabled = (datasetSchedule.getCurrent() == null); buttonDelete.disabled = buttonEdit.disabled;
步骤3:为calendarSchedule的beforeMonthChange事件写入如下代码:
var year = date.getFullYear();
var month = date.getMonth();
var startTime = new Date(year, month, 1);
var endTime = new Date(year, month + 1, 1);
var parameters = datasetSchedule.parameters();
parameters.setValue("start_time", startTime);
parameters.setValue("end_time", endTime);
datasetSchedule.flushData();
步骤4:为calendarSchedule的onContentRefresh事件写入如下代码:
var records = calendar.getRecords(date);
if (records.length > 0) {
cell.innerHTML = records.length + "项任务";
var tip = "";
for (var i = 0; i < records.length; i++) {
var record = records[i];
if (i > 0) tip += "\n";
tip += (i + 1) + ". " + record.getString("task");
cell.title = tip;
}
}
else {
cell.innerText = "";
cell.title = "";
}
cell.style.color = "navy";
添加AutoForm、UpdateCommand和Button
步骤1:添加一AutoForm,属性设置如下:
属性 | 值 |
|---|---|
id | formTask |
dataset | datasetSchedule |
选中formTask,点击字段生成按钮。
步骤2:添加一UpdateCommand,id设置为commandSave。
为commandSave添加一DatasetInfo,Dataset设置为datasetSchedule。
步骤3:添加一Button,属性设置如下:
属性 | 值 |
|---|---|
id | buttonOK |
value | 确定 |
为buttonOK的onClick事件添加如下代码:
if (datasetSchedule.postRecord()) {
commandSave.execute();
subwindowTask.hide();
}
步骤4:添加一Button,属性设置如下:
属性 | 值 |
|---|---|
id | buttonCancel |
value | 取消 |
为buttonCancel的onClick事件写入如下代码:
datasetSchedule.cancelRecord(); subwindowTask.hide();
生成Jsp页面
生成Jsp页面以后再编辑一下布局,最后结果如下:
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %> <html> <head> </head> <body style="margin: 2; overflow: hidden"> <d:View config="Calendar"> <d:Layout type="border"> <d:Pane position="center"> <d:Calendar id="calendarSchedule" /> </d:Pane> <d:Pane position="right" width="200"> <d:Layout type="vflow" height="100%"> <d:Pane align="right"> <d:Layout type="Hflow" padding="1"> <d:Pane> <d:Button id="buttonAdd" /> </d:Pane> <d:Pane> <d:Button id="buttonEdit" /> </d:Pane> <d:Pane> <d:Button id="buttonDelete" /> </d:Pane> </d:Layout> </d:Pane> <d:Pane height="100%"> <d:DataTable id="tableSchedule" /> </d:Pane> </d:Layout> </d:Pane> </d:Layout> <d:SubWindow id="subwindowTask" title="任务属性" width="350" height="260" draggable="true" resizable="true" showMinimizeButton="false" showMaximizeButton="false" showCloseButton="true"> <d:Layout type="border"> <d:Pane position="top"> <d:AutoForm id="formTask" /> </d:Pane> <d:Pane position="center" align="right"> <d:Layout type="Hflow"> <d:Pane> <d:Button id="buttonOK" /> </d:Pane> <d:Pane> <d:Button id="buttonCancel" /> </d:Pane> </d:Layout> </d:Pane> </d:Layout> </d:SubWindow> </d:View> </body> </html>
浏览Jsp页面
启动服务器后,浏览效果如下:

本示例实现了一个简单的日程管理。
知识点
本示例知识点为组件Calendar的使用。关于Calendar,可以参考《dorado 5组件详解 1.1》第二部分的E部分。