这是我遇到的一个奇怪的问题或Flex 3的缺点。我正在使用SOAP消息传递协议和来自服务器的响应来填充“注释”。我在弹出窗口中显示的字段如下:
由于这是SOAP,我将响应作为XML字符串。 GLNotes字段值为4582e12。
关于我如何处理此响应的一些Flex代码:
<mx:DataGrid dataProvider="{AccruedIncomeWS.GetAccruedIncomeList.lastResult.root.AccruedIncomeList.Item}"
itemClick="AccrualClick(event);" id="AccrualList>
<mx:columns>
...
</mx:columns>
</mx:DataGrid>
现在我为AccrualList.selectedItem创建了一个监视表达式,我看到了:
为什么GLNotes会在这里转换为数字?为了测试这个隐式转换,我在notes字段中放了一些字符,并在watch表达式中得到了它:
如果存在一些字母,则GLNotes字段将被视为字符串。无论如何,我可以使这个值强类型,并没有应用任何隐式转换?如果需要其他信息,请与我们联系。谢谢!
修改
正如@Pan建议的那样,我将我的dataProvider更改为 ArrayCollection AccrualDataProvider。
<mx:DataGrid dataProvider="{AccrualDataProvider}" itemClick="AccrualClick(event);" id="AccrualList>
<mx:columns>
...
</mx:columns>
</mx:DataGrid>
处理来自服务器的响应并用它填充 ArrayCollection 。
private function HandleAccrualList(event:ResultEvent):void
{
AccrualDataProvider = new ArrayCollection();
AccrualDataProvider = AppHelper.ForceArrayCollection(event.result.root.AccruedIncomeList.Item);
}
在Debug上,我发现, ArrayCollection AccrualDataProvider仍然包含GLNotes作为数字而不是字符串。
很遗憾我们必须编写一些额外的代码来避免这种隐式转换,我为解决方案所做的是:在GLNotes之前加上&#39; /&#39;从服务器发送然后在labelFunction中发送&#39; /&#39;。因此,flex将其视为字符串并保持数字字符串不变。
是否可以在服务器端进行任何设置,因此XML强制将字符串的数据类型转换为SOAP XML响应?
答案 0 :(得分:0)
您可以尝试labelFunction使用数据网格数据显示自定义视图。
这是一个例子(数据提供者是数组而不是xml)
<mx:Script>
<![CDATA[
[Bindable]
private var Item:Object = [{GLNodes:0x4582e12},{GLNodes:0x4582e13}];
private function GLNodesLabelFunction(obj:Object, column:DataGridColumn):String
{
return (obj.GLNodes).toString(16);//show exponential form
}
]]>
</mx:Script>
<mx:DataGrid dataProvider="{Item}" id="AccrualList">
<mx:columns>
<mx:DataGridColumn labelFunction="GLNodesLabelFunction"/>
</mx:columns>
</mx:DataGrid>
如果在使用labelFunction后问题仍然存在,我认为问题可能就是你如何使用xml dataProvider。