View Full Version : Laszlo company people don't read these forums
billjakarta
11-19-2006, 06:10 AM
I am beginning to think that either the Laszlo company people don't read these forums or they don't want a market acceptable product. I am seriously pissed off! Nobody answers questions pertaining to serious problems with using this product in enterprise applications. A serious business data grid should be able to switch its editability by a user activated button. It seems that some idiot made the gridtext component editability none-changeable at runtime. I have alse tried using the gridcolumn with edittext components beneath it. But then the row selection doesn't work. If there is a way of doing this it should be documented in a clear and understandable fashion. The various methods described on the forums do not work under 3.3.1. You are rapidly losing the serious part of your audience that wants to create serious business applications that look good. No one seems to want to answer questions about how to mmake this grid component workm the way business needs it to work. I need to have a switch that allows the selected row to be edited but no matter what I do some part of the desired functionality doesn't work. I need to edit the text of the selected row after a edit button is pushed. Can anybody help?
It is not the case that Laszlo core team do not visit this forum ..
but be aware that they tend to congregate more in the OpenLaszlo.org mailing lists (http://www.openlaszlo.org/lists).
Browse the archives of laszlo-dev (http://www.openlaszlo.org/pipermail/laszlo-dev) and laszlo-user (http://www.openlaszlo.org/pipermail/laszlo-user).
Historically, laszlosystems was the first forum, but when the decision was taken by Laszlo Systems to go open source the discussions migrated in part to openlaszlo.org site (which has now taken over the laszlosystems branded site).
The old forum format had a "thread accelerate" button if you were prepared to pay for receiving urgent advice. That has disappeared.
senshi
11-19-2006, 07:41 AM
Here is a modified version of gridtext.
<class name="mygridtext" extends="gridcolumn">
<!--- The datapath attribute for a grid text is used for the text that
is displayed in the rows. -->
<attribute name="datapath"
setter="this.setAttribute( 'rowdp', datapath )"/>
<!--- type of content's alignment. Default: left
possible values are: left, center, right -->
<attribute name="textalign" type="string" value="left"/>
<!--- @keywords private -->
<attribute name="rowdp" value="" type="string"/>
<!--- If set to false, the field will not be editable. -->
<attribute name="editable" value="true" type="boolean" setter="setEditable(editable)" />
<!--- @keywords private -->
<attribute name="_textcolor" value="null"/>
<!--- @keywords private -->
<attribute name="_texthilitecolor" value="null"/>
<!--- @keywords private -->
<attribute name="_textselectedcolor" value="null"/>
<!--- @keywords private -->
<attribute name="editDel" value="null" />
<!--- @keywords private -->
<method name="_inferSortpath">
return this.rowdp;
</method>
<method name="_applystyle" args="s">
super._applystyle( s );
this.setAttribute( '_textcolor' , s.textcolor );
this.setAttribute( '_texthilitecolor' , s.texthilitecolor );
this.setAttribute( '_textselectedcolor' , s.textselectedcolor );
</method>
<method name="setEditable" args="edt" >
this.editable = edt;
if ( this["oneditable"] ) oneditable.sendEvent( edt );
if ( !_initcomplete ) return;
if ( edt ){
this.editDel.enable();
} else {
this.editDel.disable();
}
</method>
<view height="24" clickable='${parent.editable}'
onmouseover="immediateparent.domouseover()"
onmouseout="immediateparent.domouseout()"
y="${immediateparent.height/2 - height/2}"
clip="true" >
<attribute name="editing" value="false"/>
<attribute name="focusable" value="${!editing &&
parent.editable}"/>
<method name="init">
this.parent.editDel = new LzDelegate( this, 'startEditing' );
this.parent.editDel.register( this , 'onmousedown' );
this.parent.editDel.register( this , 'onfocus' );
if ( !parent.editable ){
this.parent.editDel.disable();
}
super.init();
</method>
<method name="startEditing">
immediateparent.select();
this.setAttribute( 'editing' , true );
LzFocus.setFocus( editbox );
</method>
<text visible="${!parent.editing}" width="${parent.width}"
y="$once{ parent.height /2 - this.height/2}"
fgcolor="${ parent.immediateparent.selected ?
classroot._textselectedcolor:
(parent.immediateparent.highlighted ?
classroot._texthilitecolor:
classroot._textcolor)}"
datapath="$once{parent.parent.rowdp}">
<method event="oninit">
<![CDATA[
var f = function() {
this.setAttribute("x", this._calcX());
}
var d = [this, "width"];
this.applyConstraint("x", f, d);
]]>
</method>
<method event="ontext" args="val">
<![CDATA[
this.setAttribute("x", this._calcX());
]]>
</method>
<method name="_calcX">
<![CDATA[
if (classroot.textalign == "center"){
var x = ((this.width /2) - (this.getTextWidth() /2));
if (x < 0) x = 0;
return x;
}
else if (classroot.textalign == "right"){
var x = ((this.width) - (this.getTextWidth() + 10));
if (x < 0) x = 0;
return x;
}
else{
return 0;
}
]]>
</method>
</text>
<state pooling="true" apply="${parent.editing}"
onremove="parent.editbox.datapath.updateData()">
<edittext datapath="$once{parent.parent.rowdp}"
name="editbox" width="${parent.width}">
<method name="init">
this.globalMouseDel = new LzDelegate( this,
"checkMouse" );
super.init();
</method>
<datapath>
<attribute name="datacontrolsvisibility" value="false"/>
</datapath>
<method name="applyData" args="d">
//because of the monkeying with init that this
//componentdoes, the data for this thing can sometimes
//get set before it's ready for it
if ( !this._initcomplete ) {
this.setText( d );
} else {
super.applyData(d);
}
</method>
<handler name="onfocus">
this.globalMouseDel.register( LzGlobalMouse,
"onmousedown" );
</handler>
<handler name="onblur">
parent.setAttribute( 'editing' , false );
</handler>
<method name="checkMouse" args="who">
if ( !this.containsPt( this.getMouse( 'x' ) ,
this.getMouse( 'y' ) ) ){
parent.setAttribute( 'editing' ,false );
}
</method>
<handler name="onkeyup" args="k">
if ( k == 13 ){
parent.setAttribute( "editing" , false );
LzFocus.setFocus(parent.immediateparent.ownerGrid) ;
}
</handler>
</edittext>
</state>
</view>
</class>
In your case, you can use it like this:
<canvas>
<!-- include mygridtext here-->
<dataset name="dsDedCode" src="dedcodes.jsp" request="true" type="http" initstage="late" />
<grid id="myx" datapath="dsDedCode:/dedcodes" contentdatapath="dedcode/" >
<attribute name="editable" value="true" type="boolean" />
<mygridtext text="Col 1" editable="${parent.editable}" datapath="text()" />
</grid>
<button text="edit" onclick="myx.setAttribute('editable',!myx.editable )" />
</canvas>
Usually you can find a work around.
Since gridtext editable cannot be changed at run time (bug??) .. create two views. One view contains an editable grid, the other a non-editable grid.
Then toggle the views (by moving one view "off canvas" using setX).
This might give an onload performance hit since dataset is loaded into two grids.
But it gives a work around until gridtext component is amended.
File a bug.
<canvas width="600" height="250" debug="true">
<!-- get test dataset from here: -->
<!-- http://www.laszlosystems.com/lps-3.1/demos/contacts/contactsdata.xml -->
<goldstyle name="defaultstyle" isdefault="true"/>
<greenstyle name="green_style" />
<bluestyle name="blue_style" />
<dataset name="contacts" request="true" src="contactsdata.xml"/>
<class name="myGrid" datapath="contacts:/resultset" extends="grid">
<attribute name="gridtext_editable" value="false" type="boolean" />
<gridtext editable="false" datapath="@id" datatype="number">ID</gridtext>
<gridtext editable="${classroot.gridtext_editable}" datapath="@displayname" width="200">Name</gridtext>
</class>
<view name="control_view" x="20" y="20">
<simplelayout axis="x" />
<button text="viewA editable=true" onclick="parent.show_views(20, -400)" />
<button text="viewB editable=false" onclick="parent.show_views(-400, 20)" />
<button text="comparing both views" onclick="parent.show_views(20, 290)" />
<method name="show_views" args="a, b" >
Debug.write("show_views: viewA x=" +a+ ", viewB x=" +b);
canvas.viewA.setX(a);
canvas.viewB.setX(b);
</method>
</view>
<view name="viewA" x="20" y="50">
<myGrid name="edit_on" style="$once{blue_style}">
<attribute name="gridtext_editable" value="true" />
</myGrid>
</view>
<view name="viewB" x="290" y="50" >
<myGrid name="edit_off" style="$once{green_style}">
<attribute name="gridtext_editable" value="false" />
</myGrid>
</view>
</canvas>
p.s.
I see that you received a response from the LaszloSystems Founder in the laszlo-user mail list.
billjakarta
11-20-2006, 03:15 AM
It's funny I spent a late night last night and came up with virtually the same solution as you did. I ended up creating two classes one editable. Thbe other not. I then switch their visiblity and set the x and y. Anyway thanks for the help. I guess was a little frustrated when I posted this. For that I sincerely apolgize to you David. We are a small Malaysian Company but we are developing a fair amount expertise in Laszlo. I really like Laszlo but somethings can be frustrating at times. If I knew how I would file a bug report. Because I do believe that it would be much more useful for the gridtext component to be able to be switched from editable to not editable and back at runtime. When I get a little farther along on this project, I will have it put on an accessible site. It is fairly large Cooperative Management System that includes Membership Management,on line Loan Application, Loan Approval and Issuance as well as a host of support applications such as credit reports. Anyways thanks for your help.
billjakarta
11-20-2006, 03:41 AM
Senshi
Thanks your mygridtext works just the way gridtext should. That solves the problem of the overhead of two grids to do the job.
Bill
.. If I knew how I would file a bug report. ..
Click on the link "Report a Bug" at top of this page.
OLaszloFan
01-21-2007, 11:32 AM
Hi:
Based on the code Senshi suggested, [thank you!] I created a static dataset to try it out. What I found was that it does toggle the text item in the grid column, however, if there is more than one item in the dataset, it only toggles the first item. Am I missing something? Can you please review what I have done and suggest how I can toggle the entire column?
Best Regards,
Patrick
**Learning as I go!**
<canvas>
<class name="mygridtext" extends="gridcolumn">
<!--- The datapath attribute for a grid text is used for the text that
is displayed in the rows. -->
<attribute name="datapath"
setter="this.setAttribute( 'rowdp', datapath )"/>
<!--- type of content's alignment. Default: left
possible values are: left, center, right -->
<attribute name="textalign" type="string" value="left"/>
<!--- @keywords private -->
<attribute name="rowdp" value="" type="string"/>
<!--- If set to false, the field will not be editable. -->
<attribute name="editable" value="true" type="boolean" setter="setEditable(editable)" />
<!--- @keywords private -->
<attribute name="_textcolor" value="null"/>
<!--- @keywords private -->
<attribute name="_texthilitecolor" value="null"/>
<!--- @keywords private -->
<attribute name="_textselectedcolor" value="null"/>
<!--- @keywords private -->
<attribute name="editDel" value="null" />
<!--- @keywords private -->
<method name="_inferSortpath">
return this.rowdp;
</method>
<method name="_applystyle" args="s">
super._applystyle( s );
this.setAttribute( '_textcolor' , s.textcolor );
this.setAttribute( '_texthilitecolor' , s.texthilitecolor );
this.setAttribute( '_textselectedcolor' , s.textselectedcolor );
</method>
<method name="setEditable" args="edt" >
this.editable = edt;
if ( this["oneditable"] ) oneditable.sendEvent( edt );
if ( !_initcomplete ) return;
if ( edt ){
this.editDel.enable();
} else {
this.editDel.disable();
}
</method>
<view height="24" clickable='${parent.editable}'
onmouseover="immediateparent.domouseover()"
onmouseout="immediateparent.domouseout()"
y="${immediateparent.height/2 - height/2}"
clip="true" >
<attribute name="editing" value="false"/>
<attribute name="focusable" value="${!editing &&
parent.editable}"/>
<method name="init">
this.parent.editDel = new LzDelegate( this, 'startEditing' );
this.parent.editDel.register( this , 'onmousedown' );
this.parent.editDel.register( this , 'onfocus' );
if ( !parent.editable ){
this.parent.editDel.disable();
}
super.init();
</method>
<method name="startEditing">
immediateparent.select();
this.setAttribute( 'editing' , true );
LzFocus.setFocus( editbox );
</method>
<text visible="${!parent.editing}" width="${parent.width}"
y="$once{ parent.height /2 - this.height/2}"
fgcolor="${ parent.immediateparent.selected ?
classroot._textselectedcolor:
(parent.immediateparent.highlighted ?
classroot._texthilitecolor:
classroot._textcolor)}"
datapath="$once{parent.parent.rowdp}">
<method event="oninit">
<![CDATA[
var f = function() {
this.setAttribute("x", this._calcX());
}
var d = [this, "width"];
this.applyConstraint("x", f, d);
]]>
</method>
<method event="ontext" args="val">
<![CDATA[
this.setAttribute("x", this._calcX());
]]>
</method>
<method name="_calcX">
<![CDATA[
if (classroot.textalign == "center"){
var x = ((this.width /2) - (this.getTextWidth() /2));
if (x < 0) x = 0;
return x;
}
else if (classroot.textalign == "right"){
var x = ((this.width) - (this.getTextWidth() + 10));
if (x < 0) x = 0;
return x;
}
else{
return 0;
}
]]>
</method>
</text>
<state pooling="true" apply="${parent.editing}"
onremove="parent.editbox.datapath.updateData()">
<edittext datapath="$once{parent.parent.rowdp}"
name="editbox" width="${parent.width}">
<method name="init">
this.globalMouseDel = new LzDelegate( this,
"checkMouse" );
super.init();
</method>
<datapath>
<attribute name="datacontrolsvisibility" value="false"/>
</datapath>
<method name="applyData" args="d">
//because of the monkeying with init that this
//componentdoes, the data for this thing can sometimes
//get set before it's ready for it
if ( !this._initcomplete ) {
this.setText( d );
} else {
super.applyData(d);
}
</method>
<handler name="onfocus">
this.globalMouseDel.register( LzGlobalMouse,
"onmousedown" );
</handler>
<handler name="onblur">
parent.setAttribute( 'editing' , false );
</handler>
<method name="checkMouse" args="who">
if ( !this.containsPt( this.getMouse( 'x' ) ,
this.getMouse( 'y' ) ) ){
parent.setAttribute( 'editing' ,false );
}
</method>
<handler name="onkeyup" args="k">
if ( k == 13 ){
parent.setAttribute( "editing" , false );
LzFocus.setFocus(parent.immediateparent.ownerGrid) ;
}
</handler>
</edittext>
</state>
</view>
</class>
<dataset name="dsDedCode">
<dedcodes>
<dedcode>Item 1</dedcode>
<dedcode>Item 2</dedcode>
<dedcode>Item 3</dedcode>
</dedcodes>
</dataset>
<!-- <dataset name="dsDedCode" src="dedcodes.jsp" request="true" type="http" initstage="late" /> -->
<simplelayout axis="y" spacing="5" />
<attribute name="editable" value="false" type="boolean" />
<grid id="myx" datapath="dsDedCode:/dedcodes" contentdatapath="dedcode/" >
<mygridtext text="Col 1" editable="${parent.editable}" datapath="text()" />
</grid>
<button text="edit" onclick="myx.setAttribute('editable',!myx.editable )" />
</canvas>
senshi
01-21-2007, 01:13 PM
Ups, found the issue.
Try this out:
<class name="mygridtext" extends="gridcolumn">
<!--- The datapath attribute for a grid text is used for the text that
is displayed in the rows. -->
<attribute name="datapath"
setter="this.setAttribute( 'rowdp', datapath )"/>
<!--- type of content's alignment. Default: left
possible values are: left, center, right -->
<attribute name="textalign" type="string" value="left"/>
<!--- @keywords private -->
<attribute name="rowdp" value="" type="string"/>
<!--- If set to false, the field will not be editable. -->
<attribute name="editable" value="true" type="boolean" setter="setEditable(editable)" />
<!--- @keywords private -->
<attribute name="_textcolor" value="null"/>
<!--- @keywords private -->
<attribute name="_texthilitecolor" value="null"/>
<!--- @keywords private -->
<attribute name="_textselectedcolor" value="null"/>
<!--- @keywords private -->
<method name="_inferSortpath">
return this.rowdp;
</method>
<method name="_applystyle" args="s">
super._applystyle( s );
this.setAttribute( '_textcolor' , s.textcolor );
this.setAttribute( '_texthilitecolor' , s.texthilitecolor );
this.setAttribute( '_textselectedcolor' , s.textselectedcolor );
</method>
<method name="setEditable" args="edt" >
this.editable = edt;
if ( this["oneditable"] ) oneditable.sendEvent( edt );
</method>
<view height="24" clickable='${parent.editable}'
onmouseover="immediateparent.domouseover()"
onmouseout="immediateparent.domouseout()"
y="${immediateparent.height/2 - height/2}"
clip="true" >
<attribute name="editing" value="false"/>
<attribute name="focusable" value="${!editing &&
parent.editable}"/>
<!--- @keywords private -->
<attribute name="editDel" value="null" />
<method name="init">
this.editDel = new LzDelegate( this, 'startEditing' );
this.editDel.register( this , 'onmousedown' );
this.editDel.register( this , 'onfocus' );
if ( !parent.editable ){
this.editDel.disable();
}
super.init();
</method>
<handler name="oneditable" reference="parent" >
if( parent.editable )
this.editDel.enable();
else
this.editDel.disable();
</handler>
<method name="startEditing">
immediateparent.select();
this.setAttribute( 'editing' , true );
LzFocus.setFocus( editbox );
</method>
<text visible="${!parent.editing}" width="${parent.width}"
y="$once{ parent.height /2 - this.height/2}"
fgcolor="${ parent.immediateparent.selected ?
classroot._textselectedcolor:
(parent.immediateparent.highlighted ?
classroot._texthilitecolor:
classroot._textcolor)}"
datapath="$once{parent.parent.rowdp}">
<method event="oninit">
<![CDATA[
var f = function() {
this.setAttribute("x", this._calcX());
}
var d = [this, "width"];
this.applyConstraint("x", f, d);
]]>
</method>
<method event="ontext" args="val">
<![CDATA[
this.setAttribute("x", this._calcX());
]]>
</method>
<method name="_calcX">
<![CDATA[
if (classroot.textalign == "center"){
var x = ((this.width /2) - (this.getTextWidth() /2));
if (x < 0) x = 0;
return x;
}
else if (classroot.textalign == "right"){
var x = ((this.width) - (this.getTextWidth() + 10));
if (x < 0) x = 0;
return x;
}
else{
return 0;
}
]]>
</method>
</text>
<state pooling="true" apply="${parent.editing}"
onremove="parent.editbox.datapath.updateData()">
<edittext datapath="$once{parent.parent.rowdp}"
name="editbox" width="${parent.width}">
<method name="init">
this.globalMouseDel = new LzDelegate( this,
"checkMouse" );
super.init();
</method>
<datapath>
<attribute name="datacontrolsvisibility" value="false"/>
</datapath>
<method name="applyData" args="d">
//because of the monkeying with init that this
//componentdoes, the data for this thing can sometimes
//get set before it's ready for it
if ( !this._initcomplete ) {
this.setText( d );
} else {
super.applyData(d);
}
</method>
<handler name="onfocus">
this.globalMouseDel.register( LzGlobalMouse,
"onmousedown" );
</handler>
<handler name="onblur">
parent.setAttribute( 'editing' , false );
</handler>
<method name="checkMouse" args="who">
if ( !this.containsPt( this.getMouse( 'x' ) ,
this.getMouse( 'y' ) ) ){
parent.setAttribute( 'editing' ,false );
}
</method>
<handler name="onkeyup" args="k">
if ( k == 13 ){
parent.setAttribute( "editing" , false );
LzFocus.setFocus(parent.immediateparent.ownerGrid) ;
}
</handler>
</edittext>
</state>
</view>
</class>
OLaszloFan
01-21-2007, 02:27 PM
Senshi:
Thank you very much for helping overall in the forum and taking the time to resolve my question.
Your changes do indeed allow for full functionality of the new lzx class.
Patrick
**Learning as I go!**
Updated example based on Senshi's help:
<canvas>
<class name="mygridtext" extends="gridcolumn">
<!--- The datapath attribute for a grid text is used for the text that
is displayed in the rows. -->
<attribute name="datapath"
setter="this.setAttribute( 'rowdp', datapath )"/>
<!--- type of content's alignment. Default: left
possible values are: left, center, right -->
<attribute name="textalign" type="string" value="left"/>
<!--- @keywords private -->
<attribute name="rowdp" value="" type="string"/>
<!--- If set to false, the field will not be editable. -->
<attribute name="editable" value="true" type="boolean" setter="setEditable(editable)" />
<!--- @keywords private -->
<attribute name="_textcolor" value="null"/>
<!--- @keywords private -->
<attribute name="_texthilitecolor" value="null"/>
<!--- @keywords private -->
<attribute name="_textselectedcolor" value="null"/>
<!--- @keywords private -->
<method name="_inferSortpath">
return this.rowdp;
</method>
<method name="_applystyle" args="s">
super._applystyle( s );
this.setAttribute( '_textcolor' , s.textcolor );
this.setAttribute( '_texthilitecolor' , s.texthilitecolor );
this.setAttribute( '_textselectedcolor' , s.textselectedcolor );
</method>
<method name="setEditable" args="edt" >
this.editable = edt;
if ( this["oneditable"] ) oneditable.sendEvent( edt );
</method>
<view height="24" clickable='${parent.editable}'
onmouseover="immediateparent.domouseover()"
onmouseout="immediateparent.domouseout()"
y="${immediateparent.height/2 - height/2}"
clip="true" >
<attribute name="editing" value="false"/>
<attribute name="focusable" value="${!editing &&
parent.editable}"/>
<!--- @keywords private -->
<attribute name="editDel" value="null" />
<method name="init">
this.editDel = new LzDelegate( this, 'startEditing' );
this.editDel.register( this , 'onmousedown' );
this.editDel.register( this , 'onfocus' );
if ( !parent.editable ){
this.editDel.disable();
}
super.init();
</method>
<handler name="oneditable" reference="parent" >
if( parent.editable )
this.editDel.enable();
else
this.editDel.disable();
</handler>
<method name="startEditing">
immediateparent.select();
this.setAttribute( 'editing' , true );
LzFocus.setFocus( editbox );
</method>
<text visible="${!parent.editing}" width="${parent.width}"
y="$once{ parent.height /2 - this.height/2}"
fgcolor="${ parent.immediateparent.selected ?
classroot._textselectedcolor:
(parent.immediateparent.highlighted ?
classroot._texthilitecolor:
classroot._textcolor)}"
datapath="$once{parent.parent.rowdp}">
<method event="oninit">
<![CDATA[
var f = function() {
this.setAttribute("x", this._calcX());
}
var d = [this, "width"];
this.applyConstraint("x", f, d);
]]>
</method>
<method event="ontext" args="val">
<![CDATA[
this.setAttribute("x", this._calcX());
]]>
</method>
<method name="_calcX">
<![CDATA[
if (classroot.textalign == "center"){
var x = ((this.width /2) - (this.getTextWidth() /2));
if (x < 0) x = 0;
return x;
}
else if (classroot.textalign == "right"){
var x = ((this.width) - (this.getTextWidth() + 10));
if (x < 0) x = 0;
return x;
}
else{
return 0;
}
]]>
</method>
</text>
<state pooling="true" apply="${parent.editing}"
onremove="parent.editbox.datapath.updateData()">
<edittext datapath="$once{parent.parent.rowdp}"
name="editbox" width="${parent.width}">
<method name="init">
this.globalMouseDel = new LzDelegate( this,
"checkMouse" );
super.init();
</method>
<datapath>
<attribute name="datacontrolsvisibility" value="false"/>
</datapath>
<method name="applyData" args="d">
//because of the monkeying with init that this
//componentdoes, the data for this thing can sometimes
//get set before it's ready for it
if ( !this._initcomplete ) {
this.setText( d );
} else {
super.applyData(d);
}
</method>
<handler name="onfocus">
this.globalMouseDel.register( LzGlobalMouse,
"onmousedown" );
</handler>
<handler name="onblur">
parent.setAttribute( 'editing' , false );
</handler>
<method name="checkMouse" args="who">
if ( !this.containsPt( this.getMouse( 'x' ) ,
this.getMouse( 'y' ) ) ){
parent.setAttribute( 'editing' ,false );
}
</method>
<handler name="onkeyup" args="k">
if ( k == 13 ){
parent.setAttribute( "editing" , false );
LzFocus.setFocus(parent.immediateparent.ownerGrid) ;
}
</handler>
</edittext>
</state>
</view>
</class>
<dataset name="dsDedCode">
<dedcodes>
<dedcode>Item 1</dedcode>
<dedcode>Item 2</dedcode>
<dedcode>Item 3</dedcode>
</dedcodes>
</dataset>
<simplelayout axis="y" spacing="5" inset="50" />
<attribute name="editable" value="false" type="boolean" />
<grid id="myx" x="50" datapath="dsDedCode:/dedcodes" contentdatapath="dedcode/" >
<mygridtext text="Col 1" editable="${parent.editable}" datapath="text()" />
</grid>
<button x="50" text="edit" onclick="myx.setAttribute('editable',!myx.editable )" />
</canvas>
vBulletin® v3.8.4, Copyright ©2000-2012, Jelsoft Enterprises Ltd.