Dimitry_II
27.05.2010, 05:53
Есть DataGrid с редактированием. Более сложные варианты - с выбором из комбобокса - получаются, а казалось бы с более легким простым - нет. К примеру (укороченно):
<mx:PhoneNumberValidator source="{phone_column}" property="text" trigger="{phone_column}" triggerEvent="change" required="true" invalid="Alert.show('Invalid!!!')"/>
<mx:DataGrid id="grid_phones" editable="true" dataProvider="{grid.selectedItem.phones}">
<mx:columns>
<mx:DataGridColumn labelFunction="phonecodeLabelFunction">
<mx:itemEditor>
<fx:Component>
<mx:ComboBox editable="false" change="outerDocument.changePhonecodeHandler(event)" dataProvider="{outerDocument.phonecodes}" labelField="code"/>
</fx:Component>
</mx:itemEditor> </mx:DataGridColumn>
<mx:DataGridColumn id="phone_column" dataField="phone" />
</mx:columns>
</mx:DataGrid>
Есть также вариант садить на DataGrid событие itemEditEnd и при получении события из конкретного столбца проверять его, сравнивать с регвыражением и в зависимости от результата пропускать с форматированием или отказывать. Но к сожалению в обработчике не получается получить исправленное значение - это а) и б) - не уверен, что событие возникает ДО занесения значения в ячейку таблицы.
Плиз, подскажите - как правильнее и удобнее сделать валидатор для текстовой изменяемой ячейки (с невозможностью допуска неправильного значения)?
Добавлено через 13 часов 24 минуты
Нашел решение. На мой взгляд - наиболее простое, короткое и ненавязчивое для пользователя.
Публикую для тех, кому интересно.
<fx:Script>
<![CDATA[
private function itemEditEndHandler(event:DataGridEvent):void {
if (event.dataField == "phone") {
var newValue:String = (grid_phones.itemEditorInstance as TextInput).text;
var regExp:RegExp = /\d{3}-\d{4}|\d{7}/;
if (regExp.test(newValue)) {
grid_phones.editedItemRenderer.data.phone = phoneFormatter.format(newValue);
grid_phones.destroyItemEditor();
grid_phones.dataProvider.itemUpdated(event.itemRenderer.data);
} else event.preventDefault();
}
}
]]>
</fx:Script>
<fx:Declarations>
<mx:PhoneFormatter id="phoneFormatter" formatString="###-####" validPatternChars="#-"/>
</fx:Declarations>
...
<mx:DataGrid id="grid_phones" editable="true" dataProvider="{grid.selectedItem.phones}" itemEditEnd="itemEditEndHandler(event)">
<mx:columns>
...
<mx:DataGridColumn dataField="phone"/>
...
</mx:columns>
</mx:DataGrid>
<mx:PhoneNumberValidator source="{phone_column}" property="text" trigger="{phone_column}" triggerEvent="change" required="true" invalid="Alert.show('Invalid!!!')"/>
<mx:DataGrid id="grid_phones" editable="true" dataProvider="{grid.selectedItem.phones}">
<mx:columns>
<mx:DataGridColumn labelFunction="phonecodeLabelFunction">
<mx:itemEditor>
<fx:Component>
<mx:ComboBox editable="false" change="outerDocument.changePhonecodeHandler(event)" dataProvider="{outerDocument.phonecodes}" labelField="code"/>
</fx:Component>
</mx:itemEditor> </mx:DataGridColumn>
<mx:DataGridColumn id="phone_column" dataField="phone" />
</mx:columns>
</mx:DataGrid>
Есть также вариант садить на DataGrid событие itemEditEnd и при получении события из конкретного столбца проверять его, сравнивать с регвыражением и в зависимости от результата пропускать с форматированием или отказывать. Но к сожалению в обработчике не получается получить исправленное значение - это а) и б) - не уверен, что событие возникает ДО занесения значения в ячейку таблицы.
Плиз, подскажите - как правильнее и удобнее сделать валидатор для текстовой изменяемой ячейки (с невозможностью допуска неправильного значения)?
Добавлено через 13 часов 24 минуты
Нашел решение. На мой взгляд - наиболее простое, короткое и ненавязчивое для пользователя.
Публикую для тех, кому интересно.
<fx:Script>
<![CDATA[
private function itemEditEndHandler(event:DataGridEvent):void {
if (event.dataField == "phone") {
var newValue:String = (grid_phones.itemEditorInstance as TextInput).text;
var regExp:RegExp = /\d{3}-\d{4}|\d{7}/;
if (regExp.test(newValue)) {
grid_phones.editedItemRenderer.data.phone = phoneFormatter.format(newValue);
grid_phones.destroyItemEditor();
grid_phones.dataProvider.itemUpdated(event.itemRenderer.data);
} else event.preventDefault();
}
}
]]>
</fx:Script>
<fx:Declarations>
<mx:PhoneFormatter id="phoneFormatter" formatString="###-####" validPatternChars="#-"/>
</fx:Declarations>
...
<mx:DataGrid id="grid_phones" editable="true" dataProvider="{grid.selectedItem.phones}" itemEditEnd="itemEditEndHandler(event)">
<mx:columns>
...
<mx:DataGridColumn dataField="phone"/>
...
</mx:columns>
</mx:DataGrid>