Flex4之DataGrid增删改同步数据库及页面数据示例总结
有关Flex的DataGrid文章的确不少,都是零零碎碎的,目前还没有发现有个完整的例子供网友参考,这次我花了两天时间做了下Flex关于DataGrid一个指标数据管理系统,当然设计到的mxml会很多,大都是与DataGrid相关,我就抽取最常用的DataGrid的增删改同步数据库及页面数据来讲解
首先整理下思路,首先无论是删除还是修改,必须得获取当前行所在的记录,那么可以设置个全局变量,当DataGrid的itemClick事件出发时将选中的行赋给全局变量
[Bindable]public var acItemsSelected:Object;;
//事件方法
protected function myGrid_itemClickHandler(event:ListEvent):void
{
acItemsSelected = myGrid.selectedItem;
}
这样的话就可以获得了当前选中的对象了
如果删除和修改的话,通常传到后台的肯定含有对象的ID项,那么这个ID是怎么获取的呢,通过acItemsSelected.xxxId能获取,那么这个xxxId必须是在DataGrid中有,设置为不显示就好了,例如我就是这么做的
<mx:DataGridColumn visible="false" dataField="targetCalId" />
这样的话,要更改的数据等都能通过ID传到后台查询相应对象更改删除了,接下来的事是比较重要的,如果光删除数据库是不行的,页面数据也要保持同步,关于dataGrid也没有好的刷新方法,所以你上网一搜,可能有的人会告诉你对于删除这样做:dataArray.removeItemAt(myGrid.selectedIndex);
增加这样做:dataArray.addItemAt(obj,0);
修改这样做:dataArray.setItemAt(obj,myGrid.selectedIndex);
这里说的dataArray是指的是DataGrid的DataProvider的值集合【当然肯定得声明称全局变量】
这样的写法呢可能你觉得,哎,是对的,其实不然,这并没有真正起到作用,对于FLEX来说缓存是相当大的,不行的话你通过这个修改行记录的属性后,再点这行记录的属性编辑页面发现值根本没改,所以所没有进行二次查询数据库了,利用的是缓存。即便是你调用了初始化查询数据库的那个方法,也是不行的,还是有缓存,最好的做法就是,抛弃上面的三种写法,只需要两步就可以实现刷新,第一初始化DataGrid的那个方法请求必须是URLRequest的,添加一个参数类似于
var u:URLVariables=new URLVariables("temp="+Math.random());
当然不一定非要是temp什么名字都行,然后在返回操作成功提示后调用这个初始化方法,你会发现真的起作用了。
其实建议关于URLRequest传参数的最好带上这个参数,也不费事,可以在很多场合下解决缓存不更新问题
说了这么多其实就是先做好个思想准备,理清思路,下面我就贴上我的一段代码
mxml文件
<span style="font-size: medium;">public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); TTargetCalDAO dao=new TTargetCalDAO(); List<TTargetCal> cals=dao.findAll(); JSONArray json = JSONArray.fromObject(cals); String datas = json.toString(); System.out.println(datas); System.out.println(datas); response.setCharacterEncoding("UTF-8"); response.getWriter().write(datas); }</span>
DeleteTargetCalServlet
<span style="font-size: medium;">public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { TTargetCalDAO dao = new TTargetCalDAO(); String id = request.getParameter("id"); if (DataOptUtils.isNotNull(id)) { TTargetCal rr = dao.findById(Integer.valueOf(id)); dao.delete(rr); } response.setCharacterEncoding("UTF-8"); response.getWriter().write("result=delete"); }</span>
AddTargetCalServlet
<span style="font-size: medium;">public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); TTargetCalDAO dao=new TTargetCalDAO(); String targetCal=request.getParameter("targetCal"); String targetTypeName=request.getParameter("targetTypeName"); TTargetCal cal=new TTargetCal(); cal.setTargetCal(targetCal); cal.setTargetTypeName(targetTypeName); dao.save(cal); TTargetCal re =dao.findById(dao.findLastId()); JSONObject json = JSONObject.fromObject(re); String datas = json.toString(); response.getWriter().write("result=add;datas=" + datas); }</span>
UpdateTargetCalServlet
<span style="font-size: medium;">public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); TTargetCalDAO dao = new TTargetCalDAO(); String targetTypeName = request.getParameter("targetTypeName"); String targetCal = request.getParameter("targetCal"); String id = request.getParameter("id"); if (DataOptUtils.isNotNull(id)) { TTargetCal rr = dao.findById(Integer.valueOf(id)); if(DataOptUtils.isNotNull(targetCal)){ rr.setTargetCal(targetCal); } if(DataOptUtils.isNotNull(targetTypeName)){ rr.setTargetTypeName(targetTypeName); } dao.merge(rr); TTargetCal tc = dao.findById(rr.getTargetCalId()); JSONObject json = JSONObject.fromObject(tc); String datas = json.toString(); response.getWriter().write("result=update;datas=" + datas); } }</span>
这里的DataOptUtils是我写的一个数据处理类,判断是否为空什么的
还有就是TTargetCal
<span style="font-size: medium;">@Entity @Table(name = "t_target_cal", catalog = "sxtele") public class TTargetCal implements java.io.Serializable { // Fields private Integer targetCalId; private String targetCal; private String targetTypeName; // Constructors /** default constructor */ public TTargetCal() { } /** minimal constructor */ public TTargetCal(String targetCal) { this.targetCal = targetCal; } /** full constructor */ public TTargetCal(String targetCal, String targetTypeName) { this.targetCal = targetCal; this.targetTypeName = targetTypeName; } // Property accessors @Id @GeneratedValue @Column(name = "Target_cal_id", unique = true, nullable = false) public Integer getTargetCalId() { return this.targetCalId; } public void setTargetCalId(Integer targetCalId) { this.targetCalId = targetCalId; } @Column(name = "Target_cal", nullable = false, length = 50) public String getTargetCal() { return this.targetCal; } public void setTargetCal(String targetCal) { this.targetCal = targetCal; } @Column(name = "Target_type_name", length = 50) public String getTargetTypeName() { return this.targetTypeName; } public void setTargetTypeName(String targetTypeName) { this.targetTypeName = targetTypeName; } }</span>