Hallo,
Ich hab ein kleines Problem mit einem ComboBox CellRenderer in einem Datagrid.
Gewünschte Funktionsweise:
Solange die jeweilige Reihe nicht selektiert wird, wird in der Spalte price ein textfield bzw. label angezeigt. Selektiere ich jetzt die Reihe wird das TextField durch eine ComboBox ausgetauscht und ich kann die Werte beliebig ändern.
Es funktioniert auch alles recht schön, jedoch bis auf die Tatsache das sobald ich in der ComboBox einen anderen Wert ausgewählt habe und danach die Spaltengröße verändere, alle Zellen bei denen sich der ComboBox.selectedIndex geändert wurde um ca. eine Reihenhöhe nach oben verschoben wird. (y coord der celle ändert sich von 0 z.b auf -35)
Ich habe schon versucht über das columnStrech Event in jeder Zelle bei der der Wert verändert wurde abzufangen und den y wert neu zu setzen, jedoch passiert das verschieben der Zelle anscheinend erst nachdem columnStretch ausgelöst worden ist. Momentan repositionier ich die Zelle neu wenn setValue ausgelöst wird, aber das ist nicht wirklich eine gute Lösung..
Hier ein testcode für frame 1:
PHP-Code:
import mx.controls.gridclasses.DataGridColumn;
myDataGrid.addColumn(new DataGridColumn("name"));
var dGC:DataGridColumn = new DataGridColumn("price");
dGC.cellRenderer = "ComboBoxCell";
myDataGrid.addColumn(dGC);
myDataGrid.width = 150;
var myDP:Array = new Array({name:"Chris", price:1}, {name:"Nigel", price:2});
myDataGrid.dataProvider = myDP;
ComboBoxCell.as:
PHP-Code:
import mx.core.UIComponent;
import mx.controls.*;
import mx.utils.Delegate;
class ComboBoxCell extends mx.core.UIComponent {
var comboBox:ComboBox;
var owner;
var listOwner;
var singleLineLabel:TextField;
var getCellIndex:Function;
var getDataLabel:Function;
var oldY:Number;
public function ComboBoxCell() {}
public function createChildren():Void {
singleLineLabel = createLabel("singleLineLabel", 10);
singleLineLabel.styleName = listOwner;
singleLineLabel.selectable = false;
singleLineLabel.tabEnabled = false;
singleLineLabel.background = false;
singleLineLabel.border = false;
comboBox = ComboBox(createClassObject(ComboBox, "statusComboBox", this.getNextHighestDepth(),{visible:false}));
comboBox.addItem("one");
comboBox.addItem("two");
comboBox.addItem("three");
comboBox.addEventListener("change", Delegate.create(this, onComboBoxChange));
Delegate.create(this, onColumnStretch));
oldY = this._y;
size();
}
public function size():Void {
comboBox.setSize(__width-2,Math.max(__height, listOwner.rowHeight -2));
singleLineLabel.setSize(__width, __height);
//listOwner.redraw();
this._y = oldY;
}
public function getPreferredHeight():Number {
return 50;
}
public function setValue(suggested:String, item:Object, selected:String):Void {
comboBox.selectedIndex = item.price;
if(item != undefined){
if(selected == "normal"){
singleLineLabel.text = comboBox.selectedItem.label;
singleLineLabel._visible = true;
comboBox.visible = false;
}
if(selected == "selected"){
comboBox.visible = true;
singleLineLabel._visible = false;
}
this._y = oldY;
}
}
public function draw(){
this._y = oldY;
}
public function onComboBoxChange(eventObj) {
var index:Object = getCellIndex();
var colName:String = listOwner.getColumnAt(index.columnIndex).columnName;
listOwner.dataProvider.editField(index.itemIndex, colName, eventObj.target.selectedIndex);
listOwner.addEventListener("columnStretch", Delegate.create(this, onColumnStretch));
}
public function onColumnStretch(eventObj) {
this._y = oldY;
}
}
Wär super wenn irgendwer von euch eine Idee hätte, steh momentan ein bisschen an =(.
greez
Christoph