首页 > 技术文章 > OAF中 遍历HGrid组件中的所有VO行

huanghongbo 2016-10-25 18:42 原文

 在HGrid组件中有如下所示的HeaderVO和LineVO

需要在头上的LOV中触发事件去更新行VO中的值,LOV事件的处理方法见 getLovParameter ,但是由于HGrid的特殊性,不能取到当前事件行,所以建议在VO中新增一个transection的变量,例如LovChangeFlag。

 

选择LOV的事件后设置该值为Y

public void setAccountItemId(Number value)
{
setAttributeInternal(ACCOUNTITEMID, value);
setLovChangeFlag("Y");
}

PFR 中LOV事件处理

else if (pageContext.isLovEvent()) {

else if ("AccountItemCode".equalsIgnoreCase(lovInputSourceId)) {
OAHGridBean hGridBean = 
(OAHGridBean)webBean.findChildRecursive("AccountHgrid");
OAHGridQueriedRowEnumerator hgridEnum = 
new OAHGridQueriedRowEnumerator(pageContext, hGridBean);

am.drAccountChangeFin(hgridEnum);
}

}

am中事件处理

  public void drAccountChangeFin(OAHGridQueriedRowEnumerator hgridEnum)
  {
      
    while (hgridEnum.hasMoreElements())
    {
      Row rowToUpdate = (Row)hgridEnum.nextElement();
      if (rowToUpdate != null)
      {
        String lovChangeFlag = 
          (String)rowToUpdate.getAttribute("LovChangeFlag");
        if ("Y".equals(lovChangeFlag)) //得到触发LOV事件的行
        {
          rowToUpdate.setAttribute("LovChangeFlag", "N");  //得到后再将此值设为N
                    Number headerId= 
            (Number)rowToUpdate.getAttribute("HeaderId");
          //业务代码
          //...
            while (hgridEnum.hasMoreElements())
                {
                  rowToUpdate = (Row)hgridEnum.nextElement();
                  Number currentHeaderId = 
                    (Number)rowToUpdate.getAttribute("HeaderId");
                    //此处判断遍历得到的row是否是LINEVO中的数据
                  if (headerId.equals(currentHeaderId))
                  {
                    rowToUpdate.setAttribute("XXX", value );
                  }
                }
        }
      }
    }
  }    

OAHGridQueriedRowEnumerator会将HGrid中所有的数据放入枚举中,并且会将HeaderVO中的所有数据放在前面,将LineVO中的所有数据放在后面,所以不用担心在遍历的时候会先遍历到LineVO中的数据。

推荐阅读