概述
本示例主要来展示如何在客户端对DataTable的CSS进行更改。本示例链接如下:
准备工作
新建一工程tablecss,并且配置好数据库,具体步骤参考3.1.2节。
开发步骤
添加Dataset
步骤1:添加一Common ViewModel,文件名为TableCss。
步骤2:添加一CustomDataset,id设置为datasetCss。
为datasetCss添加6个字段,属性设置如下:
dataType | label | name | readOnly |
|---|---|---|---|
|
| index | true |
|
| id | true |
string | CSS名称 | key | true |
string | CSS标题 | label | true |
string | [在这里填入你自定义的css设定] | value |
|
| sample范例 | sample | true |
为datasetCss添加一Parameter,属性设置如下:
属性 | 值 |
|---|---|
dataType | string |
name | eventSet |
value | Table |
为datasetCss添加一Dataset Listener,代码如下:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.bstek.dorado.common.DoradoContext;
import com.bstek.dorado.common.HttpDoradoContext;
import com.bstek.dorado.common.Setting;
import com.bstek.dorado.data.AbstractDatasetListener;
import com.bstek.dorado.data.Dataset;
import com.bstek.dorado.data.Record;
import com.bstek.dorado.data.RecordIterator;
import com.bstek.dorado.utils.StringHelper;
/**
* Main_datasetCssListener
*/
public class CssListener extends AbstractDatasetListener {
private Map initStaticCSSMap() {
Map map = new HashMap();
String skin = Setting.getString("view.smartweb2.skin", "default");
HttpDoradoContext context = (HttpDoradoContext) DoradoContext
.getContext();
String contextPath = context.getRequest().getContextPath();
String SKIN_ROOT = contextPath
+ "/dorado/smartweb2.loadStyleSheet.d?skin=" + skin;
List list = null;
StringBuffer css = new StringBuffer("");
// 表格头
list = new ArrayList();
list.add(".DataTable .HeaderGrid");
list.add("表格头");
list.add(null); // value
css = new StringBuffer("");
css.append("color: #405368;\n");
css.append("border-width: 1;/*边框的宽度*/\n");
css.append("border-color: #C5D9E8;/*边框的颜色*/\n");
css
.append("border-style: solid;/*边框的风格,可选值有:none,dotted,dashed,solid,double,groove,ridge,inset,window-inset,outset*/\n");
css
.append("border-collapse: collapse;/*边框是否具有三维效果.可选择值有:separate,collapse*/\n");
css
.append("table-layout: fixed;/*表格的宽度是否根据内容自动适应,如果fixed则锁定宽度,可选值有auto,fixed*/");
list.add(css.toString());
map.put("HeaderGrid", list);
// 表格头激活单元格(鼠标的moveover事件)
list = new ArrayList();
list.add(".DataTable .HeaderGrid .HotCell");
list.add("表格头激活单元格(鼠标的moveover事件)");
list.add(null); // value
css = new StringBuffer("");
css.append("background-position-y: 100%;/*背景图片高度在单元框中的高度*/\n");
css.append("background-image: url(" + SKIN_ROOT
+ "/datatable_header_hot.gif);/*背景图片*/");
list.add(css.toString());
map.put("HeaderGrid.HotCell", list);
// 统计栏Grid
list = new ArrayList();
list.add(".DataTable .FooterGrid");
list.add("统计栏Grid");
list.add(null); // value
css = new StringBuffer("");
css.append("background-color: #E1EAF1;/*背景色*/\n");
css.append("border-width: 1;/*边框的宽度*/\n");
css.append("border-color: #C5D9E8;/*边框的颜色*/\n");
css
.append("border-style: solid;/*边框的风格,可选值有:none,dotted,dashed,solid,double,groove,ridge,inset,window-inset,outset*/\n");
css.append("border-collapse: collapse;/*可选择值有:separate,collapse*/\n");
css
.append("table-layout: fixed;/*表格的宽度是否根据内容自动适应,如果fixed则锁定宽度,可选值有auto,fixed*/");
list.add(css.toString());
map.put("FooterGrid", list);
// 锁定列所在的表格数据Grid
list = new ArrayList();
list.add(".DataTable .FixedDataGrid");
list.add("锁定列所在的表格数据Grid");
list.add(null); // value
css = new StringBuffer("");
css.append("background-color: #EDF2F6;/*背景色*/\n");
css.append("border-width: 1;/*边框的宽度*/\n");
css.append("border-color: #C5D9E8;/*边框的颜色*/\n");
css
.append("border-style: solid;/*边框的风格,可选值有:none,dotted,dashed,solid,double,groove,ridge,inset,window-inset,outset*/\n");
css.append("border-collapse: collapse;/*可选择值有:separate,collapse*/\n");
css
.append("table-layout: fixed;/*表格的宽度是否根据内容自动适应,如果fixed则锁定宽度,可选值有auto,fixed*/");
list.add(css.toString());
map.put("FixedDataGrid", list);
// 锁定列所在的表格数据Grid的行指示器
list = new ArrayList();
list.add(".DataTable .FixedDataGrid .Indicator");
list.add("锁定列表格的行指示器");
list.add(null); // value
css = new StringBuffer("");
css.append("background-color: #E6EDF2;/*背景色*/");
list.add(css.toString());
map.put("FixedDataGrid.Indicator", list);
// 锁定列所在的表格数据Grid的表格行
list = new ArrayList();
list.add(".DataTable .FixedDataGrid .Row");
list.add("锁定列表格行");
list.add(null); // value
list.add(null);
map.put("FixedDataGrid.Row", list);
// 锁定列所在的表格数据Grid的虚拟行
list = new ArrayList();
list.add(".DataTable .FixedDataGrid .MockRow");
list.add("锁定列表格虚拟行");
list.add(null); // value
css = new StringBuffer("");
css.append("background-color: #F0F0F0;/*背景色*/");
list.add(css.toString());
map.put("FixedDataGrid.MockRow", list);
// 锁定列所在的表格数据Grid的当前激活行
list = new ArrayList();
list.add(".DataTable .FixedDataGrid .CurrentRow");
list.add("锁定列表格当前激活行");
list.add(null); // value
css = new StringBuffer("");
css.append("background-color: #B7F39B;/*背景色*/");
list.add(css.toString());
map.put("FixedDataGrid.CurrentRow", list);
// 表格数据Grid
list = new ArrayList();
list.add(".DataTable .DataGrid");
list.add("表格数据Grid");
list.add(null); // value
css = new StringBuffer("");
css.append("background-color: #F5F7F9;/*背景色*/\n");
css.append("border-width: 1;/*边框的宽度*/\n");
css.append("border-color: #C5D9E8;/*边框的颜色*/\n");
css
.append("border-style: solid;/*边框的风格,可选值有:none,dotted,dashed,solid,double,groove,ridge,inset,window-inset,outset*/\n");
css.append("border-collapse: collapse;/*可选择值有:separate,collapse*/\n");
list.add(css.toString());
map.put("DataGrid", list);
// 表格行
list = new ArrayList();
list.add(".DataTable .DataGrid .Row");
list.add("表格行");
list.add(null); // value
list.add(null);
map.put("DataGrid.Row", list);
// 虚拟行
list = new ArrayList();
list.add(".DataTable .DataGrid .MockRow");
list.add("表格虚拟行");
list.add(null); // value
css = new StringBuffer("");
css.append(" background-color: #F0F0F0;/*背景色*/");
list.add(css.toString());
map.put("DataGrid.MockRow", list);
// 表格激活行
list = new ArrayList();
list.add(".DataTable .DataGrid .CurrentRow");
list.add("表格激活行");
list.add(null); // value
css = new StringBuffer("");
css.append(" background-color: #B7F39B;/*背景色*/");
list.add(css.toString());
map.put("DataGrid.CurrentRow", list);
return map;
}
public void afterLoadData(Dataset dataset) throws Exception {
String eventSet = dataset.parameters().getString("eventSet");
Map map = getSessionCSS(eventSet);
int index = 0;
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
String cssName = (String) iter.next();
List list = (List) map.get(cssName);
dataset.insertRecord();
dataset.setInt("index", ++index);
dataset.setString("id", cssName);
dataset.setString("key", (String) list.get(0));
dataset.setString("label", (String) list.get(1));
dataset.setString("value", (String) list.get(2));
dataset.setString("sample", (String) list.get(3));
}
}
public boolean beforeUpdateData(Dataset dataset) throws Exception {
String eventSet = dataset.parameters().getString("eventSet");
Map map = getSessionCSS(eventSet);
RecordIterator ri = dataset.recordIterator();
ri.setVisibility(Dataset.FILTER_CHANGED);
while (ri.hasNext()) {
Record record = ri.nextRecord();
String id = record.getString("id");
String value = record.getString("value");
List list = (List) map.get(id);
if (StringHelper.isNotEmpty(value)) {
list.set(2, value);
} else {
list.set(2, null);
}
}
DoradoContext context = DoradoContext.getContext();
if (map.size() > 0) {
context.setAttribute(DoradoContext.SESSION, eventSet + ".CSS", map);
}
return true;
}
private Map getSessionCSS(String eventSet) {
DoradoContext context = DoradoContext.getContext();
Object o = context.getAttribute(DoradoContext.SESSION, eventSet
+ ".CSS");
if (o != null && o instanceof Map) {
return (Map) o;
} else {
return initStaticCSSMap();
}
}
}
添加CSS编辑窗口部分
步骤1:添加一DataTable,属性设置如下:
属性 | 值 |
|---|---|
dataset | datasetCss |
height | 100% |
id | tableCss |
showHScrollBar | false |
showIndicator | false |
width | 100% |
选中tableCss,点击字段生成按钮,删除无用字段,最后只保留index和label字段。
为tableCss的label字段的onRefresh字段添加如下代码:
cell.innerHTML = record.getString("label") + "(" + record.getString("key")+")";
return false;
步骤2:添加一UpdateCommand,属性设置如下:
属性 | 值 |
|---|---|
alwaysPerform | true |
id | commandUpdateCss |
为commandUpdateCss的onSuccess事件添加如下代码:
open("data-table.jsp","cssView");
步骤3:添加一Button,属性设置如下:
属性 | 值 |
|---|---|
commond | commandUpdateCss |
id | buttonAppendCss |
value | 添加并预览 |
步骤4:添加一DataLabel,属性设置如下:
属性 | 值 |
|---|---|
dataset | datasetCss |
field | sample |
id | datalabelSample |
步骤5:添加一DataLabel,属性设置如下:
属性 | 值 |
|---|---|
dataset | datasetCss |
field | key |
id | datalabelKey |
步骤6:添加一SplitPanel,属性设置如下:
属性 | 值 |
|---|---|
id | splitpanel1 |
orientation | vertical |
步骤7:添加一AutoForm,属性设置如下:
属性 | 值 |
|---|---|
dataset | datasetCss |
id | formCss |
为datasetCss添加一Form Group,设置其columnCount为1。然后为datasetCss添加一TextEditor Element,属性设置如下:
属性 | 值 |
|---|---|
field | value |
name | value |
showLabel | false |
设置value节点下面的TextEditor的属性如下:
属性 | 值 |
|---|---|
editorType | textarea |
height | 100 |
添加一Custom Element,属性设置如下:
属性 | 值 |
|---|---|
controlAlign | right |
controlId | buttonAppendCss |
name | element1 |
showLabel | false |
添加预览窗口部分
步骤1:添加一Common ViewModel,文件名为DataTable。
步骤2:添加一Simple Class,类名为CssOutputter,代码如下:
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.bstek.dorado.common.DoradoContext;
import com.bstek.dorado.utils.StringHelper;
public class CssOutputter {
public static String getCssString(String eventSet) {
StringBuffer sb = new StringBuffer("");
DoradoContext context = DoradoContext.getContext();
Map map = (Map) context.getAttribute(DoradoContext.SESSION, eventSet
+ ".CSS");
if (map != null) {
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
String id = (String) iter.next();
List list = (List) map.get(id);
String key = (String) list.get(0);
String value = (String) list.get(2);
if (StringHelper.isNotEmpty(value)) {
sb.append(key + " {");
sb.append(value);
sb.append(" }");
}
}
}
String cssString = sb.toString();
return "<style>" + cssString + "</style>";
}
}
步骤3:添加一AutoSqlDataset,选中Employee表格,选择除了image中的所有字段。该AutoSqlDataset属性设置如下:
属性 | 值 |
|---|---|
autoLoadPage | true |
id | datasetEmployee |
originTable | EMPLOYEE |
pageSize | 15 |
步骤4:添加一DataTable,属性设置如下:
属性 | 值 |
|---|---|
dataset | datasetEmployee |
fixedColumn | 1 |
height | 100% |
id | tableEmployee |
showFooter | true |
width | 100% |
步骤5:添加一ListDropDown,属性设置如下:
属性 | 值 |
|---|---|
autoDropDown | true |
id | dropdownSex |
mapValue | true |
为dropdownSex添加两个DropDownItem。第一个DropDownItem的name设置为"男",value设置为true。第二个DropDownItem的name设置为"女",value设置为false。
设置datasetEmployee的sex字段的dropdown为dropdownSex。
创建Jsp页面
为TableCss生成Jsp并进行编辑,结果如下:
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %> <html> <head> <title>表格皮肤设置</title> </head> <body scroll="no" margin="0"> <d:View config="sample.skills.table.test.TableCss"> <d:SplitPanel id="sp1" orientation="horizontal" position="50%" width="100%" height="100%" showButtons="true"> <d:SubWindow id="subwindow1" title="CSS编辑窗口" width="100%" height="100%" draggable="false" resizable="false" status="normal" showMinimizeButton="false" showMaximizeButton="true" showCloseButton="false"> <d:SplitPanel id="sp2" orientation="vertical" position="60%" width="100%" height="100%" showButtons="true"> <d:DataTable id="tableCss"/> <d:Splitter/> <d:TabSet id="tabset1" currentTab="tab2"> <d:Tab name="tab1" label="自定义CSS"> <d:AutoForm id="formCss"/> </d:Tab> <d:Tab name="tab2" label="参考代码" padding="4"> <p class="hint" style="width: 100%; height: 100%"> <d:DataLabel id="datalabelSample"/> </p> </d:Tab> </d:TabSet> </d:SplitPanel> </d:SubWindow> <d:Splitter/> <d:SubWindow id="subwindow3" title="预览窗口" width="100%" height="100%" draggable="false" resizable="false" status="normal" showMinimizeButton="false" showMaximizeButton="true" showCloseButton="false"> <iframe name="cssView" src="data-table.jsp" frameborder="0" marginWidth="0" style="width:100%; height:100%"> </iframe> </d:SubWindow> </d:SplitPanel> </d:View> </body> </html>
为DataTable生成Jsp页面,并进行编辑,结果如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %>
<html>
<head>
<title></title>
</head>
<body style="margin: 0; overflow: hidden">
<d:View config="DataTable">
<%
out.println(CssOutputter.getCssString("Table"));
%>
<d:DataTable id="tableEmployee" />
</d:View>
</body>
</html>
查看运行效果
启动浏览器,并浏览talbe-css.jsp,效果如下:

可以在左侧对Css进行更新,在右侧看更改Css后的效果。
知识点
本示例知识点主要是DataTable的CSS设置,关于DataTable可以参考《dorado 5组件详解 v1.1》的第二部分的D部分的第一节。