Hi
I am trying to create editable datagrid. I have also implemented itemEditEnd
event because i have nested datafield. I have custom itemeditor. In the custom
itemeditor, i have textInput and button to open the popup. I click to open open
pop up.I write some text in the pop up but that that text does not appear in
itemeditor after close popup.
I have attached sample test code.I have added snippets but if you required i
can add complete test case.
PopUp
<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns="customComponents.popups.*"
xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:prgbar="com.vzw.framework.prgbar.*"
width="100%"
height="100%"
verticalScrollPolicy="off"
styleName="popupStyle">
<mx:Script>
<![CDATA[
import mx.managers.PopUpManager;
public var opener:Object;
public var testTextInputText:String;
public function onTextChange(event:Event):void
{
testTextInputText=(event.currentTarget as
TextInput).text;
}
public function onOkClick():void
{
if(opener) opener.onPopUpClose();
PopUpManager.removePopUp(this);
}
]]>
</mx:Script>
<mx:VBox width="100%"
height="100%"
paddingBottom="0">
<mx:TextInput text=""
id="testTextInput"
change="onTextChange(event)"/>
<mx:Button label="ok" click="onOkClick()"/>
</mx:VBox>
</mx:TitleWindow>
ItemEditor
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"
width="100%"
height="200"
horizontalAlign="center"
implements="customComponents.datagrid.IEditorValue">
<mx:TextInput id="txtInputByUser"/>
<mx:Image source="assets/images/spyglass.gif"
buttonMode="true"
click="onUserClick(event)"/>
<mx:Script>
<![CDATA[
import mx.events.CollectionEvent;
import mx.collections.ArrayCollection;
import mx.managers.PopUpManager;
import customComponents.popups.CustomPopup;
import mx.controls.listClasses.BaseListData;
// Internal variable for the property value.
private var _listData:BaseListData;
// Make the listData property bindable.
[Bindable("dataChange")]
// Define the getter method.
public function get listData():BaseListData
{
return _listData;
}
// Define the setter method,
public function set listData(value:BaseListData):void
{
_listData=value;
}
public function get editValue():String
{
var returnString:String="";
returnString=txtInputByUser.text;
return returnString;
}
public var win:CustomPopup;
public function onPopUpClose():void
{
txtInputByUser.text = win.testTextInputText;
trace("Input At popup " +
win.testTextInputText);
}
protected function onUserClick(evt:Event):void
{
if(win==null)
win=new CustomPopup();
win.width=300;
win.height=330;
var point:Point=new Point(0, 0);
point=evt.target.localToGlobal(point);
win.y=point.x;
win.x=point.y;
PopUpManager.addPopUp(win, this, true);
PopUpManager.centerPopUp(win);
}
]]>
</mx:Script>
</mx:HBox>
Method
private function onitemEditEnd(event:DataGridEvent):void
{
var datGrid:DataGrid=(event.currentTarget as DataGrid);
if (event.reason == DataGridEventReason.CANCELLED)
return;
var selectedObject:Object=datGrid.dataProvider[event.rowIndex];
var field:String=datGrid.columns[event.columnIndex].dataField;
var array:Array=field.split(".");
if (array!= null && array.length >= 2)
{
event.preventDefault();
var object:Object=selectedObject[array[0]];
var textEnteredByUser:String;
if(datGrid.itemEditorInstance is IEditorValue)
{
textEnteredByUser=IEditorValue(datGrid.itemEditorInstance).editValue;
object[array[1]]=textEnteredByUser;
}
else
{
textEnteredByUser =
TextInput(datGrid.itemEditorInstance).text;
object[array[1]]= textEnteredByUser;
}
//datGrid.destroyItemEditor();
datGrid.dataProvider.itemUpdated(event.itemRenderer.data);
}
}
package customComponents.datagrid
{
import mx.controls.listClasses.IDropInListItemRenderer;
import mx.controls.listClasses.BaseListData;
public interface IEditorValue extends IDropInListItemRenderer
{
function get editValue():String;
}
}
Thanks
ilikeflex