FLEX AdvancedDataGrid 滚动后 数据混乱

Azrael99999 2010-09-28 11:22:49
实际情况是这样的
我有个AdvancedDataGrid 表格
上面有很多数据
有个 添加 按钮会添加一条空记录
有一列我是重写的 组件 <mx:AdvancedDataGridColumn headerText="项目内容"
dataField="name"
editable="false"
itemRenderer="{new ClassFactory(NursingItemNameRenderer)}"/>
NursingItemNameRenderer.mxml文件
是用 下面 重写的
<mx:HBox>
....
</mx:HBox>

然后会出现一个很奇怪的问题
如果 我上下拖动 我新添加的 一条记录 会把 上面的 记录 遮掉了
两张图片
正常的

拖动后


...全文
522 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
leemiki 2010-09-29
  • 打赏
  • 举报
回复
对Flex渲染机制熟悉的话可以顺着原理一点点查...

还是不那么容易的,最好找有这方面的经验的人帮你看看!

说实话这种情况我就在刚接触Flex的时候遇到过,上面也说了

后来就再也没碰到过这种情况,就算是DataGrid加载大量的数据也没出现异常

所以这方面也没上面经验,O(∩_∩)O~

期待高手帮你解答喽.....
Azrael99999 2010-09-29
  • 打赏
  • 举报
回复
itemrender代码
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:super="net.carefx.nursing.component.dgCombo.*"
dataChange="init()"
horizontalScrollPolicy="off"
disabledOverlayAlpha="0.0"
disabledColor="#333333">
<mx:RemoteObject id="sNursingService"
destination="CNPWebService"
showBusyCursor="true"
fault="this.parentApplication.nursingPathwayFault(event)">
<mx:method name="queryItemsByCode"
result="onQueryItemsByCode(event)"/>
</mx:RemoteObject>

<mx:Script>
<![CDATA[
import mx.controls.AdvancedDataGrid;
import mx.collections.HierarchicalCollectionView;
import mx.collections.HierarchicalData;
import net.carefx.nursing.ws.domain.Item;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
import net.carefx.nursing.ws.domain.UnitItemInstance;
import net.carefx.nursing.util.Constant;
import net.carefx.nursing.util.CodeHelper;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.utils.StringUtil;
import mx.collections.ArrayCollection;

[Bindable]
private var nursingItems:ArrayCollection=new ArrayCollection();

[Bindable]
private var unitItemInstance:UnitItemInstance=new UnitItemInstance();

private function init():void
{
if (data && data.statusColor != null)
{
cNursingItemComboBox.setStyle("color", data.statusColor);
}

if (data && data.hasOwnProperty("unitItemInstance"))
{
nursingItems.removeAll();
unitItemInstance=data.unitItemInstance;
nursingItems.addItem(data.unitItemInstance);
cNursingItemComboBox.enabled=data.isExe == UnitItemInstance.DO_TERM ? false : true;
if (!data.unitItemInstance.item || data.unitItemInstance.id == "")
{
cNursingItemComboBox.editable=true;
}
}
else if (data && data.children)
{
nursingItems.removeAll();
unitItemInstance=null;
for each (var unitItemInstance:UnitItemInstance in data.children[0].unionItems)
{
nursingItems.addItem(unitItemInstance);
}
cNursingItemComboBox.enabled=data.isExe == UnitItemInstance.DO_TERM ? false : true;
}
}

private function eTextChangeHandler():void
{
sNursingService.queryItemsByCode(cNursingItemComboBox.text);
}

private function onQueryItemsByCode(event:ResultEvent):void
{
var remoteNursingItems:Array=event.result as Array;
if (nursingItems)
{
nursingItems.removeAll();
}
for each (var remoteNursingItem:Item in remoteNursingItems)
{
var unitItemInstance:UnitItemInstance=new UnitItemInstance();
unitItemInstance.item=remoteNursingItem;
nursingItems.addItem(unitItemInstance);
}
}

private function eNursingItemClose():void
{
if (cPopUpDataGrid.selectedItem != null)
{
unitItemInstance.item = UnitItemInstance(cPopUpDataGrid.selectedItem).item;
if (data && data.hasOwnProperty("unitItemInstance"))
{
HierarchicalData(HierarchicalCollectionView(AdvancedDataGrid(owner).dataProvider).source).source.itemUpdated(data);
}
}
}

private function eItemClick():void
{
if (cPopUpDataGrid.selectedItem != null)
{
unitItemInstance.item = UnitItemInstance(cPopUpDataGrid.selectedItem).item;
if(data && data.hasOwnProperty("unitItemInstance"))
{
HierarchicalData(HierarchicalCollectionView(AdvancedDataGrid(owner).dataProvider).source).source.itemUpdated(data);
}
}

}

private function labelFunction(item:Object):String
{
var str:String="";
if (item.groupID == null || item.groupID == Constant.NURSING_ITEM_NO_GROUP || item.groupID == "")
{
if (item.item)
{
str=item.item.name;
}
}
else
{
for each (var unitItemInstance:UnitItemInstance in nursingItems)
{
if (unitItemInstance.item)
{
str+=StringUtil.trim(unitItemInstance.item.name) + "+";
}
}
if (str.length != 0)
{
str=str.substr(0, str.length - 1);
}
}
return str;
}

private function popLabelFunction(item:Object, column:DataGridColumn):String
{
var str:String="";
switch (column.dataField)
{
case "name":
if (item.item)
{
str=item.item.name;
}
break;
case "type":
if (item.item)
{
str=resourceManager.getString('localization', CodeHelper.lookUpValue(Constant.NURSING_ITEM_TYPE, Number(item.item.itemType)));
}
break;
}
return str;
}

private function fault(event:FaultEvent):void
{
Alert.show(event.message.toString());
}
]]>
</mx:Script>
<super:DGComboBox id="cNursingItemComboBox"
width="100%"
labelFunction="labelFunction"
dataProvider="{nursingItems}"
dropdownWidth="800"
textChange="eTextChangeHandler()"
change="eNursingItemClose()">
<super:popUp>
<mx:DataGrid id="cPopUpDataGrid"
dataProvider="{nursingItems}"
sortableColumns="false"
itemClick="eItemClick();">
<mx:columns>
<mx:DataGridColumn headerText="项目內容"
dataField="name"
labelFunction="popLabelFunction"/>
<mx:DataGridColumn headerText="项目类型"
width="100"
dataField="type"
labelFunction="popLabelFunction"/>
</mx:columns>
</mx:DataGrid>
</super:popUp>
</super:DGComboBox>
</mx:HBox>
niwenbin416 2010-09-29
  • 打赏
  • 举报
回复
我看你是怎么渲染BUTTON的···要是数据也完整的话可能问题在那
niwenbin416 2010-09-29
  • 打赏
  • 举报
回复
我日你LZ我怎么看着第二条记录像是你的DGComboBox的editable=true了啊!
还有!如果没有数据源DGComboBox会显示什么?如果enable=false你的DGComboBox会显示什么?
leemiki 2010-09-28
  • 打赏
  • 举报
回复
这问题我也碰到过!

以前收藏的一片文章,可以解决你的问题

http://yunzhongxia.javaeye.com/blog/620042
Azrael99999 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 leemiki 的回复:]

引用 2 楼 azrael99999 的回复:
这个不对啊 它只是把鼠标滚动事件 屏蔽了
但我还是能拉 滚动条的啊


那你的需求不一样!!!

产生原因是Flex的内部渲染机制所致,其实这种情况是可以避免的

你肯定是代码哪里书写的方式不对才导致~~~
[/Quote]
。。。。。。我也知道 肯定有问题啊
但我 想不出来 那里 出问题啊

我看过 每行的 data 都是 正确的
可能是 渲染 itemrender的 时候
新增的itemrender 把 上面的 itemrender 覆盖掉了 
请问   大概 怎么能查到这个问题 
Azrael99999 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xuhuanchao 的回复:]

flex list组件使用渲染器都有这种情况

Google下有解决方案
[/Quote]
。。。。。。我 GOOGLE 不到啊。。。。。。
水中影子 2010-09-28
  • 打赏
  • 举报
回复
flex list组件使用渲染器都有这种情况

Google下有解决方案
leemiki 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 azrael99999 的回复:]
这个不对啊 它只是把鼠标滚动事件 屏蔽了
但我还是能拉 滚动条的啊
[/Quote]

那你的需求不一样!!!

产生原因是Flex的内部渲染机制所致,其实这种情况是可以避免的

你肯定是代码哪里书写的方式不对才导致~~~

Azrael99999 2010-09-28
  • 打赏
  • 举报
回复
AdvancedDataGrid 的数据源
肯定 添加了
我后来查过 AdvancedDataGrid 的 数据源是对的
而且 我 查过 每一行 的 data 是正确的 。。。。。。
很有可能 是 我新添加的 那行 把 上面的行 覆盖掉了
但我就是不明白 为什么会产生 这样的 情况
奋斗并快乐着 2010-09-28
  • 打赏
  • 举报
回复
当滚动的时候,只触发了set data,原来的控件什么的不变,需要自己根据数据变化/移除/隐藏
advanceddatagrid的bug
奋斗并快乐着 2010-09-28
  • 打赏
  • 举报
回复
碰到过,显示数据的逻辑放在updateDisplayList里就会乱
改到下边这里就好了
public override function set data(value:Object):void{
niwenbin416 2010-09-28
  • 打赏
  • 举报
回复
itemrender在FELX内部机制中有个POOL的概念,只会渲染可见元素不可见的它会回收

LZ是不是添加一条数据可是在AdvancedDataGrid 的数据源中没有更新呢···所以当你拖动后它从新渲染从POOL中取不到你添加的那条数据。
CreateAName 2010-09-28
  • 打赏
  • 举报
回复
你可以从逻辑上解决!一旦有拖动和滚动之类的非编辑事件发生!就结束grid的编辑状态!
Azrael99999 2010-09-28
  • 打赏
  • 举报
回复
这个不对啊 它只是把鼠标滚动事件 屏蔽了
但我还是能拉 滚动条的啊

4,327

社区成员

发帖
与我相关
我的任务
社区描述
多媒体/设计 Flex
社区管理员
  • Flex
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧