可变编辑器
Grid默认在光标激活某一个单元格的时候会自动提供数据编辑器:
可以根据需要添加不同类型的编辑器:
- TextEditor
- TextArea
- CheckBox
- RadioGroup
添加的方法为在DataColumn下的editor节点下添加对应的编辑器:
以上场景是解决一个DataColumn具有一种编辑器类型的使用方式,这可以满足大多数的要求,但是在一些特殊的场景下,我们希望一个DataColumn列表下的编辑器类型可以根据当前行的数据特征而有所不同,如下图:
我们希望第1,2,3,4行中可变编辑器列的编辑器为TextEditor,而第5行的编辑器为CheckBox,第六行的编辑器类型为RadioGroup,第七行的编辑器类型为NumberSpinner等,对于这种需求我们下面来看如何在Grid中实现。
选择DataColumn的事件面板,可以看到一个叫onGetCellEditor的事件:
我们可以在该事件中实现自定义的编辑器的控制:
var editor = new dorado.widget.TextEditor(); arg.cellEditor.setEditorControl(editor);
如果要创建checkbox则可以通过如下代码实现:
var editor = new dorado.widget.CheckBox(); arg.cellEditor.setEditorControl(editor);
多种混合模式代码为:
var editor = null; var entity = arg.data; var editorType = entity.get("editorType"); if (editorType) { editor = eval("new dorado.widget." + editorType + "()"); if (editor instanceof dorado.widget.TextEditor) { if (param) { var trigger; if (param == "date") { trigger = "defaultDateDropDown"; } else if (param == "dateTime") { trigger = "defaultDateTimeDropDown"; } else { trigger = new dorado.widget.ListDropDown({ items : parseParam(param), property : "value" }); } editor.set("trigger", trigger); } } else if (editor instanceof dorado.widget.CheckBox) { editor.set("exClassName", "d-checkbox-center") } else if (editor instanceof dorado.widget.RadioGroup) { editor.set("layout", "flow"); if (param) { var radioButtons = []; parseParam(param).each(function(pair) { radioButtons.push({ value : pair.key, text : pair.value }); }); editor.set("radioButtons", radioButtons); } } } arg.cellEditor.setEditorControl(editor);
自定义渲染器
另外我们还可以自定义单元格的渲染器,默认情况下单元格的渲染器都是文本显示,但是我们也可以把Grid的渲染器做调整,以出现如下的效果:
当然实际使用中我们不一定要将单元格渲染为编辑器,也可以渲染为别的,例如图片超链接等,这些范例可以参考sample-center中自定义渲染的表格
本例渲染为编辑器的基本用法为:实现DataColumn的自定义的渲染器。
自定义渲染器需要继承ControlCellRenderer对象,如:
var CellRenderer = $extend(dorado.widget.grid.SubControlCellRenderer, { createSubControl : function(arg) { var editor = new dorado.widget.TextEditor(); return editor; } });
也可以创建别的控件,如创建Checkbox:
var CellRenderer = $extend(dorado.widget.grid.SubControlCellRenderer, { createSubControl : function(arg) { var editor = new dorado.widget.CheckBox(); return editor; } });
创建好新的CellRenderer之后,我们只需要将这个CellRenderer配置到对应的DataColumn中就可以:
datagrid.set("&myDataColumn.renderer", new CellRenderer());
其中myDataColumn是DataGrid中的一个DataColumn的名称。
另外为了实现数据绑定:当DataSet中的数据发生了变化(不一定是直接通过当前的Grid编辑触发的,有可能是表单中编辑,也有可能在一个按钮的单击事件中通过js代码修改了DataSet的内部数据),我们希望Grid中自定义的编辑器的内容可以自适应的发生变化,则我们还需要实现ControlCellRenderer的一个事件,如:
var CellRenderer = $extend(dorado.widget.grid.SubControlCellRenderer, { createSubControl : function(arg) { var editor = new dorado.widget.TextEditor(); return editor; }, refreshSubControl : function(editor, arg) { if (editor) editor.set("value", arg.data.get("myPropertyDef")); } }); datagrid.set("&myDataColumn.renderer", new CellRenderer());
其中refreshControl事件是由DataGrid主动触发的,当它感知到当前DataSet中的数据发生变化的时候就会自动触发refreshSubControl,并且其中的arg.data就代表了DataSet的当前实体对象。myPropertyDef为与myDataColumn对应的DataType中的某一个PropertyDef。
Attachments:
image2012-6-26 17:25:46.png (image/png)
image2012-6-26 17:28:27.png (image/png)
image2012-6-26 17:33:5.png (image/png)
image2012-6-26 17:49:55.png (image/png)
image2020-5-10 10:10:2.png (image/png)
image2020-5-10 10:10:43.png (image/png)
image2020-5-10 10:11:47.png (image/png)