由于性能不佳,DataGrid将缓存复选框并将其重用于不同的行。如果您有50行,则不会创建50个复选框。它将创建可见的多个复选框,再加上一些用于填充的复选框,然后在滚动时重复使用它们。这就是您需要明确管理其状态的原因。 怎么能改善呢?如何修复复选框值?我使用下面的复选框但复选框不记得值
<mx:DataGrid id="calamount"dataProvider="{xml_coupon.lastResult.Teamcoupon.match_details}" variableRowHeight="true">
<mx:columns>
<mx:DataGridColumn headerText="1" rendererIsEditor="true" editorDataField="selected">
<mx:itemRenderer>
<mx:Component>
<mx:HBox verticalAlign="middle" paddingLeft="2">
<mx:CheckBox id="checkbox1" selected="{outerDocument.checkedAll}" click="{data.check1=checkbox1.selected;outerDocument.calcValues()}"/>
</mx:HBox>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
答案 0 :(得分:1)
我不确定我是否完全理解您的问题,但如果您正在寻找提高自定义项目渲染器性能的方法,我首先要阅读Alex Harui在其博客上发表的精彩文章。具体来说,关于绩效的部分:
<强>性能强>
设计自定义项目渲染器时,应牢记性能。虽然采用Canvas,HBox或VBox并在其中放置一些组件并拥有渲染器简单快速,但请记住,容器非常大且速度慢,并且如果您要在DataGrid中看到很多容器,您可能会遇到性能问题。我们经常看不到它们,因为我们在非常快的机器上开发,但您必须考虑最终用户将拥有哪种硬件。因此,如果屏幕上有超过六个,我不鼓励在自定义项目渲染器中使用mx.containers中的任何容器。除非您在渲染器中布置超过三个或四个小部件,否则从UIComponent开始并且只需编写一些逻辑来将组件布置在正确的位置将会快得多。来自mx.containers的容器也会考虑延迟实例化逻辑,滚动条,剪辑以及您可能不需要在渲染器中使用的一些其他内容。
这就是为什么您会看到所有示例都使用ActionScript而不是MXML的原因。是的,这意味着您无法使用FlexBuilder对渲染器进行编码,是的,其中一些示例可以在MXML中完成,但MXML很容易执行生成您可能不需要的额外代码的操作。您会注意到,出于同样的原因,我不会在这些示例中使用数据绑定。实际上有点浪费(虽然非常方便)对不会改变或只改变一次或两次的东西使用绑定。相反,我在initialize事件上设置dataprovider(如果我使用HTTPService,则会对结果事件执行此操作)。(1)
答案 1 :(得分:0)
您的意思是您的复选框不记得值吗?您必须确保使项目渲染器数据驱动。
<mx:CheckBox selected="{data.someBooleanProperty}"/>
当你滚动时,它会确保正确选中/取消选中它们。
答案 2 :(得分:0)
您将复选框选中的属性绑定到错误的内容。它应该绑定到data.check1(很好的暗示名称),通过click事件处理程序中的代码来判断。顺便说一句,这应该是“更改”事件,因为当您按ENTER或空格键并且它具有焦点时您可以更改复选框的值,并且在这种情况下您将不会获得单击事件。