由于项目中有统计部分,不得不绘制表格,如果是打印,直接用插件即可,但需要在打印之前在画面上显示表格预览的效果。查询了一下,Flex 可以直接绘制表格,而且很多属性和 CSS 的属性很相似,用起来很顺手。
代码:
- <?xml version="1.0"?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
- xmlns:s="library://ns.adobe.com/flex/spark">
- <mx:Style>
- @namespace mx "library://ns.adobe.com/flex/mx";
- .title {
- border-style:solid;
- background-color:#FFFFFF;
- horizontal-align:center;
- vertical-align:middle;
- font-family:"宋体";
- font-size:11;
- font-weight:bold;
- }
- .left {
- border-style:solid;
- background-color:#FFFFFF;
- horizontal-align:left;
- vertical-align:bottom;
- padding-left:3px;
- padding-right:3px;
- }
- .center {
- border-style:solid;
- background-color:#FFFFFF;
- horizontal-align:center;
- vertical-align:bottom;
- padding-left:3px;
- padding-right:3px;
- }
- .right {
- border-style:solid;
- background-color:#FFFFFF;
- horizontal-align:right;
- vertical-align:bottom;
- padding-left:3px;
- padding-right:3px;
- }
- </mx:Style>
- <mx:Grid id="myGrid" borderStyle="solid" horizontalGap="0" verticalGap="0">
- <mx:GridRow width="600" height="20">
- <mx:GridItem styleName="title" colSpan="2">
- <s:Label text="统 计 项 目"/>
- </mx:GridItem>
- <mx:GridItem styleName="title" colSpan="4">
- <s:Label text="月 度 统 计"/>
- </mx:GridItem>
- <mx:GridItem styleName="title" colSpan="4">
- <s:Label text="年 度 统 计"/>
- </mx:GridItem>
- </mx:GridRow>
- <!-- 第一行 -->
- <mx:GridRow width="600" height="18">
- <mx:GridItem width="20" styleName="center">
- <s:Label text="1"/>
- </mx:GridItem>
- <mx:GridItem width="100" styleName="left">
- <s:Label text="检查总数"/>
- </mx:GridItem>
- <mx:GridItem width="80" styleName="right">
- <s:Label text="1"/>
- </mx:GridItem>
- <mx:GridItem width="80" styleName="center">
- <s:Label text="个"/>
- </mx:GridItem>
- <mx:GridItem width="80" styleName="right">
- <s:Label text="2"/>
- </mx:GridItem>
- <mx:GridItem width="80" styleName="center">
- <s:Label text="个"/>
- </mx:GridItem>
- <mx:GridItem width="80" styleName="right">
- <s:Label text="3"/>
- </mx:GridItem>
- <mx:GridItem width="80" styleName="center">
- <s:Label text="个"/>
- </mx:GridItem>
- <mx:GridItem width="80" styleName="right">
- <s:Label text="4"/>
- </mx:GridItem>
- <mx:GridItem width="80" styleName="center">
- <s:Label text="个"/>
- </mx:GridItem>
- </mx:GridRow>
- </mx:Grid>
- </mx:Application>
效果:
但有一个很让人头疼的问题就是,表格中的线很粗,原因是两个单元格的两条线不会叠在一起,而是并排的,如果把一个格子的线拿掉,则表格看起来很乱,如下:
目前还没找到解决方法,也就暂时画粗线了。
至于动态生成行,和 JSP 中生成行差不多,需要 NEW 一个个对象,并 AddChild 就可以了。
代码:
- <?xml version="1.0"?>
- <mx:Application borderStyle="none" xmlns:mx="http://www.adobe.com/2006/mxml">
- <mx:Script>
- <![CDATA[
- import mx.controls.Button;
- import mx.controls.TextInput;
- import mx.controls.ComboBase;
- import mx.containers.GridItem;
- import mx.containers.GridRow;
- private var gridRow:GridRow;
- private var i:int =0;
- private var btn:Button;
- public function addMore():void{
- gridRow = new GridRow();
- var item1:GridItem = new GridItem();
- var combox1:ComboBox = new ComboBox();
- item1.addChild(combox1);
- var item2:GridItem = new GridItem();
- var text:TextInput = new TextInput();
- item2.addChild(text);
- var item3:GridItem = new GridItem();
- var text1:TextInput = new TextInput();
- item3.addChild(text1);
- var item4:GridItem = new GridItem();
- var text2:TextInput = new TextInput();
- item4.addChild(text2);
- var item5:GridItem = new GridItem();
- btn= new Button();
- btn.addEventListener(MouseEvent.CLICK,removeGridRow);
- btn.label='移除'+(++i);
- item5.addChild(btn);
- gridRow.addChild(item1);
- gridRow.addChild(item2);
- gridRow.addChild(item3);
- gridRow.addChild(item4);
- gridRow.addChild(item5);
- this.temp.addChild(gridRow);
- }
- public function removeGridRow(event:MouseEvent):void{
- this.gridRow.removeEventListener(MouseEvent.CLICK,removeGridRow);
- var row:GridRow = event.currentTarget.parent.parent as GridRow;
- this.temp.removeChild(row);
- }
- ]]>
- </mx:Script>
- <mx:Panel title="Grid Container Example" height="75%" width="75%"
- paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10">
- <mx:Grid id="temp">
- <mx:GridRow>
- <mx:GridItem>
- <mx:Text text="模版设置1" width="100"/>
- </mx:GridItem>
- <mx:GridItem>
- <mx:Text text="模版设置2" width="100"/>
- </mx:GridItem>
- <mx:GridItem>
- <mx:Text text="模版设置3" width="100"/>
- </mx:GridItem>
- <mx:GridItem>
- <mx:Text text="模版设置4" width="100"/>
- </mx:GridItem>
- <mx:GridItem>
- <mx:Text text="操作" width="100"/>
- </mx:GridItem>
- </mx:GridRow>
- <mx:GridRow>
- <mx:GridItem>
- <mx:ComboBox id="a"/>
- </mx:GridItem>
- <mx:GridItem>
- <mx:TextInput name="a"/>
- </mx:GridItem>
- <mx:GridItem>
- <mx:TextInput name="a"/>
- </mx:GridItem>
- <mx:GridItem>
- <mx:TextInput name="a"/>
- </mx:GridItem>
- <mx:GridItem>
- <mx:Button label="增加" click="addMore()"/>
- </mx:GridItem>
- </mx:GridRow>
- </mx:Grid>
- </mx:Panel>
- </mx:Application>
效果:
要注意一点就是:如果是查询出了一个 List 集合,需要循环绘制到画面中,但在第二次查询出数据源后,需要把前一次画面中生成的行全部删除掉,否则行会一直递增并超出浏览器。
移除方法是:
- // 清除上次画面中动态生成的行
- while (null != this.myGrid.getChildByName("auto")) {
- this.myGrid.removeChild(this.myGrid.getChildByName("auto"));
- }
所以在动态添加行的时候,需要给每行一个 name,方法是:
- gridRow = new GridRow();
- gridRow.name = "auto";