jsp 自定义标签实现表格转载http://blog.csdn.net/chenshuang_com

  1. package com.ts.taglib.html;
  2. import java.lang.reflect.Field;
  3. import javax.servlet.jsp.tagext.BodyTagSupport;
  4. /**
  5. * 事件处理
  6. * @author 陈双
  7. * @date 2012-09-22
  8. * @mail [email protected]
  9. */
  10. public abstract class BaseHandlerTag extends BodyTagSupport{
  11. private static final long serialVersionUID = 715968190636480266L;
  12. private String onclick;
  13. private String ondblclick;
  14. private String onmouseover;
  15. private String onmouseout;
  16. private String onmousedown;
  17. private String onmouseup;
  18. private String onmousemove;
  19. private String onkeydown;
  20. private String onkeyup;
  21. private String onkeypress;
  22. private String onfocus;
  23. private String onblur;
  24. private String onchange;
  25. private String onselect;
  26. private String styleId;
  27. private String style;
  28. private String styleClass;
  29. private boolean readonly;
  30. private boolean disabled;
  31. public BaseHandlerTag()
  32. {
  33. super();
  34. init();
  35. }
  36. public void init()
  37. {
  38. onclick=null;
  39. ondblclick=null;
  40. onmouseover=null;
  41. onmouseout=null;
  42. onmousedown=null;
  43. onmouseup=null;
  44. onmousemove=null;
  45. onkeydown=null;
  46. onkeyup=null;
  47. onkeypress=null;
  48. onfocus=null;
  49. onblur=null;
  50. onchange=null;
  51. onselect=null;
  52. readonly=false;
  53. disabled=false;
  54. }
  55. public String getOnclick() {
  56. return onclick;
  57. }
  58. public void setOnclick(String onclick) {
  59. this.onclick = onclick;
  60. }
  61. public String getOndblclick() {
  62. return ondblclick;
  63. }
  64. public void setOndblclick(String ondblclick) {
  65. this.ondblclick = ondblclick;
  66. }
  67. public String getOnmouseover() {
  68. return onmouseover;
  69. }
  70. public void setOnmouseover(String onmouseover) {
  71. this.onmouseover = onmouseover;
  72. }
  73. public String getOnmouseout() {
  74. return onmouseout;
  75. }
  76. public void setOnmouseout(String onmouseout) {
  77. this.onmouseout = onmouseout;
  78. }
  79. public String getOnmousedown() {
  80. return onmousedown;
  81. }
  82. public void setOnmousedown(String onmousedown) {
  83. this.onmousedown = onmousedown;
  84. }
  85. public String getOnmouseup() {
  86. return onmouseup;
  87. }
  88. public void setOnmouseup(String onmouseup) {
  89. this.onmouseup = onmouseup;
  90. }
  91. public String getOnmousemove() {
  92. return onmousemove;
  93. }
  94. public void setOnmousemove(String onmousemove) {
  95. this.onmousemove = onmousemove;
  96. }
  97. public String getOnkeydown() {
  98. return onkeydown;
  99. }
  100. public void setOnkeydown(String onkeydown) {
  101. this.onkeydown = onkeydown;
  102. }
  103. public String getOnkeyup() {
  104. return onkeyup;
  105. }
  106. public void setOnkeyup(String onkeyup) {
  107. this.onkeyup = onkeyup;
  108. }
  109. public String getOnkeypress() {
  110. return onkeypress;
  111. }
  112. public void setOnkeypress(String onkeypress) {
  113. this.onkeypress = onkeypress;
  114. }
  115. public String getOnfocus() {
  116. return onfocus;
  117. }
  118. public void setOnfocus(String onfocus) {
  119. this.onfocus = onfocus;
  120. }
  121. public String getOnblur() {
  122. return onblur;
  123. }
  124. public void setOnblur(String onblur) {
  125. this.onblur = onblur;
  126. }
  127. public String getOnchange() {
  128. return onchange;
  129. }
  130. public void setOnchange(String onchange) {
  131. this.onchange = onchange;
  132. }
  133. public String getOnselect() {
  134. return onselect;
  135. }
  136. public void setOnselect(String onselect) {
  137. this.onselect = onselect;
  138. }
  139. public String getStyleId() {
  140. return styleId;
  141. }
  142. public void setStyleId(String styleId) {
  143. this.styleId = styleId;
  144. }
  145. public String getStyle() {
  146. return style;
  147. }
  148. public void setStyle(String style) {
  149. this.style = style;
  150. }
  151. public String getStyleClass() {
  152. return styleClass;
  153. }
  154. public void setStyleClass(String styleClass) {
  155. this.styleClass = styleClass;
  156. }
  157. public boolean isReadonly() {
  158. return readonly;
  159. }
  160. public void setReadonly(boolean readonly) {
  161. this.readonly = readonly;
  162. }
  163. public boolean isDisabled() {
  164. return disabled;
  165. }
  166. public void setDisabled(boolean disabled) {
  167. this.disabled = disabled;
  168. }
  169. public String prepareStyles()
  170. {
  171. StringBuffer handlers=new StringBuffer();
  172. prepareAttribute(handlers,"id",getStyleId());
  173. prepareAttribute(handlers,"style",getStyle());
  174. prepareAttribute(handlers,"class",getStyleClass());
  175. return handlers.toString();
  176. }
  177. public String prepareEvents()
  178. {
  179. StringBuffer handlers=new StringBuffer();
  180. prepareMouseEvents(handlers);
  181. prepareKeyEvents(handlers);
  182. prepareFocusEvents(handlers);
  183. prepareTextEvents(handlers);
  184. return handlers.toString();
  185. }
  186. public void prepareMouseEvents(StringBuffer handlers)
  187. {
  188. prepareAttribute(handlers,"onclick",getOnclick());
  189. prepareAttribute(handlers,"ondblclick",getOndblclick());
  190. prepareAttribute(handlers,"onmouseover",getOnmouseover());
  191. prepareAttribute(handlers,"onmouseout",getOnmouseout());
  192. prepareAttribute(handlers,"onmousedown",getOnmousedown());
  193. prepareAttribute(handlers,"onmouseup",getOnmouseup());
  194. prepareAttribute(handlers,"onmousemove",getOnmousemove());
  195. }
  196. public void prepareKeyEvents(StringBuffer handlers)
  197. {
  198. prepareAttribute(handlers,"onkeydown",getOnkeydown());
  199. prepareAttribute(handlers,"onkeyup",getOnkeyup());
  200. prepareAttribute(handlers,"onkeypress",getOnkeypress());
  201. }
  202. public void prepareFocusEvents(StringBuffer handlers)
  203. {
  204. prepareAttribute(handlers,"onfocus",getOnfocus());
  205. prepareAttribute(handlers,"onblur",getOnblur());
  206. if(isReadonly())
  207. {
  208. handlers.append(" readonly=\"readonly\"");
  209. }
  210. if(isDisabled())
  211. {
  212. handlers.append(" disabled=\"disabled\"");
  213. }
  214. }
  215. public void prepareTextEvents(StringBuffer handlers)
  216. {
  217. prepareAttribute(handlers,"onselect",getOnselect());
  218. prepareAttribute(handlers,"onchange",getOnchange());
  219. }
  220. public void prepareAttribute(StringBuffer handler,String property,Object value)
  221. {
  222. if(handler!=null&&property!=null&&value!=null)
  223. {
  224. handler.append(" ");
  225. handler.append(property);
  226. handler.append("=\"");
  227. handler.append(value);
  228. handler.append("\"");
  229. }
  230. }
  231. /**
  232. * 取值
  233. * @param name
  234. * @return
  235. * @throws SecurityException
  236. * @throws IllegalArgumentException
  237. * @throws NoSuchFieldException
  238. * @throws IllegalAccessException
  239. */
  240. public Object findValue(String name) throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException
  241. {
  242. String[] elements=name.split("\\.");
  243. if(elements!=null&&elements.length>0)
  244. {
  245. Object bean=pageContext.getAttribute(elements[0],2);
  246. if(elements.length>2)
  247. {
  248. for(int i=1;i<elements.length;i++)
  249. {
  250. bean=getValue(bean, elements[i]);
  251. }
  252. return bean;
  253. }
  254. else
  255. {
  256. return getValue(bean, elements[1]);
  257. }
  258. }
  259. return null;
  260. }
  261. public Object getValue(Object bean,String property) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException
  262. {
  263. if(bean!=null&&property!=null)
  264. {
  265. Field field=bean.getClass().getDeclaredField(property);
  266. field.setAccessible(true);
  267. return field.get(bean);
  268. }
  269. return null;
  270. }
  271. public void release() {
  272. // TODO Auto-generated method stub
  273. super.release();
  274. init();
  275. }
  276. }
  277. package com.ts.taglib.html;
  278. import java.io.IOException;
  279. import java.text.SimpleDateFormat;
  280. import java.util.ArrayList;
  281. import java.util.List;
  282. import java.util.Map;
  283. import javax.servlet.jsp.JspException;
  284. import com.ts.taglib.data.Column;
  285. import com.ts.taglib.data.DataGrid;
  286. /**
  287. * 表格控件
  288. * @author 陈双
  289. * @date 2012-09-22
  290. * @mail [email protected]
  291. *
  292. */
  293. public class TableTag extends BaseHandlerTag {
  294. private static final long serialVersionUID = -5642687627324772161L;
  295. private String name;//名称
  296. private String width;//宽度
  297. private String height;//高度
  298. private String data;//取数
  299. private boolean multiple;//是否多行勾选框
  300. public TableTag()
  301. {
  302. super();
  303. name=null;
  304. width=null;
  305. height=null;
  306. data=null;
  307. multiple=false;
  308. }
  309. public String getName() {
  310. return name;
  311. }
  312. public void setName(String name) {
  313. this.name = name;
  314. }
  315. public String getWidth() {
  316. return width;
  317. }
  318. public void setWidth(String width) {
  319. this.width = width;
  320. }
  321. public String getHeight() {
  322. return height;
  323. }
  324. public void setHeight(String height) {
  325. this.height = height;
  326. }
  327. public String getData() {
  328. return data;
  329. }
  330. public void setData(String data) {
  331. this.data = data;
  332. }
  333. public boolean isMultiple() {
  334. return multiple;
  335. }
  336. public void setMultiple(boolean multiple) {
  337. this.multiple = multiple;
  338. }
  339. public int doEndTag() throws JspException {
  340. try {
  341. pageContext.getOut().print(createTable());
  342. } catch (IOException e) {
  343. throw new JspException(e.getMessage());
  344. }
  345. return 6;
  346. }
  347. public int doStartTag() throws JspException {
  348. pageContext.setAttribute("columnHeader", new ArrayList(),2);
  349. return 1;
  350. }
  351. /**
  352. * 实现方式由Java构建所需的数据然后调用js创建表格
  353. * @return
  354. * @throws JspException
  355. */
  356. public String createTable()throws JspException
  357. {
  358. StringBuffer handlers=new StringBuffer("<div id=\"main_grid_");
  359. handlers.append(getName());
  360. handlers.append("\"");
  361. handlers.append(" style=\"border:solid 1 #cccccc;");
  362. handlers.append("width:");
  363. handlers.append(getWidth());
  364. handlers.append(";height:");
  365. handlers.append(Integer.parseInt(getHeight())+25);
  366. handlers.append(";\">\n");
  367. handlers.append("<script type=\"text/javascript\" charset=\"utf-8\">\n");
  368. //处理数据
  369. List headerList=(List) pageContext.getAttribute("columnHeader", 2);
  370. if(headerList==null||headerList.size()==0)
  371. {
  372. throw new JspException("Table name is "+name+",列数必须大于0!");
  373. }
  374. handlers.append(getColumns(headerList));
  375. List list=(List) pageContext.getAttribute(data, 2);
  376. handlers.append(getRows(list));
  377. //调用js生成表格对象
  378. handlers.append("CreateTable(‘");
  379. handlers.append(getName());
  380. handlers.append("‘,‘main_grid_");
  381. handlers.append(getName());
  382. handlers.append("‘,");
  383. handlers.append(getWidth());
  384. handlers.append(",");
  385. handlers.append(getHeight());
  386. handlers.append(",");
  387. handlers.append(isMultiple());
  388. handlers.append(",getColumns_grid_");
  389. handlers.append(getName());
  390. handlers.append("(),getRows_grid_");
  391. handlers.append(getName());
  392. handlers.append("());\n</script>\n");
  393. handlers.append("<table cellspacing=0 height=25 width=");
  394. handlers.append(getWidth());
  395. handlers.append(" >\n<tr>\n<td style=\"height:18px;cursor:default;font-size:12px;font-family:verdana;text-align:right;\">共");
  396. Object total=pageContext.getAttribute("total", 2);
  397. if(total==null)
  398. {
  399. total=0;
  400. }
  401. handlers.append(total);
  402. handlers.append("页  当前显示第");
  403. Object current=pageContext.getAttribute("current",2);
  404. if(current==null)
  405. {
  406. current=0;
  407. }
  408. handlers.append(current);
  409. handlers.append("页  <a href=\"javascript:lastPage();\">上页</a> <a href=\"javascript:nextPage();\">下页</a>  <input type=\"hidden\" name=\"currentPage\"/>第<input name=\"toPage\" type=\"text\" size=3/>页</td>\n</tr>\n</table>\n");
  410. handlers.append("</div>\n");
  411. return handlers.toString();
  412. }
  413. /**
  414. * 构建所有的列
  415. * @param list
  416. * @return
  417. * @throws JspException
  418. */
  419. private String getColumns(List list) throws JspException
  420. {
  421. StringBuffer columns=new StringBuffer();
  422. if(list!=null&&list.size()>0)
  423. {
  424. columns.append("function getColumns_grid_");
  425. columns.append(name);
  426. columns.append("()\n{\n");
  427. columns.append("var columns=new Array();\n");
  428. for(int i=0;i<list.size();i++)
  429. {
  430. Column column=(Column) list.get(i);
  431. columns.append("var gridColumn");
  432. columns.append(i);
  433. columns.append("=new GridColumn(‘");
  434. columns.append(column.getName());
  435. columns.append("‘,‘");
  436. columns.append(column.getLabel());
  437. columns.append("‘,‘");
  438. columns.append(column.getType());
  439. columns.append("‘,");
  440. columns.append(column.getWidth());
  441. columns.append(",");
  442. columns.append(column.getHeight());
  443. columns.append(",");
  444. columns.append("null");
  445. columns.append(",");
  446. columns.append(column.isHidden());
  447. columns.append(",");
  448. columns.append(column.isDisabled());
  449. columns.append(",");
  450. columns.append(column.isSum());
  451. columns.append(",");
  452. columns.append(column.getSize());
  453. columns.append(",");
  454. columns.append(column.getColspan());
  455. if(column.getOndblclick()!=null)
  456. {
  457. columns.append(",\"");
  458. columns.append(column.getOndblclick());
  459. columns.append("\",");
  460. }
  461. else
  462. {
  463. columns.append(",");
  464. columns.append("null,");
  465. }
  466. if(column.getDrillEvent()!=null)
  467. {
  468. columns.append("\"");
  469. columns.append(column.getDrillEvent());
  470. columns.append("\");\n");
  471. }
  472. else
  473. {
  474. columns.append("null);\n");
  475. }
  476. columns.append("columns[");
  477. columns.append(i);
  478. columns.append("]=gridColumn");
  479. columns.append(i);
  480. columns.append(";\n");
  481. }
  482. columns.append("return columns;\n}");
  483. }
  484. return columns.toString();
  485. }
  486. /**
  487. * 构建rows数据集将Java中的List<map>转成javascript中List<Map>形式
  488. * @param list列表
  489. * @return
  490. */
  491. public String getRows(List list)
  492. {
  493. StringBuffer handlers=new StringBuffer("\n function getRows_grid_");
  494. handlers.append(getName());
  495. handlers.append("()\n{\n");
  496. SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  497. handlers.append("var rows=new List();\n");
  498. if(list!=null&&list.size()>0)
  499. {
  500. for(int i=0;i<list.size();i++)
  501. {
  502. handlers.append("var map");
  503. handlers.append(i);
  504. handlers.append("=new Map();\n");
  505. Map row=(Map) list.get(i);
  506. for(Object key:row.keySet())
  507. {
  508. handlers.append("map");
  509. handlers.append(i);
  510. handlers.append(".put(‘");
  511. handlers.append(key);
  512. if(row.get(key)==null)
  513. {
  514. handlers.append("‘,");
  515. handlers.append(row.get(key));
  516. handlers.append(");\n");
  517. }
  518. else
  519. {
  520. Object param=row.get(key);
  521. handlers.append("‘,‘");
  522. if(param.getClass().getName().equals("java.sql.Timestamp")||param.getClass().getName().equals("java.util.Date"))
  523. {
  524. handlers.append(dateFormat.format(param));
  525. }
  526. else
  527. {
  528. handlers.append(row.get(key));
  529. }
  530. handlers.append("‘);\n");
  531. }
  532. }
  533. handlers.append("rows.add(map");
  534. handlers.append(i);
  535. handlers.append(");\n");
  536. }
  537. }
  538. handlers.append("return rows;\n");
  539. handlers.append("\n}\n");
  540. return handlers.toString();
  541. }
  542. public void release() {
  543. super.release();
  544. name=null;
  545. width=null;
  546. height=null;
  547. data=null;
  548. multiple=false;
  549. }
  550. }
  551. <P> </P><P>package com.ts.taglib.html;</P><P>import java.util.List;</P><P>import javax.servlet.jsp.JspException;
  552. import javax.servlet.jsp.tagext.TagSupport;</P><P>import com.ts.taglib.data.Column;
  553. /**
  554. * 构建列控件
  555. * @author 陈双
  556. * @date 2012-09-23
  557. * @mail <A href="mailto:[email protected]">[email protected]</A>
  558. */
  559. public class ColumnTag extends TagSupport {</P><P> private static final long serialVersionUID = 5477014869077280329L;
  560. private String name;//名称
  561. private String label;//标签
  562. private String type;//类型
  563. private String width;//宽度
  564. private String height;//高度
  565. private String size;//字符个数
  566. private String data;//如果是combox时,选项取数来源
  567. private String colspan;//跨列
  568. private String ondblclick;//双击事件,只是针对参照列
  569. private String drillEvent;//数据钻取时调用的函数
  570. private boolean hidden;//是否隐藏
  571. private boolean disabled;//是否可用
  572. private boolean sum;//是否汇总
  573. public ColumnTag()
  574. {
  575. super();
  576. name=null;
  577. label=null;
  578. type=null;
  579. width=null;
  580. height=null;
  581. size="14";
  582. data=null;
  583. colspan=null;
  584. ondblclick=null;
  585. drillEvent=null;
  586. hidden=false;
  587. disabled=false;
  588. sum=false;
  589. }
  590. public String getName() {
  591. return name;
  592. }
  593. public void setName(String name) {
  594. this.name = name;
  595. }
  596. public String getLabel() {
  597. return label;
  598. }
  599. public void setLabel(String label) {
  600. this.label = label;
  601. }
  602. public String getType() {
  603. return type;
  604. }
  605. public void setType(String type) {
  606. this.type = type;
  607. }
  608. public String getWidth() {
  609. return width;
  610. }</P><P> public void setWidth(String width) {
  611. this.width = width;
  612. }</P><P> public String getHeight() {
  613. return height;
  614. }</P><P> public void setHeight(String height) {
  615. this.height = height;
  616. }
  617. public String getSize() {
  618. return size;
  619. }
  620. public void setSize(String size) {
  621. this.size = size;
  622. }
  623. public String getData() {
  624. return data;
  625. }
  626. public void setData(String data) {
  627. this.data = data;
  628. }
  629. public String getColspan() {
  630. return colspan;
  631. }</P><P> public void setColspan(String colspan) {
  632. this.colspan = colspan;
  633. }
  634. public String getOndblclick() {
  635. return ondblclick;
  636. }
  637. public void setOndblclick(String ondblclick) {
  638. this.ondblclick = ondblclick;
  639. }
  640. public String getDrillEvent() {
  641. return drillEvent;
  642. }
  643. public void setDrillEvent(String drillEvent) {
  644. this.drillEvent = drillEvent;
  645. }
  646. public boolean isHidden() {
  647. return hidden;
  648. }
  649. public void setHidden(boolean hidden) {
  650. this.hidden = hidden;
  651. }
  652. public boolean isDisabled() {
  653. return disabled;
  654. }
  655. public void setDisabled(boolean disabled) {
  656. this.disabled = disabled;
  657. }
  658. public boolean isSum() {
  659. return sum;
  660. }</P><P> public void setSum(boolean sum) {
  661. this.sum = sum;
  662. }
  663. public int doEndTag() throws JspException {
  664. Column column=new Column();
  665. column.setName(name);
  666. column.setLabel(label);
  667. column.setType(type);
  668. column.setWidth(width);
  669. column.setHeight(height);
  670. column.setSize(size);
  671. column.setData(data);
  672. column.setColspan(colspan);
  673. column.setOndblclick(ondblclick);
  674. column.setDrillEvent(drillEvent);
  675. column.setHidden(hidden);
  676. column.setDisabled(disabled);
  677. column.setSum(sum);
  678. List list=(List)pageContext.getAttribute("columnHeader", 2);
  679. list.add(column);
  680. return 6;
  681. }
  682. public int doStartTag() throws JspException {
  683. return 0;
  684. }
  685. public void release() {</P><P>  super.release();
  686. name=null;
  687. label=null;
  688. type=null;
  689. width=null;
  690. height=null;
  691. data=null;
  692. colspan=null;
  693. size=null;
  694. ondblclick=null;
  695. drillEvent=null;
  696. hidden=false;
  697. disabled=false;
  698. sum=false;
  699. }
  700. }
  701. </P><P> </P><P>package com.ts.taglib.data;</P><P>import java.io.Serializable;
  702. /**
  703. * 列数据
  704. * @author 陈双
  705. * @date 2012-09-23
  706. * @mail <A href="mailto:[email protected]">[email protected]</A>
  707. */
  708. public class Column implements Serializable {</P><P> private static final long serialVersionUID = -2581722061552795107L;
  709. private String name;//名称
  710. private String label;//标签
  711. private String type;//类型
  712. private String width;//宽度
  713. private String height;//高度
  714. private String size;//字符个数
  715. private String data;//如果是combox时,选项取数来源
  716. private String colspan;//跨列
  717. private String rowspan;//跨行
  718. private String ondblclick;//双击事件,只是针对参照列
  719. private String drillEvent;//数据钻取时调用的函数
  720. private boolean hidden;//是否隐藏
  721. private boolean disabled;//是否可用
  722. private boolean sum;//是否汇总
  723. public String getName() {
  724. return name;
  725. }
  726. public void setName(String name) {
  727. this.name = name;
  728. }
  729. public String getLabel() {
  730. return label;
  731. }
  732. public void setLabel(String label) {
  733. this.label = label;
  734. }
  735. public String getType() {
  736. return type;
  737. }
  738. public void setType(String type) {
  739. this.type = type;
  740. }
  741. public String getWidth() {
  742. return width;
  743. }
  744. public void setWidth(String width) {
  745. this.width = width;
  746. }
  747. public String getHeight() {
  748. return height;
  749. }
  750. public void setHeight(String height) {
  751. this.height = height;
  752. }
  753. public String getSize() {
  754. return size;
  755. }
  756. public void setSize(String size) {
  757. this.size = size;
  758. }
  759. public String getData() {
  760. return data;
  761. }
  762. public void setData(String data) {
  763. this.data = data;
  764. }
  765. public String getColspan() {
  766. return colspan;
  767. }
  768. public void setColspan(String colspan) {
  769. this.colspan = colspan;
  770. }
  771. public String getRowspan() {
  772. return rowspan;
  773. }
  774. public void setRowspan(String rowspan) {
  775. this.rowspan = rowspan;
  776. }
  777. public String getOndblclick() {
  778. return ondblclick;
  779. }
  780. public void setOndblclick(String ondblclick) {
  781. this.ondblclick = ondblclick;
  782. }
  783. public String getDrillEvent() {
  784. return drillEvent;
  785. }
  786. public void setDrillEvent(String drillEvent) {
  787. this.drillEvent = drillEvent;
  788. }
  789. public boolean isHidden() {
  790. return hidden;
  791. }
  792. public void setHidden(boolean hidden) {
  793. this.hidden = hidden;
  794. }
  795. public boolean isDisabled() {
  796. return disabled;
  797. }
  798. public void setDisabled(boolean disabled) {
  799. this.disabled = disabled;
  800. }
  801. public boolean isSum() {
  802. return sum;
  803. }
  804. public void setSum(boolean sum) {
  805. this.sum = sum;
  806. }
  807. }</P><P>package com.ts.taglib.data;</P><P>import java.io.Serializable;
  808. import java.util.List;
  809. import java.util.Map;
  810. /**
  811. * 用于构建多级表头动态列表格对象
  812. * @author 陈双
  813. * @date 2012-09-22
  814. * @mail <A href="mailto:[email protected]">[email protected]</A>
  815. *
  816. */
  817. public class DataGrid implements Serializable {</P><P> private static final long serialVersionUID = 3814622301555705194L;
  818. private String name;//名称
  819. private String width;//宽度
  820. private String height;//高度
  821. private boolean multiple;//多行数据是否有勾选框
  822. private List<Column[]> columns;//多级动态列
  823. private List<Map<String,Object>> data;//行数据
  824. private String dblclick;//双击事件
  825. public String getName() {
  826. return name;
  827. }
  828. public void setName(String name) {
  829. this.name = name;
  830. }
  831. public String getWidth() {
  832. return width;
  833. }
  834. public void setWidth(String width) {
  835. this.width = width;
  836. }
  837. public String getHeight() {
  838. return height;
  839. }
  840. public void setHeight(String height) {
  841. this.height = height;
  842. }
  843. public boolean isMultiple() {
  844. return multiple;
  845. }
  846. public void setMultiple(boolean multiple) {
  847. this.multiple = multiple;
  848. }
  849. public List<Column[]> getColumns() {
  850. return columns;
  851. }
  852. public void setColumns(List<Column[]> columns) {
  853. this.columns = columns;
  854. }
  855. public List<Map<String, Object>> getData() {
  856. return data;
  857. }
  858. public void setData(List<Map<String, Object>> data) {
  859. this.data = data;
  860. }
  861. public String getDblclick() {
  862. return dblclick;
  863. }
  864. public void setDblclick(String dblclick) {
  865. this.dblclick = dblclick;
  866. }
  867. }
  868. </P><P>
  869. </P>
package com.ts.taglib.html;

import java.lang.reflect.Field;

import javax.servlet.jsp.tagext.BodyTagSupport;
/**
 * 事件处理
 * @author 陈双
 * @date 2012-09-22
 * @mail [email protected]
 */
public abstract class BaseHandlerTag extends BodyTagSupport{
    private static final long serialVersionUID = 715968190636480266L;
    private String onclick;
    private String ondblclick;
    private String onmouseover;
    private String onmouseout;
    private String onmousedown;
    private String onmouseup;
    private String onmousemove;
    private String onkeydown;
    private String onkeyup;
    private String onkeypress;
    private String onfocus;
    private String onblur;
    private String onchange;
    private String onselect;
    private String styleId;
    private String style;
    private String styleClass;
    private boolean readonly;
    private boolean disabled;
    public BaseHandlerTag()
    {
    	super();
    	init();
    }
    public void init()
    {
    	onclick=null;
    	ondblclick=null;
    	onmouseover=null;
    	onmouseout=null;
    	onmousedown=null;
    	onmouseup=null;
    	onmousemove=null;
    	onkeydown=null;
    	onkeyup=null;
    	onkeypress=null;
    	onfocus=null;
    	onblur=null;
    	onchange=null;
    	onselect=null;
    	readonly=false;
    	disabled=false;
    }
	public String getOnclick() {
		return onclick;
	}
	public void setOnclick(String onclick) {
		this.onclick = onclick;
	}
	public String getOndblclick() {
		return ondblclick;
	}
	public void setOndblclick(String ondblclick) {
		this.ondblclick = ondblclick;
	}
	public String getOnmouseover() {
		return onmouseover;
	}
	public void setOnmouseover(String onmouseover) {
		this.onmouseover = onmouseover;
	}
	public String getOnmouseout() {
		return onmouseout;
	}
	public void setOnmouseout(String onmouseout) {
		this.onmouseout = onmouseout;
	}
	public String getOnmousedown() {
		return onmousedown;
	}
	public void setOnmousedown(String onmousedown) {
		this.onmousedown = onmousedown;
	}
	public String getOnmouseup() {
		return onmouseup;
	}
	public void setOnmouseup(String onmouseup) {
		this.onmouseup = onmouseup;
	}
	public String getOnmousemove() {
		return onmousemove;
	}
	public void setOnmousemove(String onmousemove) {
		this.onmousemove = onmousemove;
	}
	public String getOnkeydown() {
		return onkeydown;
	}
	public void setOnkeydown(String onkeydown) {
		this.onkeydown = onkeydown;
	}
	public String getOnkeyup() {
		return onkeyup;
	}
	public void setOnkeyup(String onkeyup) {
		this.onkeyup = onkeyup;
	}
	public String getOnkeypress() {
		return onkeypress;
	}
	public void setOnkeypress(String onkeypress) {
		this.onkeypress = onkeypress;
	}
	public String getOnfocus() {
		return onfocus;
	}
	public void setOnfocus(String onfocus) {
		this.onfocus = onfocus;
	}
	public String getOnblur() {
		return onblur;
	}
	public void setOnblur(String onblur) {
		this.onblur = onblur;
	}
	public String getOnchange() {
		return onchange;
	}
	public void setOnchange(String onchange) {
		this.onchange = onchange;
	}
	public String getOnselect() {
		return onselect;
	}
	public void setOnselect(String onselect) {
		this.onselect = onselect;
	}
	public String getStyleId() {
		return styleId;
	}
	public void setStyleId(String styleId) {
		this.styleId = styleId;
	}
	public String getStyle() {
		return style;
	}
	public void setStyle(String style) {
		this.style = style;
	}
	public String getStyleClass() {
		return styleClass;
	}
	public void setStyleClass(String styleClass) {
		this.styleClass = styleClass;
	}
	public boolean isReadonly() {
		return readonly;
	}
	public void setReadonly(boolean readonly) {
		this.readonly = readonly;
	}
	public boolean isDisabled() {
		return disabled;
	}
	public void setDisabled(boolean disabled) {
		this.disabled = disabled;
	}
	public String prepareStyles()
	{
		StringBuffer handlers=new StringBuffer();
		prepareAttribute(handlers,"id",getStyleId());
		prepareAttribute(handlers,"style",getStyle());
		prepareAttribute(handlers,"class",getStyleClass());
		return handlers.toString();
	}
	public String prepareEvents()
	{
		StringBuffer handlers=new StringBuffer();
		prepareMouseEvents(handlers);
		prepareKeyEvents(handlers);
		prepareFocusEvents(handlers);
		prepareTextEvents(handlers);
		return handlers.toString();
	}
	public void prepareMouseEvents(StringBuffer handlers)
	{
		prepareAttribute(handlers,"onclick",getOnclick());
		prepareAttribute(handlers,"ondblclick",getOndblclick());
		prepareAttribute(handlers,"onmouseover",getOnmouseover());
		prepareAttribute(handlers,"onmouseout",getOnmouseout());
		prepareAttribute(handlers,"onmousedown",getOnmousedown());
		prepareAttribute(handlers,"onmouseup",getOnmouseup());
		prepareAttribute(handlers,"onmousemove",getOnmousemove());
	}
	public void prepareKeyEvents(StringBuffer handlers)
	{
		prepareAttribute(handlers,"onkeydown",getOnkeydown());
		prepareAttribute(handlers,"onkeyup",getOnkeyup());
		prepareAttribute(handlers,"onkeypress",getOnkeypress());
	}
	public void prepareFocusEvents(StringBuffer handlers)
	{
		prepareAttribute(handlers,"onfocus",getOnfocus());
		prepareAttribute(handlers,"onblur",getOnblur());
		if(isReadonly())
		{
			handlers.append(" readonly=\"readonly\"");
		}
		if(isDisabled())
		{
			handlers.append(" disabled=\"disabled\"");
		}
	}
	public void prepareTextEvents(StringBuffer handlers)
	{
		prepareAttribute(handlers,"onselect",getOnselect());
		prepareAttribute(handlers,"onchange",getOnchange());
	}
	public void prepareAttribute(StringBuffer handler,String property,Object value)
	{
		if(handler!=null&&property!=null&&value!=null)
		{
			handler.append(" ");
			handler.append(property);
			handler.append("=\"");
			handler.append(value);
			handler.append("\"");
		}
	}
	/**
	 * 取值
	 * @param name
	 * @return
	 * @throws SecurityException
	 * @throws IllegalArgumentException
	 * @throws NoSuchFieldException
	 * @throws IllegalAccessException
	 */
	public Object findValue(String name) throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException
	{
		String[] elements=name.split("\\.");
		if(elements!=null&&elements.length>0)
		{
			Object bean=pageContext.getAttribute(elements[0],2);
			if(elements.length>2)
			{
				for(int i=1;i<elements.length;i++)
				{
					bean=getValue(bean, elements[i]);
				}
				return bean;
			}
			else
			{
				return getValue(bean, elements[1]);
			}
		}
		return null;
	}
	public Object getValue(Object bean,String property) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException
	{
		if(bean!=null&&property!=null)
		{
			Field field=bean.getClass().getDeclaredField(property);
			field.setAccessible(true);
			return field.get(bean);
		}
		return null;
	}
	public void release() {
		// TODO Auto-generated method stub
		super.release();
		init();
	}
}
package com.ts.taglib.html;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.jsp.JspException;

import com.ts.taglib.data.Column;
import com.ts.taglib.data.DataGrid;

/**
 * 表格控件
 * @author 陈双
 * @date 2012-09-22
 * @mail [email protected]
 *
 */
public class TableTag extends BaseHandlerTag {

	private static final long serialVersionUID = -5642687627324772161L;
    private String name;//名称
    private String width;//宽度
    private String height;//高度
    private String data;//取数
    private boolean multiple;//是否多行勾选框
	public TableTag()
    {
    	super();
    	name=null;
    	width=null;
    	height=null;
    	data=null;
    	multiple=false;
    }
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getWidth() {
		return width;
	}
	public void setWidth(String width) {
		this.width = width;
	}
	public String getHeight() {
		return height;
	}
	public void setHeight(String height) {
		this.height = height;
	}
	public String getData() {
		return data;
	}
	public void setData(String data) {
		this.data = data;
	}
	public boolean isMultiple() {
		return multiple;
	}
	public void setMultiple(boolean multiple) {
		this.multiple = multiple;
	}
	public int doEndTag() throws JspException {
		try {
			pageContext.getOut().print(createTable());
		} catch (IOException e) {

			throw new JspException(e.getMessage());
		}
		return 6;
	}
	public int doStartTag() throws JspException {
		pageContext.setAttribute("columnHeader", new ArrayList(),2);
		return 1;
	}
	/**
	 * 实现方式由Java构建所需的数据然后调用js创建表格
	 * @return
	 * @throws JspException
	 */
	public String createTable()throws JspException
	{
		StringBuffer handlers=new StringBuffer("<div id=\"main_grid_");
		handlers.append(getName());
		handlers.append("\"");
		handlers.append(" style=\"border:solid 1 #cccccc;");
		handlers.append("width:");
		handlers.append(getWidth());
		handlers.append(";height:");
		handlers.append(Integer.parseInt(getHeight())+25);
		handlers.append(";\">\n");
		handlers.append("<script type=\"text/javascript\" charset=\"utf-8\">\n");
		//处理数据
		List headerList=(List) pageContext.getAttribute("columnHeader", 2);
		if(headerList==null||headerList.size()==0)
		{
			throw new JspException("Table name is "+name+",列数必须大于0!");
		}
		handlers.append(getColumns(headerList));
		List list=(List) pageContext.getAttribute(data, 2);
		handlers.append(getRows(list));
		//调用js生成表格对象
		handlers.append("CreateTable(‘");
		handlers.append(getName());
		handlers.append("‘,‘main_grid_");
		handlers.append(getName());
		handlers.append("‘,");
		handlers.append(getWidth());
		handlers.append(",");
		handlers.append(getHeight());
		handlers.append(",");
		handlers.append(isMultiple());
		handlers.append(",getColumns_grid_");
		handlers.append(getName());
		handlers.append("(),getRows_grid_");
		handlers.append(getName());
		handlers.append("());\n</script>\n");
		handlers.append("<table cellspacing=0 height=25 width=");
		handlers.append(getWidth());
		handlers.append(" >\n<tr>\n<td style=\"height:18px;cursor:default;font-size:12px;font-family:verdana;text-align:right;\">共");
		Object total=pageContext.getAttribute("total", 2);
		if(total==null)
		{
			total=0;
		}
		handlers.append(total);
		handlers.append("页  当前显示第");
		Object current=pageContext.getAttribute("current",2);
		if(current==null)
		{
			current=0;
		}
		handlers.append(current);
		handlers.append("页  <a href=\"javascript:lastPage();\">上页</a> <a href=\"javascript:nextPage();\">下页</a>  <input type=\"hidden\" name=\"currentPage\"/>第<input name=\"toPage\" type=\"text\" size=3/>页</td>\n</tr>\n</table>\n");
		handlers.append("</div>\n");
		return handlers.toString();
	}
	/**
	 * 构建所有的列
	 * @param list
	 * @return
	 * @throws JspException
	 */
	private String getColumns(List list) throws JspException
	{
		StringBuffer columns=new StringBuffer();
		if(list!=null&&list.size()>0)
		{
			columns.append("function getColumns_grid_");
			columns.append(name);
			columns.append("()\n{\n");
			columns.append("var columns=new Array();\n");
			for(int i=0;i<list.size();i++)
			{
				Column column=(Column) list.get(i);
				columns.append("var gridColumn");
				columns.append(i);
				columns.append("=new GridColumn(‘");
				columns.append(column.getName());
				columns.append("‘,‘");
				columns.append(column.getLabel());
				columns.append("‘,‘");
				columns.append(column.getType());
				columns.append("‘,");
				columns.append(column.getWidth());
				columns.append(",");
				columns.append(column.getHeight());
				columns.append(",");
				columns.append("null");
				columns.append(",");
				columns.append(column.isHidden());
				columns.append(",");
				columns.append(column.isDisabled());
				columns.append(",");
				columns.append(column.isSum());
				columns.append(",");
				columns.append(column.getSize());
				columns.append(",");
				columns.append(column.getColspan());
				if(column.getOndblclick()!=null)
				{
					columns.append(",\"");
					columns.append(column.getOndblclick());
					columns.append("\",");
				}
				else
				{
					columns.append(",");
					columns.append("null,");
				}
				if(column.getDrillEvent()!=null)
				{
					columns.append("\"");
					columns.append(column.getDrillEvent());
					columns.append("\");\n");
				}
				else
				{
					columns.append("null);\n");
				}
				columns.append("columns[");
				columns.append(i);
				columns.append("]=gridColumn");
				columns.append(i);
				columns.append(";\n");
			}
		    columns.append("return columns;\n}");
		}
		return columns.toString();
	}
	/**
	 * 构建rows数据集将Java中的List<map>转成javascript中List<Map>形式
	 * @param list列表
	 * @return
	 */
	public String getRows(List list)
	{
		StringBuffer handlers=new StringBuffer("\n function getRows_grid_");
		handlers.append(getName());
		handlers.append("()\n{\n");
		SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		handlers.append("var rows=new List();\n");
		if(list!=null&&list.size()>0)
		{
			for(int i=0;i<list.size();i++)
			{
				handlers.append("var map");
				handlers.append(i);
				handlers.append("=new Map();\n");
				Map row=(Map) list.get(i);
				for(Object key:row.keySet())
				{
					handlers.append("map");
					handlers.append(i);
					handlers.append(".put(‘");
					handlers.append(key);
					if(row.get(key)==null)
					{
						handlers.append("‘,");
						handlers.append(row.get(key));
						handlers.append(");\n");
					}
					else
					{
						Object param=row.get(key);
						handlers.append("‘,‘");
						if(param.getClass().getName().equals("java.sql.Timestamp")||param.getClass().getName().equals("java.util.Date"))
						{
							handlers.append(dateFormat.format(param));
						}
						else
						{
							handlers.append(row.get(key));
						}
						handlers.append("‘);\n");
					}

				}
				handlers.append("rows.add(map");
				handlers.append(i);
				handlers.append(");\n");
			}
		}
		handlers.append("return rows;\n");
		handlers.append("\n}\n");
		return handlers.toString();
	}
	public void release() {

		super.release();
		name=null;
    	width=null;
    	height=null;
    	data=null;
    	multiple=false;
	}
}

package com.ts.taglib.html;

import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

import com.ts.taglib.data.Column;
/**
 * 构建列控件
 * @author 陈双
 * @date 2012-09-23
 * @mail [email protected]  */
public class ColumnTag extends TagSupport {

private static final long serialVersionUID = 5477014869077280329L;
    private String name;//名称
    private String label;//标签
    private String type;//类型
    private String width;//宽度
    private String height;//高度
    private String size;//字符个数
 private String data;//如果是combox时,选项取数来源
 private String colspan;//跨列
 private String ondblclick;//双击事件,只是针对参照列
 private String drillEvent;//数据钻取时调用的函数
 private boolean hidden;//是否隐藏
 private boolean disabled;//是否可用
 private boolean sum;//是否汇总
 public ColumnTag()
    {
     super();
     name=null;
     label=null;
     type=null;
     width=null;
     height=null;
     size="14";
     data=null;
     colspan=null;
     ondblclick=null;
     drillEvent=null;
     hidden=false;
     disabled=false;
     sum=false;
    }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getLabel() {
  return label;
 }
 public void setLabel(String label) {
  this.label = label;
 }
 public String getType() {
  return type;
 }
 public void setType(String type) {
  this.type = type;
 }
 public String getWidth() {
  return width;
 }

public void setWidth(String width) {
  this.width = width;
 }

public String getHeight() {
  return height;
 }

public void setHeight(String height) {
  this.height = height;
 }
    public String getSize() {
  return size;
 }
 public void setSize(String size) {
  this.size = size;
 }
 public String getData() {
  return data;
 }
 public void setData(String data) {
  this.data = data;
 }
 public String getColspan() {
  return colspan;
 }

public void setColspan(String colspan) {
  this.colspan = colspan;
 }
 public String getOndblclick() {
  return ondblclick;
 }
 public void setOndblclick(String ondblclick) {
  this.ondblclick = ondblclick;
 }
 public String getDrillEvent() {
  return drillEvent;
 }
 public void setDrillEvent(String drillEvent) {
  this.drillEvent = drillEvent;
 }
 public boolean isHidden() {
  return hidden;
 }
 public void setHidden(boolean hidden) {
  this.hidden = hidden;
 }
 public boolean isDisabled() {
  return disabled;
 }
 public void setDisabled(boolean disabled) {
  this.disabled = disabled;
 }
 public boolean isSum() {
  return sum;
 }

public void setSum(boolean sum) {
  this.sum = sum;
 }
 public int doEndTag() throws JspException {
  Column column=new Column();
  column.setName(name);
  column.setLabel(label);
  column.setType(type);
  column.setWidth(width);
  column.setHeight(height);
  column.setSize(size);
  column.setData(data);
  column.setColspan(colspan);
  column.setOndblclick(ondblclick);
  column.setDrillEvent(drillEvent);
  column.setHidden(hidden);
  column.setDisabled(disabled);
  column.setSum(sum);
  List list=(List)pageContext.getAttribute("columnHeader", 2);
  list.add(column);
  return 6;
 }
 public int doStartTag() throws JspException {
  
  return 0;
 }
 public void release() {

super.release();
  name=null;
     label=null;
     type=null;
     width=null;
     height=null;
     data=null;
     colspan=null;
     size=null;
     ondblclick=null;
     drillEvent=null;
     hidden=false;
     disabled=false;
     sum=false;
 }
}

package com.ts.taglib.data;

import java.io.Serializable;
/**
 * 列数据
 * @author 陈双
 * @date 2012-09-23
 * @mail [email protected]  */
public class Column implements Serializable {

private static final long serialVersionUID = -2581722061552795107L;
 private String name;//名称
 private String label;//标签
 private String type;//类型
 private String width;//宽度
 private String height;//高度
 private String size;//字符个数
 private String data;//如果是combox时,选项取数来源
 private String colspan;//跨列
 private String rowspan;//跨行
 private String ondblclick;//双击事件,只是针对参照列
 private String drillEvent;//数据钻取时调用的函数
 private boolean hidden;//是否隐藏
 private boolean disabled;//是否可用
 private boolean sum;//是否汇总
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getLabel() {
  return label;
 }
 public void setLabel(String label) {
  this.label = label;
 }
 public String getType() {
  return type;
 }
 public void setType(String type) {
  this.type = type;
 }
 public String getWidth() {
  return width;
 }
 public void setWidth(String width) {
  this.width = width;
 }
 public String getHeight() {
  return height;
 }
 public void setHeight(String height) {
  this.height = height;
 }
 public String getSize() {
  return size;
 }
 public void setSize(String size) {
  this.size = size;
 }
 public String getData() {
  return data;
 }
 public void setData(String data) {
  this.data = data;
 }
 public String getColspan() {
  return colspan;
 }
 public void setColspan(String colspan) {
  this.colspan = colspan;
 }
 public String getRowspan() {
  return rowspan;
 }
 public void setRowspan(String rowspan) {
  this.rowspan = rowspan;
 }
 public String getOndblclick() {
  return ondblclick;
 }
 public void setOndblclick(String ondblclick) {
  this.ondblclick = ondblclick;
 }
 public String getDrillEvent() {
  return drillEvent;
 }
 public void setDrillEvent(String drillEvent) {
  this.drillEvent = drillEvent;
 }
 public boolean isHidden() {
  return hidden;
 }
 public void setHidden(boolean hidden) {
  this.hidden = hidden;
 }
 public boolean isDisabled() {
  return disabled;
 }
 public void setDisabled(boolean disabled) {
  this.disabled = disabled;
 }
 public boolean isSum() {
  return sum;
 }
 public void setSum(boolean sum) {
  this.sum = sum;
 }
}

package com.ts.taglib.data;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
 * 用于构建多级表头动态列表格对象
 * @author 陈双
 * @date 2012-09-22
 * @mail [email protected]  *
 */
public class DataGrid implements Serializable {

private static final long serialVersionUID = 3814622301555705194L;
    private String name;//名称
    private String width;//宽度
    private String height;//高度
    private boolean multiple;//多行数据是否有勾选框
    private List<Column[]> columns;//多级动态列
    private List<Map<String,Object>> data;//行数据
 private String dblclick;//双击事件
    public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getWidth() {
  return width;
 }
 public void setWidth(String width) {
  this.width = width;
 }
 public String getHeight() {
  return height;
 }
 public void setHeight(String height) {
  this.height = height;
 }
 public boolean isMultiple() {
  return multiple;
 }
 public void setMultiple(boolean multiple) {
  this.multiple = multiple;
 }
 public List<Column[]> getColumns() {
  return columns;
 }
 public void setColumns(List<Column[]> columns) {
  this.columns = columns;
 }
 public List<Map<String, Object>> getData() {
  return data;
 }
 public void setData(List<Map<String, Object>> data) {
  this.data = data;
 }
 public String getDblclick() {
  return dblclick;
 }
 public void setDblclick(String dblclick) {
  this.dblclick = dblclick;
 }
 
}

[java]
view plain
copy
print
?

  1. js代码:
js代码:

[java]
view plain
copy
print
?

  1. <P>//===========================================================================
  2. /**
  3. *表格操作
  4. <A href="mailto:*@author">*@author</A> 陈双
  5. <A href="mailto:*@date">*@date</A> 2012-09-26
  6. <A href="mailto:*@mail">*@mail</A> <A href="mailto:[email protected]">[email protected]</A>
  7. */
  8. //===========================================================================
  9. var globeVariable=new Map();//全局变量列表
  10. /**
  11. * 注册全局变量
  12. * @param object 对象id
  13. * @param property 变量名称
  14. * @param value 值
  15. * @return
  16. */
  17. function put(object,property,value)
  18. {
  19. globeVariable.put(object+"_"+property,value);
  20. }
  21. /**
  22. * 取出全局变量
  23. * @param object 对象id
  24. * @param property 变量名称
  25. * @return
  26. */
  27. function get(object,property)
  28. {
  29. return globeVariable.get(object+"_"+property);
  30. }
  31. /**
  32. * 获取选中行单元格的值
  33. * @param id 表格id
  34. * @param cellIndex 单元格索引
  35. * @param isMultiple 是否有勾选框
  36. * @return Array 选中行的id值的集合
  37. */
  38. function getSelectedCellValue(id,cellIndex,isMultiple){
  39. if(!id)return null;
  40. var values=new Array();//所有选中的id值
  41. if(isMultiple)
  42. {
  43. var checkList=document.getElementsByName(id+"chbox");
  44. var rows=new Array();//选中的行集合
  45. var index=-1;
  46. if(checkList && checkList.length>0)
  47. {
  48. for(var i=0;i<checkList.length;i++)
  49. {
  50. if(checkList[i].checked)
  51. {
  52. index++;
  53. rows[index]=checkList[i].parentNode.parentNode;
  54. }
  55. }
  56. }
  57. if(rows.length==0)
  58. {
  59. alert("请选中一行!");
  60. return null;
  61. }
  62. else
  63. {
  64. for(var i=0;i<rows.length;i++)
  65. {
  66. values[i]=rows[i].cells[parseInt(cellIndex)+2].innerText;
  67. }
  68. return values;
  69. }
  70. }
  71. else
  72. {
  73. var _current_row=get(id,‘_current_row‘);
  74. if(_current_row==null)
  75. {
  76. alert("请选择一行!");
  77. return null;
  78. }
  79. else
  80. {
  81. values[0]=document.getElementById(id).rows[_current_row].cells[parseInt(cellIndex)+1].innerText;
  82. return values;
  83. }
  84. }
  85. return null;
  86. }
  87. /**
  88. * 创建可编辑的表格对象,并添加到指定的父节点中
  89. * @param id 表格名称
  90. * @param parentId 父节点id
  91. * @param width 表格宽度
  92. * @param height 表格高度
  93. * @param isMultiple 多行是否有勾选框
  94. * @param columns 表格所有的列,以数组的形式保存GridColumn对象
  95. * @param rows 数据列表,它是以集合List的形式保存Map,其中key是name,value是值
  96. * @param status 表格状态值: read只读,update可修改,insert新增
  97. */
  98. function CreateTable(id,parentId,width,height,isMultiple,columns,rows)
  99. {
  100. if((!id)|(!parentId)||(!width)||(!height)||(!columns)||(!rows))
  101. {
  102. return;
  103. }
  104. var _sum_columns=null;//汇总列
  105. var _isHbar=false;//是否有横向滚动条
  106. var flag=false;//默认没有跨列操作
  107. var first="";//声明第一列表
  108. var title="";//标题表
  109. var data="";//数据表
  110. var sum="";//汇总表
  111. var columnWidth=125;//默认列宽
  112. for(var i=0;i<columns.length;i++)
  113. {//检查是否有跨列操作
  114. if(columns[i].colspan)
  115. {
  116. flag=true;
  117. break;
  118. }
  119. }
  120. put(id, ‘flag‘, flag);
  121. //构建标题列
  122. if(flag)
  123. {//有跨列操作
  124. for(var i=0;i<2;i++)
  125. {
  126. if(i==0)
  127. {
  128. title="<tr><td class=‘firstcolumn‘ rowspan=‘2‘>&nbsp;</td>";
  129. if(isMultiple)
  130. {
  131. title+="<td class=‘column‘ width=‘30‘ rowspan=‘2‘ align=‘center‘><input name=‘checkbox‘ type=‘checkbox‘ onclick=\"checkAllForGrid(this.checked,‘"+id+"chbox‘);\"/></td>";
  132. }
  133. }
  134. else
  135. {
  136. title+="<tr>";
  137. }
  138. for(var j=0;j<columns.length;j++)
  139. {
  140. if(columns[j].colspan)
  141. {//执行跨列
  142. if(i==0)
  143. {//第一行
  144. title+="<td class=‘column‘ align=‘center‘ colspan=‘"+columns[j].colspan+"‘";
  145. if(columns[j].width)
  146. {
  147. title+=" width=‘"+(columns[j].width*parseInt(columns[j].colspan))+"‘";
  148. }
  149. else
  150. {
  151. title+=" width=‘"+(columnWidth*parseInt(columns[j].colspan))+"‘";
  152. }
  153. title+=">"+(columns[j].label.split(",")[0])+"</td>";
  154. }
  155. else
  156. {//第二行
  157. title+="<td class=‘column‘ align=‘center‘";
  158. if(columns[j].hidden)
  159. {
  160. columns[j].width=1;
  161. title+=" style=\"border:none;\"";
  162. }
  163. if(columns[j].width)
  164. {
  165. title+=" width=‘"+columns[j].width+"‘";
  166. }
  167. else
  168. {
  169. title+=" width=‘"+columnWidth+"‘";
  170. }
  171. title+=">"+(columns[j].label.split(",")[1])+"</td>";
  172. }
  173. }
  174. else
  175. {//执行跨行
  176. var rs=columns[j].label.indexOf(‘,‘);//是否是跨列
  177. if(i==0)
  178. {//跨行操作
  179. if(rs==-1)
  180. {//跨行
  181. title+="<td class=‘column‘ align=‘center‘ rowspan=‘2‘";
  182. if(columns[j].hidden)
  183. {
  184. columns[j].width=1;
  185. title+=" style=\"border:none;\"";
  186. }
  187. if(columns[j].width)
  188. {
  189. title+=" width=‘"+columns[j].width+"‘";
  190. }
  191. else
  192. {
  193. title+=" width=‘"+columnWidth+"‘";
  194. }
  195. title+=">"+columns[j].label+"</td>";
  196. }
  197. }
  198. else
  199. {//跨列操作
  200. if(rs!=-1)
  201. {//跨行
  202. title+="<td class=‘column‘ align=‘center‘";
  203. if(columns[j].hidden)
  204. {
  205. columns[j].width=1;
  206. title+=" style=\"border:none;\"";
  207. }
  208. if(columns[j].width)
  209. {
  210. title+=" width=‘"+columns[j].width+"‘";
  211. }
  212. else
  213. {
  214. title+=" width=‘"+columnWidth+"‘";
  215. }
  216. title+=">"+(columns[j].label.split(‘,‘)[1])+"</td>";
  217. }
  218. }
  219. }
  220. }
  221. if(i==0)
  222. {//最后一列
  223. title+="<td class=‘lastcolumn‘ rowspan=‘2‘>&nbsp;</td></tr>";
  224. }
  225. else
  226. {
  227. title+="</tr>";
  228. }
  229. }
  230. }
  231. else
  232. {//正常情况
  233. title="<tr><td class=‘firstcolumn‘>&nbsp;</td>";
  234. if(isMultiple)
  235. {
  236. title+="<td class=‘column‘ width=‘30‘ align=‘center‘><input name=‘checkbox‘ type=‘checkbox‘ onclick=\"checkAllForGrid(this.checked,‘"+id+"chbox‘);\"/></td>";
  237. }
  238. for(var i=0;i<columns.length;i++)
  239. {
  240. title+="<td class=‘column‘ align=‘center‘";
  241. if(columns[i].hidden)
  242. {
  243. columns[i].width=1;
  244. title+=" style=\"border:none;\"";
  245. }
  246. if(columns[i].width)
  247. {
  248. title+=" width=‘"+columns[i].width+"‘";
  249. }
  250. else
  251. {
  252. title+=" width=‘"+columnWidth+"‘";
  253. }
  254. title+=" onclick=\"sortTableForGrid(‘"+id+"‘,"+i+","+isMultiple+");\"";
  255. title+=">"+columns[i].label+"<span></span></td>";
  256. }
  257. title+="<td class=‘lastcolumn‘>&nbsp;</td></tr>";
  258. }
  259. if(columns&&columns.length>0)
  260. {//汇总表格
  261. sum="<tr><td class=‘firstcolumn‘>汇总</td>";
  262. if(isMultiple)
  263. {
  264. sum+="<td class=‘column‘ width=‘30‘>&nbsp;</td>";
  265. }
  266. for(var i=0;i<columns.length;i++)
  267. {
  268. sum+="<td class=‘column‘ align=‘center‘";
  269. if(columns[i].hidden)
  270. {
  271. columns[i].width=1;
  272. sum+=" style=\"border:none;\"";
  273. }
  274. if(columns[i].width)
  275. {
  276. sum+=" width=‘"+columns[i].width+"‘";
  277. }
  278. else
  279. {
  280. sum+=" width=‘"+columnWidth+"‘";
  281. }
  282. sum+=">&nbsp;</td>";
  283. }
  284. sum+="<td class=‘lastcolumn‘>&nbsp;</td></tr>";
  285. }
  286. if(rows&&rows.size()>0)
  287. {//构建第一列和数据表格
  288. if(flag)
  289. {
  290. first="<tr><td>&nbsp;</td></tr>";
  291. first+="<tr><td>&nbsp;</td></tr>";
  292. }
  293. else
  294. {
  295. first="<tr><td>&nbsp;</td></tr>";
  296. }
  297. for(var i=0;i<rows.size();i++)
  298. {
  299. first+="<tr><td style=‘border-right:none;‘>"+(i+1)+"</td></tr>";
  300. data+="<tr><td class=‘firstcolumn‘ style=‘border-bottom-color:#cccccc;‘>"+(i+1)+"</td>";
  301. if(isMultiple)
  302. {
  303. data+="<td width=‘30‘ align=‘center‘><input type=‘checkbox‘ name=‘"+id+"chbox‘/></td>";
  304. }
  305. var rowId="rowid_"+(i+1);
  306. var map=rows.get(i);
  307. for(var j=0;j<columns.length;j++)
  308. {
  309. data+="<td";
  310. if(columns[j].hidden)
  311. {
  312. columns[j].width=1;
  313. data+=" style=\"border-right:none;\"";
  314. }
  315. if(columns[j].width)
  316. {
  317. data+=" width=‘"+columns[j].width+"‘";
  318. }
  319. else
  320. {
  321. data+=" width=‘"+columnWidth+"‘";
  322. }
  323. data+=">";
  324. data+=map.get(columns[j].name)==null?"&nbsp;":map.get(columns[j].name);
  325. data+="</td>";
  326. }
  327. data+="<td class=‘lastdata‘>";
  328. data+="<input name=‘rowid‘ type=‘hidden‘ value=‘"+(rowId)+"‘/>";
  329. data+="&nbsp;</td></tr>";
  330. }
  331. }
  332. //构建汇总列
  333. _sum_columns=new Array();//初始化
  334. var k=0;
  335. for(var i=0;i<columns.length;i++)
  336. {
  337. if(columns[i].sum&&(columns[i].type=="int"||columns[i].type=="number"))
  338. {
  339. if(isMultiple)
  340. {
  341. _sum_columns[k]=i+2;
  342. }
  343. else
  344. {
  345. _sum_columns[k]=i+1;
  346. }
  347. k++;
  348. }
  349. }
  350. put(id,‘_sum_columns‘,_sum_columns);
  351. var allWidth=0;
  352. for(var i=0;i<columns.length;i++)
  353. {
  354. if(columns[i].width)
  355. {
  356. allWidth+=parseInt(columns[i].width);
  357. }
  358. else
  359. {
  360. allWidth+=parseInt(columnWidth);
  361. }
  362. }
  363. allWidth+=30;
  364. if(isMultiple)
  365. {
  366. allWidth+=30;
  367. }
  368. var total=1;
  369. if(allWidth>width)
  370. {
  371. total=2;
  372. _isHbar=true;
  373. }
  374. put(id, ‘_isHbar‘, _isHbar);
  375. //构建隐藏行
  376. for(var i=0;i<total;i++)
  377. {
  378. data+="<tr><td style=\"border:0;\">&nbsp;</td>";
  379. for(var j=0;j<columns.length;j++)
  380. {
  381. data+="<td style=\"border:0;\">&nbsp;</td>";
  382. }
  383. data+="<td style=\"border:0;\">&nbsp;</td>";
  384. first+="<tr><td style=\"border:0;background-color:white;\">&nbsp;</td></tr>";
  385. }
  386. var title_html="<table id=‘header_"+id+"‘ cellspacing=‘0‘ cellpadding=‘0‘ class=‘titlecolumn‘>"+title+"</table>";
  387. var first_html="<table id=‘first_"+id+"‘ cellspacing=‘0‘ cellpadding=‘0‘ class=‘slidecolumn‘>"+first+"</table>";
  388. var data_html="<table id=‘"+id+"‘ cellspacing=‘0‘ cellpadding=‘0‘ class=‘datacolumn‘>";
  389. data_html+=title+data+"</table>";
  390. var sum_html="<table id=‘sum_"+id+"‘ cellspacing=‘0‘"+" cellpadding=‘0‘ style=‘width:100%;position:absolute;top:";
  391. if(_isHbar)
  392. {
  393. sum_html+=+(parseInt(height)-18-17);
  394. }
  395. else
  396. {
  397. sum_html+=(parseInt(height)-17);
  398. }
  399. sum_html+=";left:0;z-index:4;‘/>"+sum+"</table>";
  400. _execute(id, parentId, width, height, first_html+title_html+data_html+sum_html,isMultiple);
  401. sumRowForGrid(id);
  402. }
  403. /**
  404. * 列结构
  405. * @param name名称
  406. * @param label 标签
  407. * @param type 类型
  408. * @param width 宽度
  409. * @param height 高度
  410. * @param data 列数据来源是一个数组
  411. * @param hidden 是否隐藏
  412. * @param disabled 是否可用
  413. * @param sum 是否汇总
  414. * @param size 字符个数
  415. * @param colspan 跨列
  416. * @param rowspan 跨行
  417. * @param ondblclick 鼠标双击事件
  418. * @param drillEvent 数据钻取处理函数
  419. */
  420. function GridColumn(name,label,type,width,height,data,hidden,disabled,sum,size,colspan,ondblclick,drillEvent)
  421. {
  422. this.name=name;
  423. this.label=label;
  424. this.type=type;
  425. this.width=width;
  426. this.height=height;
  427. this.data=data;
  428. this.hidden=hidden;
  429. this.disabled=disabled;
  430. this.sum=sum;
  431. this.size=size;
  432. this.colspan=colspan;
  433. this.ondblclick=ondblclick;
  434. this.drillEvent=drillEvent;
  435. }
  436. /**
  437. <A href="mailto:*@param">*@param</A> 排序
  438. <A href="mailto:*@param">*@param</A> id为表格id
  439. <A href="mailto:*@param">*@param</A> index:列索引
  440. <A href="mailto:*@param">*@param</A> sort:asc是升序,dsc是降序
  441. <A href="mailto:*@param">*@param</A> isMultiple是否多行
  442. */
  443. function sortTableForGrid(id,index,isMultiple)
  444. {
  445. var flag=get(id, ‘flag‘);
  446. var _isHbar=get(id, ‘_isHbar‘);
  447. var tr=new Array();//行集合
  448. var td=new Array();//列集合
  449. var temp;//临时单元格
  450. var table=document.getElementById(id);
  451. var header=document.getElementById("header_"+id);
  452. var sort;
  453. if(flag)
  454. {
  455. return;
  456. }
  457. if(isMultiple)
  458. {
  459. index+=2;
  460. }
  461. else
  462. {
  463. index+=1;
  464. }
  465. var html=header.rows[0].cells[index].childNodes[1].innerHTML;
  466. if(html=="")
  467. {
  468. sort="asc";
  469. header.rows[0].cells[index].childNodes[1].innerHTML="▲";
  470. }
  471. else if(html=="▲")
  472. {
  473. sort="dsc";
  474. header.rows[0].cells[index].childNodes[1].innerHTML="▼";
  475. }
  476. else if(html=="▼")
  477. {
  478. sort="asc";
  479. header.rows[0].cells[index].childNodes[1].innerHTML="▲";
  480. }
  481. var k=1;
  482. if(isMultiple)
  483. {
  484. k=2;
  485. }
  486. for(var i=k;i<header.rows[0].cells.length-1;i++)
  487. {
  488. if(i!=index)
  489. {
  490. header.rows[0].cells[i].childNodes[1].innerHTML="";
  491. }
  492. }
  493. if(_isHbar)
  494. {
  495. for(var i=1;i<table.rows.length-3;i++)
  496. {
  497. tr[i-1]=table.rows[i];
  498. td[i-1]=table.rows[i].cells[index];
  499. }
  500. }
  501. else
  502. {
  503. for(var i=1;i<table.rows.length-2;i++)
  504. {
  505. tr[i-1]=table.rows[i];
  506. td[i-1]=table.rows[i].cells[index];
  507. }
  508. }
  509. var isNumber=false;//是数字
  510. for(var i=0;i<td.length;i++)
  511. {
  512. if(!checkValueForGrid(td[i].innerHTML))
  513. {
  514. isNumber=true;//字符串
  515. break;
  516. }
  517. }
  518. //开始比较数据
  519. for(var i=0;i<td.length;i++)
  520. {
  521. for(var j=0;j<td.length;j++)
  522. {
  523. if(isNumber)
  524. {//字符串比较
  525. if(sort=="asc")
  526. {
  527. if(td[i].innerHTML<td[j].innerHTML)
  528. {
  529. temp=td[i];
  530. td[i]=td[j];
  531. td[j]=temp;
  532. }
  533. }
  534. else if(sort=="dsc")
  535. {
  536. if(td[i].innerHTML>td[j].innerHTML)
  537. {
  538. temp=td[i];
  539. td[i]=td[j];
  540. td[j]=temp;
  541. }
  542. }
  543. }
  544. else
  545. {//数字比较
  546. if(sort=="asc")
  547. {
  548. if(parseFloat(td[i].innerHTML)<parseFloat(td[j].innerHTML))
  549. {
  550. temp=td[i];
  551. td[i]=td[j];
  552. td[j]=temp;
  553. }
  554. }
  555. else if(sort=="dsc")
  556. {
  557. if(parseFloat(td[i].innerHTML)>parseFloat(td[j].innerHTML))
  558. {
  559. temp=td[i];
  560. td[i]=td[j];
  561. td[j]=temp;
  562. }
  563. }
  564. }
  565. }
  566. }
  567. var cellCount=table.rows[0].cells.length;
  568. var tempTR=new Array();//临时行
  569. for(var i=0;i<tr.length;i++)
  570. {
  571. var tempTD=new Array();//临时列集合
  572. for(var j=k;j<cellCount-1;j++)
  573. {
  574. tempTD[j]=td[i].parentNode.cells[j].innerHTML;
  575. }
  576. tempTR[i]=tempTD;
  577. }
  578. for(var i=0;i<tr.length;i++)
  579. {
  580. for(var j=k;j<cellCount-1;j++)
  581. {
  582. tr[i].cells[j].innerHTML=tempTR[i][j];
  583. }
  584. }
  585. }
  586. /**
  587. *汇总行
  588. <A href="mailto:*@param">*@param</A> id 表格id
  589. <A href="mailto:*@param">*@param</A> columns 汇总列数组
  590. */
  591. function sumRowForGrid(id)
  592. {
  593. var columns=get(id,‘_sum_columns‘);
  594. var _isHbar=get(id,‘_isHbar‘);
  595. var flag=get(id,‘flag‘);
  596. if(columns==undefined||columns.length==0)
  597. {
  598. return;
  599. }
  600. var sumTR=new Array();//汇总行临时数据
  601. var table=document.getElementById(id);
  602. var sum_table=document.getElementById("sum_"+id);
  603. if((_isHbar&&flag==false&&table.rows.length==3)||(_isHbar&&flag&&table.rows.length==4)||(!_isHbar&&flag&&table.rows.length==3)||(!_isHbar&&!flag&&table.rows.length==2))
  604. {
  605. for(var i=0;i<columns.length;i++)
  606. {
  607. sum_table.rows[0].cells[columns[i]].innerHTML=‘&nbsp;‘;
  608. }
  609. return;
  610. }
  611. var index=1;
  612. if(flag)
  613. {
  614. index=2;
  615. }
  616. var end=table.rows.length-1;
  617. if(_isHbar)
  618. {
  619. end=table.rows.length-2;
  620. }
  621. for(var i=index;i<end;i++)
  622. {
  623. for(var j=0;j<columns.length;j++)
  624. {
  625. var value=table.rows[i].cells[columns[j]].innerText;
  626. if(!checkValueForGrid(value))
  627. {
  628. value="0";
  629. }
  630. if(sumTR[j]==undefined)
  631. {
  632. sumTR[j]=value;
  633. }
  634. else if(sumTR[j]!="")
  635. {
  636. sumTR[j]=parseFloat(sumTR[j])+parseFloat(value);
  637. }
  638. }
  639. }
  640. //填充汇总行
  641. for(var i=0;i<columns.length;i++)
  642. {
  643. sum_table.rows[0].cells[columns[i]].innerHTML=sumTR[i];
  644. }
  645. }
  646. /**
  647. *检查value是否为数字,返回true是数字,返回false为字符串
  648. <A href="mailto:*@param">*@param</A> value要检查的值
  649. */
  650. function checkValueForGrid(value)
  651. {
  652. if(value && value.length>0)
  653. {
  654. var newValue=value.replace(/\s+/g,"");
  655. value=newValue;
  656. }
  657. else
  658. {
  659. return false;
  660. }
  661. if(value.length>0 && value.indexOf(‘.‘)!=-1)
  662. {//判断是否是小数
  663. var express=/^\d+.\d+$/;//匹配小数
  664. if(express.test(value)){
  665. return true;
  666. }
  667. else
  668. {
  669. return false;
  670. }
  671. }
  672. else
  673. {
  674. var express=/^\d+$/;
  675. if(express.test(value))
  676. {
  677. return true;
  678. }
  679. else
  680. {
  681. return false;
  682. }
  683. }
  684. return false;
  685. }
  686. /**
  687. * 全选
  688. <A href="mailto:*@param">*@param</A> checked是否选中true为选中,false没选中
  689. <A href="mailto:*@param">*@param</A> name 名称
  690. */
  691. function checkAllForGrid(checked,name)
  692. {
  693. var checkList=document.getElementsByName(name);
  694. if(checkList && checkList.length>0)
  695. {
  696. for(var i=0;i<checkList.length;i++)
  697. {
  698. checkList[i].checked=checked;
  699. }
  700. }
  701. }</P><P>/**
  702. * 构建表格以及滚动条
  703. * @param id 表格id
  704. * @param parentId 父节点,将建构建好的表格节点添加到父节点中
  705. * @param width 表格宽度
  706. * @param height 表格高度
  707. * @param ondblclick 表格双击事件
  708. * @param html (构建好的表格=序列号表格+表头表格+数据表格+汇总表格)
  709. * @return
  710. */
  711. function _execute(id,parentId,width,height,html,isMultiple)
  712. {
  713. /**
  714. * 定义构建表格需要的变量
  715. */
  716. var _first_object=null;//第一列,序数表格
  717. var _header_object=null;//表头
  718. var _data_object=null;//数据表格
  719. var _sum_object=null;//汇总表格
  720. var _hbar_object=null;//横向滚动条
  721. var _vbar_object=null;//纵向滚动条
  722. var _current_row=null;//当前选中行
  723. var mainFrame=document.createElement("DIV");
  724. mainFrame.id="DIV_"+id;
  725. mainFrame.style.width=width;
  726. mainFrame.style.height=height;
  727. mainFrame.className="datagrid";
  728. mainFrame.onmousedown=function (e){//鼠标按下事件
  729. e=e||window.event;
  730. _selectedRow(e,id,isMultiple);//选中行
  731. }
  732. mainFrame.innerHTML=html;
  733. /*
  734. * 添加滚动事件,根据IE的冒泡特性子节点事件触发自后如果父节点也有相同的事件
  735. * 就会接着执行父节点的事件
  736. */
  737. _addScrollEvent(mainFrame,id);
  738. //构建横向滚动条
  739. var hbar=document.createElement("DIV");
  740. hbar.id="hbar";
  741. hbar.style.position="absolute";
  742. hbar.style.width="100%";
  743. hbar.style.height="17px";
  744. hbar.style.overflowX="auto";
  745. hbar.style.top=height-17;
  746. hbar.style.zIndex="10";
  747. hbar.onscroll=function(){
  748. _h_scroll(id);//横向滚动
  749. }
  750. hbar.innerHTML="<div style=\"width:100%;height:1px;overflow-y:hidden;\">&nbsp;</div>";
  751. //构建纵向滚动条
  752. var vbar=document.createElement("DIV");
  753. vbar.id="vbar";
  754. vbar.style.position="absolute";
  755. vbar.style.width="17px";
  756. vbar.style.height="100%";
  757. vbar.style.overflowY="auto";
  758. vbar.style.left=width-17;
  759. vbar.style.zIndex="10";
  760. vbar.onscroll=function(){
  761. _v_scroll(id);//纵向滚动
  762. }
  763. vbar.innerHTML="<div style=\"width:1px;height:100%;overflow-x:hidden;\">&nbsp;</div>";
  764. //将表格和滚动条组合在一起
  765. mainFrame.appendChild(hbar);
  766. mainFrame.appendChild(vbar);
  767. //将构建好的表格节点追加到父节点中
  768. document.getElementById(parentId).appendChild(mainFrame);
  769. _first_object=document.getElementById("first_"+id);//第一列,序数表格
  770. _header_object=document.getElementById("header_"+id);//表头
  771. _data_object=document.getElementById(id);//数据表格
  772. _sum_object=document.getElementById("sum_"+id);//汇总表格
  773. _hbar_object=hbar;//横向滚动条
  774. _vbar_object=vbar;//纵向滚动条
  775. /*
  776. * 注册全局变量
  777. */
  778. put(id,‘_first_object‘,_first_object);
  779. put(id,‘_header_object‘,_header_object);
  780. put(id,‘_data_object‘,_data_object);
  781. put(id,‘_sum_object‘,_sum_object);
  782. put(id,‘_hbar_object‘,_hbar_object);
  783. put(id,‘_vbar_object‘,_vbar_object);
  784. var bt=_getCurrentStyle(mainFrame,"borderTopWidth");
  785. var bb=_getCurrentStyle(mainFrame,"borderBottomWidth");
  786. var bl=_getCurrentStyle(mainFrame,"borderLeftWidth");
  787. var br=_getCurrentStyle(mainFrame,"borderRightWidth");
  788. _hbar_object.style.top=parseInt(_hbar_object.style.top)-parseInt(bt)-parseInt(bb);
  789. _vbar_object.style.left=parseInt(_vbar_object.style.left)-parseInt(bl)-parseInt(br);
  790. _block_scroll(id);//设置滚动块
  791. }
  792. /**
  793. * 当鼠标按下时选中行
  794. * @param e
  795. * @return
  796. */
  797. function _selectedRow(e,id,isMultiple)
  798. {
  799. if(isMultiple)
  800. return;
  801. var td_object=e.srcElement?e.srcElement:e.target;
  802. var _data_object=get(id,‘_data_object‘);
  803. var table=document.getElementById(id);
  804. if(td_object.parentNode.tagName=="TR")
  805. {
  806. var tr_object=td_object.parentNode;
  807. var rowIndex=tr_object.rowIndex;//行索引
  808. var _current_row=get(id,‘_current_row‘);
  809. var flag=get(id,‘flag‘);
  810. var _isHbar=get(id,‘_isHbar‘);
  811. if(flag)
  812. {
  813. if(rowIndex==0||rowIndex==1)
  814. {
  815. return;
  816. }
  817. }
  818. else
  819. {
  820. if(rowIndex==0)
  821. {
  822. return;
  823. }
  824. }
  825. if(_isHbar)
  826. {
  827. if(rowIndex==table.rows.length-1||rowIndex==table.rows.length-2)
  828. {
  829. return;
  830. }
  831. }
  832. else
  833. {
  834. if(rowIndex==table.rows.length-1)
  835. {
  836. return;
  837. }
  838. }
  839. if(_current_row!=null)
  840. {//取消之前的选中行状态
  841. _data_object.rows[_current_row].className="";
  842. }
  843. //重新设置选中行状态
  844. _data_object.rows[rowIndex].className="selectedrow";
  845. _current_row=rowIndex;
  846. put(id,‘_current_row‘,_current_row);
  847. }
  848. }
  849. /**
  850. * 添加滚动事件监听器
  851. * @param element要添加事件的父节点
  852. * @return
  853. */
  854. function _addScrollEvent(element,id)
  855. {
  856. var handler=function(e)
  857. {
  858. _mouseScrollEvent.call(this, e,id);
  859. }
  860. if(document.attachEvent)
  861. {//微软自定义的添加事件监听器
  862. element.attachEvent("onmousewheel",handler);
  863. }
  864. else
  865. {//W3C规范定义的添加事件监听器
  866. element.addEventListener("DOMMouseScroll",handler,false);
  867. }
  868. }
  869. /**
  870. * 鼠标轮滚动事件和列表事件
  871. * @param e
  872. * @return
  873. */
  874. function _mouseScrollEvent(e,id)
  875. {
  876. e=e||window.event;
  877. var _vbar_object=get(id,‘_vbar_object‘);
  878. if(e.wheelDelta<=0 || e.detail>0)
  879. {
  880. _vbar_object.scrollTop+=18;//设置滚动步长为一行的高度
  881. }
  882. else
  883. {
  884. _vbar_object.scrollTop-=18;
  885. }
  886. }
  887. /**
  888. * 横向滚动
  889. * @return
  890. */
  891. function _h_scroll(id)
  892. {
  893. var _hbar_object=get(id,‘_hbar_object‘);
  894. var _header_object=get(id,‘_header_object‘);
  895. var _data_object=get(id,‘_data_object‘);
  896. var _sum_object=get(id,‘_sum_object‘);
  897. _header_object.style.left=-(_hbar_object.scrollLeft);
  898. _data_object.style.left=-(_hbar_object.scrollLeft);
  899. _sum_object.style.left=-(_hbar_object.scrollLeft);
  900. }
  901. /**
  902. *纵向滚动
  903. * @return
  904. */
  905. function _v_scroll(id)
  906. {
  907. var _vbar_object=get(id,‘_vbar_object‘);
  908. var _first_object=get(id,‘_first_object‘);
  909. var _data_object=get(id,‘_data_object‘);
  910. _first_object.style.top=-(_vbar_object.scrollTop);
  911. _data_object.style.top=-(_vbar_object.scrollTop);
  912. }
  913. /**
  914. * 取出当前元素非style定义的样式
  915. * @param element
  916. * @param property
  917. * @return
  918. */
  919. function _getCurrentStyle(element,property)
  920. {
  921. if(element.currentStyle)
  922. {//元素中非style定义的样式,包括内嵌样式和外部样式表中定义的样式
  923. return element.currentStyle[property];
  924. }
  925. else if(window.getComputedStyle)
  926. {//firefox的方式
  927. property=property.replace(/([A-Z])/g, "-$1").toLowerCase();
  928. return window.getComputedStyle(element,null).getPropertyValue(property);
  929. }
  930. else
  931. {
  932. return null;
  933. }
  934. }
  935. /**
  936. * 设置滚动块
  937. * @return
  938. */
  939. function _block_scroll(id)
  940. {
  941. var _hbar_object=get(id,‘_hbar_object‘);
  942. var _vbar_object=get(id,‘_vbar_object‘);
  943. var _data_object=get(id,‘_data_object‘);
  944. _hbar_object.style.display="block";
  945. _vbar_object.style.display="block";
  946. _hbar_object.childNodes[0].style.width=_data_object.offsetWidth;
  947. _vbar_object.childNodes[0].style.height=_data_object.offsetHeight;
  948. if(_hbar_object.childNodes[0].offsetWidth<=_hbar_object.offsetWidth)
  949. {
  950. _hbar_object.style.display="none";
  951. }
  952. if(_vbar_object.childNodes[0].offsetHeight<=_vbar_object.offsetHeight)
  953. {
  954. _vbar_object.style.display="none";
  955. }
  956. }</P>

//===========================================================================
/**
 *表格操作
 *@author 陈双
 *@date 2012-09-26
 *@mail [email protected]  */
//===========================================================================
var globeVariable=new Map();//全局变量列表
/**
 * 注册全局变量
 * @param object 对象id
 * @param property 变量名称
 * @param value 值
 * @return
 */
function put(object,property,value)
{
 globeVariable.put(object+"_"+property,value);
}
/**
 * 取出全局变量
 * @param object 对象id
 * @param property 变量名称
 * @return
 */
function get(object,property)
{
 return globeVariable.get(object+"_"+property);
}
/**
 * 获取选中行单元格的值
 * @param id 表格id
 * @param cellIndex 单元格索引
 * @param isMultiple 是否有勾选框
 * @return Array 选中行的id值的集合
 */
function getSelectedCellValue(id,cellIndex,isMultiple){
 if(!id)return null;
 var values=new Array();//所有选中的id值
 if(isMultiple)
 {
  var checkList=document.getElementsByName(id+"chbox");
  var rows=new Array();//选中的行集合
  var index=-1;
  if(checkList && checkList.length>0)
  {
   for(var i=0;i<checkList.length;i++)
   {
    if(checkList[i].checked)
    {
     index++;
     rows[index]=checkList[i].parentNode.parentNode;
    }
   }
  }
  if(rows.length==0)
  {
   alert("请选中一行!");
   return null;
  }
  else
  {
   for(var i=0;i<rows.length;i++)
   {
    values[i]=rows[i].cells[parseInt(cellIndex)+2].innerText;
   }
   return values;
  }
 }
 else
 {
  var _current_row=get(id,‘_current_row‘);
  if(_current_row==null)
  {
   alert("请选择一行!");
   return null;
  }
  else
  {
   values[0]=document.getElementById(id).rows[_current_row].cells[parseInt(cellIndex)+1].innerText;
   return values;
  }
 }
 return null;
}
/**
 * 创建可编辑的表格对象,并添加到指定的父节点中
 * @param id 表格名称
 * @param parentId 父节点id
 * @param width 表格宽度
 * @param height 表格高度
 * @param isMultiple 多行是否有勾选框
 * @param columns 表格所有的列,以数组的形式保存GridColumn对象
 * @param rows 数据列表,它是以集合List的形式保存Map,其中key是name,value是值
 * @param status 表格状态值: read只读,update可修改,insert新增
 */
function CreateTable(id,parentId,width,height,isMultiple,columns,rows)
{
 if((!id)|(!parentId)||(!width)||(!height)||(!columns)||(!rows))
 {
  return;
 }
 var _sum_columns=null;//汇总列
 var _isHbar=false;//是否有横向滚动条
 var flag=false;//默认没有跨列操作
 var first="";//声明第一列表
 var title="";//标题表
 var data="";//数据表
 var sum="";//汇总表
 var columnWidth=125;//默认列宽
 for(var i=0;i<columns.length;i++)
 {//检查是否有跨列操作
  if(columns[i].colspan)
  {
   flag=true;
   break;
  }
 }
 put(id, ‘flag‘, flag);
 //构建标题列
 if(flag)
 {//有跨列操作
  for(var i=0;i<2;i++)
  {
   if(i==0)
   {
    title="<tr><td class=‘firstcolumn‘ rowspan=‘2‘>&nbsp;</td>";
    if(isMultiple)
    {
     title+="<td class=‘column‘ width=‘30‘ rowspan=‘2‘ align=‘center‘><input name=‘checkbox‘ type=‘checkbox‘ onclick=\"checkAllForGrid(this.checked,‘"+id+"chbox‘);\"/></td>";
    }
   }
   else
   {
    title+="<tr>";
   }
   for(var j=0;j<columns.length;j++)
   {
    if(columns[j].colspan)
    {//执行跨列
     if(i==0)
     {//第一行
      title+="<td class=‘column‘ align=‘center‘ colspan=‘"+columns[j].colspan+"‘";
      if(columns[j].width)
      {
       title+=" width=‘"+(columns[j].width*parseInt(columns[j].colspan))+"‘";
      }
      else
      {
       title+=" width=‘"+(columnWidth*parseInt(columns[j].colspan))+"‘";
      }
      title+=">"+(columns[j].label.split(",")[0])+"</td>";
     }
     else
     {//第二行
      title+="<td class=‘column‘ align=‘center‘";
      if(columns[j].hidden)
      {
       columns[j].width=1;
       title+=" style=\"border:none;\"";
      }
      if(columns[j].width)
      {
       title+=" width=‘"+columns[j].width+"‘";
      }
      else
      {
       title+=" width=‘"+columnWidth+"‘";
      }
      title+=">"+(columns[j].label.split(",")[1])+"</td>";
     }
    }
    else
    {//执行跨行
     var rs=columns[j].label.indexOf(‘,‘);//是否是跨列
     if(i==0)
     {//跨行操作
      if(rs==-1)
      {//跨行
       title+="<td class=‘column‘ align=‘center‘ rowspan=‘2‘";
       if(columns[j].hidden)
       {
        columns[j].width=1;
        title+=" style=\"border:none;\"";
       }
       if(columns[j].width)
       {
        title+=" width=‘"+columns[j].width+"‘";
       }
       else
       {
        title+=" width=‘"+columnWidth+"‘";
       }
       title+=">"+columns[j].label+"</td>";
      }
     }
     else
     {//跨列操作
      if(rs!=-1)
      {//跨行
       title+="<td class=‘column‘ align=‘center‘";
       if(columns[j].hidden)
       {
        columns[j].width=1;
        title+=" style=\"border:none;\"";
       }
       if(columns[j].width)
       {
        title+=" width=‘"+columns[j].width+"‘";
       }
       else
       {
        title+=" width=‘"+columnWidth+"‘";
       }
       title+=">"+(columns[j].label.split(‘,‘)[1])+"</td>";
      }
     }
    }
   }
   if(i==0)
   {//最后一列
    title+="<td class=‘lastcolumn‘ rowspan=‘2‘>&nbsp;</td></tr>";
   }
   else
   {
    title+="</tr>";
   }
  }
 }
 else
 {//正常情况
  title="<tr><td class=‘firstcolumn‘>&nbsp;</td>";
  if(isMultiple)
  {
   title+="<td class=‘column‘ width=‘30‘ align=‘center‘><input name=‘checkbox‘ type=‘checkbox‘ onclick=\"checkAllForGrid(this.checked,‘"+id+"chbox‘);\"/></td>";
  }
  for(var i=0;i<columns.length;i++)
  {
   title+="<td class=‘column‘ align=‘center‘";
   if(columns[i].hidden)
   {
    columns[i].width=1;
    title+=" style=\"border:none;\"";
   }
   if(columns[i].width)
   {
    title+=" width=‘"+columns[i].width+"‘";
   }
   else
   {
    title+=" width=‘"+columnWidth+"‘";
   } 
   title+=" onclick=\"sortTableForGrid(‘"+id+"‘,"+i+","+isMultiple+");\"";
   title+=">"+columns[i].label+"<span></span></td>";
  }
  title+="<td class=‘lastcolumn‘>&nbsp;</td></tr>";
 }
 if(columns&&columns.length>0)
 {//汇总表格
  sum="<tr><td class=‘firstcolumn‘>汇总</td>";
  if(isMultiple)
  {
   sum+="<td class=‘column‘ width=‘30‘>&nbsp;</td>";
  }
  for(var i=0;i<columns.length;i++)
  {
   sum+="<td class=‘column‘ align=‘center‘";
   if(columns[i].hidden)
   {
    columns[i].width=1;
    sum+=" style=\"border:none;\"";
   }
   if(columns[i].width)
   {
    sum+=" width=‘"+columns[i].width+"‘";
   }
   else
   {
    sum+=" width=‘"+columnWidth+"‘";
   } 
   sum+=">&nbsp;</td>";
  }
  sum+="<td class=‘lastcolumn‘>&nbsp;</td></tr>";
 }
 if(rows&&rows.size()>0)
 {//构建第一列和数据表格
  if(flag)
  {
   first="<tr><td>&nbsp;</td></tr>";
   first+="<tr><td>&nbsp;</td></tr>";
  }
  else
  {
   first="<tr><td>&nbsp;</td></tr>";
  }
  
  for(var i=0;i<rows.size();i++)
  {
   first+="<tr><td style=‘border-right:none;‘>"+(i+1)+"</td></tr>";
   data+="<tr><td class=‘firstcolumn‘ style=‘border-bottom-color:#cccccc;‘>"+(i+1)+"</td>";
   if(isMultiple)
   {
    data+="<td width=‘30‘ align=‘center‘><input type=‘checkbox‘ name=‘"+id+"chbox‘/></td>";
   }
   var rowId="rowid_"+(i+1);
   var map=rows.get(i);
   for(var j=0;j<columns.length;j++)
   {
    data+="<td";
    if(columns[j].hidden)
    {
     columns[j].width=1;
     data+=" style=\"border-right:none;\"";
    }
    if(columns[j].width)
    {
     data+=" width=‘"+columns[j].width+"‘";
    }
    else
    {
     data+=" width=‘"+columnWidth+"‘";
    }
    data+=">";
    data+=map.get(columns[j].name)==null?"&nbsp;":map.get(columns[j].name);
    data+="</td>";
   }
   data+="<td class=‘lastdata‘>";
   data+="<input name=‘rowid‘ type=‘hidden‘ value=‘"+(rowId)+"‘/>";
   data+="&nbsp;</td></tr>";
  }
 }
 //构建汇总列
    _sum_columns=new Array();//初始化
 var k=0;
 for(var i=0;i<columns.length;i++)
 {
  if(columns[i].sum&&(columns[i].type=="int"||columns[i].type=="number"))
  {
   if(isMultiple)
   {
    _sum_columns[k]=i+2;
   }
   else
   {
    _sum_columns[k]=i+1;
   }
   k++;
  }
 }
 put(id,‘_sum_columns‘,_sum_columns);
 var allWidth=0;
 for(var i=0;i<columns.length;i++)
 {
  if(columns[i].width)
  {
   allWidth+=parseInt(columns[i].width);
  }
  else
  {
   allWidth+=parseInt(columnWidth);
  }
 }
 allWidth+=30;
 if(isMultiple)
 {
  allWidth+=30;
 }
 var total=1;
 if(allWidth>width)
 {
  total=2;
  _isHbar=true;
 }
 put(id, ‘_isHbar‘, _isHbar);
 //构建隐藏行
 for(var i=0;i<total;i++)
 {
  data+="<tr><td style=\"border:0;\">&nbsp;</td>";
  for(var j=0;j<columns.length;j++)
  {
   data+="<td style=\"border:0;\">&nbsp;</td>";
  }
  data+="<td style=\"border:0;\">&nbsp;</td>";
  first+="<tr><td style=\"border:0;background-color:white;\">&nbsp;</td></tr>";
 }
 var title_html="<table id=‘header_"+id+"‘ cellspacing=‘0‘ cellpadding=‘0‘ class=‘titlecolumn‘>"+title+"</table>";
 var first_html="<table id=‘first_"+id+"‘ cellspacing=‘0‘ cellpadding=‘0‘ class=‘slidecolumn‘>"+first+"</table>";
 var data_html="<table id=‘"+id+"‘ cellspacing=‘0‘ cellpadding=‘0‘ class=‘datacolumn‘>";
 data_html+=title+data+"</table>";
 var sum_html="<table id=‘sum_"+id+"‘ cellspacing=‘0‘"+" cellpadding=‘0‘ style=‘width:100%;position:absolute;top:";
 if(_isHbar)
 {
  sum_html+=+(parseInt(height)-18-17);
 }
 else
 {
  sum_html+=(parseInt(height)-17);
 }
 sum_html+=";left:0;z-index:4;‘/>"+sum+"</table>";
 _execute(id, parentId, width, height, first_html+title_html+data_html+sum_html,isMultiple);
 sumRowForGrid(id);
}
/**
 * 列结构
 * @param name名称
 * @param label 标签
 * @param type 类型
 * @param width 宽度
 * @param height 高度
 * @param data 列数据来源是一个数组
 * @param hidden 是否隐藏
 * @param disabled 是否可用
 * @param sum 是否汇总
 * @param size 字符个数
 * @param colspan 跨列
 * @param rowspan 跨行
 * @param ondblclick 鼠标双击事件
 * @param drillEvent 数据钻取处理函数
 */
function GridColumn(name,label,type,width,height,data,hidden,disabled,sum,size,colspan,ondblclick,drillEvent)
{
 this.name=name;
 this.label=label;
 this.type=type;
 this.width=width;
 this.height=height;
 this.data=data;
 this.hidden=hidden;
 this.disabled=disabled;
 this.sum=sum;
 this.size=size;
 this.colspan=colspan;
 this.ondblclick=ondblclick;
 this.drillEvent=drillEvent;
}
/**
 *@param 排序
 *@param id为表格id
 *@param index:列索引
 *@param sort:asc是升序,dsc是降序
 *@param isMultiple是否多行
 */
function sortTableForGrid(id,index,isMultiple)
{
 var flag=get(id, ‘flag‘);
 var _isHbar=get(id, ‘_isHbar‘);
 var tr=new Array();//行集合
 var td=new Array();//列集合
 var temp;//临时单元格
    var table=document.getElementById(id);
    var header=document.getElementById("header_"+id);
    var sort;
    if(flag)
    {
     return;
    }
    if(isMultiple)
    {
     index+=2;
    }
    else
    {
     index+=1;
    }
    var html=header.rows[0].cells[index].childNodes[1].innerHTML;
    if(html=="")
    {
       sort="asc";
       header.rows[0].cells[index].childNodes[1].innerHTML="▲";
    }
    else if(html=="▲")
    {
       sort="dsc";
       header.rows[0].cells[index].childNodes[1].innerHTML="▼";
    }
    else if(html=="▼")
    {
       sort="asc";
       header.rows[0].cells[index].childNodes[1].innerHTML="▲";
    }
    var k=1;
    if(isMultiple)
    {
     k=2;
    }
    for(var i=k;i<header.rows[0].cells.length-1;i++)
    {
       if(i!=index)
       {
           header.rows[0].cells[i].childNodes[1].innerHTML="";
       }
    }
    if(_isHbar)
    {
     for(var i=1;i<table.rows.length-3;i++)
        {
           tr[i-1]=table.rows[i];
           td[i-1]=table.rows[i].cells[index];
        }
    }
    else
    {
     for(var i=1;i<table.rows.length-2;i++)
        {
           tr[i-1]=table.rows[i];
           td[i-1]=table.rows[i].cells[index];
        }
    }
   
    var isNumber=false;//是数字
    for(var i=0;i<td.length;i++)
    {
       if(!checkValueForGrid(td[i].innerHTML))
       {
       isNumber=true;//字符串
          break;
       }
    }
    //开始比较数据
    for(var i=0;i<td.length;i++)
    {
         for(var j=0;j<td.length;j++)
         {
            if(isNumber)
            {//字符串比较
                if(sort=="asc")
                {
                     if(td[i].innerHTML<td[j].innerHTML)
                     {
                         temp=td[i];
                         td[i]=td[j];
                         td[j]=temp;
                     }
                }
                else if(sort=="dsc")
                {
                    if(td[i].innerHTML>td[j].innerHTML)
                     {
                         temp=td[i];
                         td[i]=td[j];
                         td[j]=temp;
                     }
                }
            }
            else
            {//数字比较
               if(sort=="asc")
                {
                     if(parseFloat(td[i].innerHTML)<parseFloat(td[j].innerHTML))
                     {
                         temp=td[i];
                         td[i]=td[j];
                         td[j]=temp;
                     }
                }
                else if(sort=="dsc")
                {
                    if(parseFloat(td[i].innerHTML)>parseFloat(td[j].innerHTML))
                     {
                         temp=td[i];
                         td[i]=td[j];
                         td[j]=temp;
                     }
                }
            }
         }
    }
    var cellCount=table.rows[0].cells.length;
    var tempTR=new Array();//临时行
    for(var i=0;i<tr.length;i++)
    {
        var tempTD=new Array();//临时列集合
        for(var j=k;j<cellCount-1;j++)
        {
           tempTD[j]=td[i].parentNode.cells[j].innerHTML;
        }
        tempTR[i]=tempTD;
    }
    for(var i=0;i<tr.length;i++)
    {
       for(var j=k;j<cellCount-1;j++)
       {
           tr[i].cells[j].innerHTML=tempTR[i][j];
       }
    }
}
/**
 *汇总行
 *@param id 表格id
 *@param columns 汇总列数组
 */
function sumRowForGrid(id)
{
   var columns=get(id,‘_sum_columns‘);
   var _isHbar=get(id,‘_isHbar‘);
   var flag=get(id,‘flag‘);
   if(columns==undefined||columns.length==0)
   {
        return;
   }
   var sumTR=new Array();//汇总行临时数据
   var table=document.getElementById(id);
   var sum_table=document.getElementById("sum_"+id);
   if((_isHbar&&flag==false&&table.rows.length==3)||(_isHbar&&flag&&table.rows.length==4)||(!_isHbar&&flag&&table.rows.length==3)||(!_isHbar&&!flag&&table.rows.length==2))
   {
    for(var i=0;i<columns.length;i++)
    {
     sum_table.rows[0].cells[columns[i]].innerHTML=‘&nbsp;‘;
    }
    return;
   }
   var index=1;
   if(flag)
   {
    index=2;
   }
   var end=table.rows.length-1;
   if(_isHbar)
   {
     end=table.rows.length-2;
   }
   for(var i=index;i<end;i++)
   {
       for(var j=0;j<columns.length;j++)
       {
          var value=table.rows[i].cells[columns[j]].innerText;
          if(!checkValueForGrid(value))
          {
             value="0";
          }
          if(sumTR[j]==undefined)
          {
              sumTR[j]=value;
          }
          else if(sumTR[j]!="")
          {
              sumTR[j]=parseFloat(sumTR[j])+parseFloat(value);
          }
       }
   }
   //填充汇总行
   for(var i=0;i<columns.length;i++)
   {
    sum_table.rows[0].cells[columns[i]].innerHTML=sumTR[i];
   }
}
/**
 *检查value是否为数字,返回true是数字,返回false为字符串
 *@param value要检查的值
 */
function checkValueForGrid(value)
{
  if(value && value.length>0)
  {
    var newValue=value.replace(/\s+/g,"");
    value=newValue;
  }
  else
  {
   return false;
  }
  if(value.length>0 && value.indexOf(‘.‘)!=-1)
  {//判断是否是小数
   var express=/^\d+.\d+$/;//匹配小数
   if(express.test(value)){
     return true;
   }
   else
   {
    return false;
   }
  }
  else
  {
   var express=/^\d+$/;
   if(express.test(value))
   {
    return true;
   }
   else
   {
    return false;
   }
  }
  return false;
}
/**
 * 全选
 *@param checked是否选中true为选中,false没选中
 *@param name 名称
 */
function checkAllForGrid(checked,name)
{
 var checkList=document.getElementsByName(name);
 if(checkList && checkList.length>0)
 {
  for(var i=0;i<checkList.length;i++)
  {
   checkList[i].checked=checked;
  }
 }
}

/**
 * 构建表格以及滚动条
 * @param id 表格id
 * @param parentId 父节点,将建构建好的表格节点添加到父节点中
 * @param width 表格宽度
 * @param height 表格高度
 * @param ondblclick 表格双击事件
 * @param html (构建好的表格=序列号表格+表头表格+数据表格+汇总表格)
 * @return
 */
function _execute(id,parentId,width,height,html,isMultiple)
{
 /**
  * 定义构建表格需要的变量
  */
 var _first_object=null;//第一列,序数表格
 var _header_object=null;//表头
 var _data_object=null;//数据表格
 var _sum_object=null;//汇总表格
 var _hbar_object=null;//横向滚动条
 var _vbar_object=null;//纵向滚动条
 var _current_row=null;//当前选中行
 var mainFrame=document.createElement("DIV");
 mainFrame.id="DIV_"+id;
 mainFrame.style.width=width;
 mainFrame.style.height=height;
 mainFrame.className="datagrid";
 mainFrame.onmousedown=function (e){//鼠标按下事件
  e=e||window.event;
  _selectedRow(e,id,isMultiple);//选中行
 }
 mainFrame.innerHTML=html;
 /*
  * 添加滚动事件,根据IE的冒泡特性子节点事件触发自后如果父节点也有相同的事件
  * 就会接着执行父节点的事件
  */
 _addScrollEvent(mainFrame,id);
 //构建横向滚动条
 var hbar=document.createElement("DIV");
 hbar.id="hbar";
 hbar.style.position="absolute";
 hbar.style.width="100%";
 hbar.style.height="17px";
 hbar.style.overflowX="auto";
 hbar.style.top=height-17;
 hbar.style.zIndex="10";
 hbar.onscroll=function(){
  _h_scroll(id);//横向滚动
 }
 hbar.innerHTML="<div style=\"width:100%;height:1px;overflow-y:hidden;\">&nbsp;</div>";
 //构建纵向滚动条
 var vbar=document.createElement("DIV");
 vbar.id="vbar";
 vbar.style.position="absolute";
 vbar.style.width="17px";
 vbar.style.height="100%";
 vbar.style.overflowY="auto";
 vbar.style.left=width-17;
 vbar.style.zIndex="10";
 vbar.onscroll=function(){
  _v_scroll(id);//纵向滚动
 }
 vbar.innerHTML="<div style=\"width:1px;height:100%;overflow-x:hidden;\">&nbsp;</div>";
 //将表格和滚动条组合在一起
 mainFrame.appendChild(hbar);
 mainFrame.appendChild(vbar);
 //将构建好的表格节点追加到父节点中
 document.getElementById(parentId).appendChild(mainFrame);
 _first_object=document.getElementById("first_"+id);//第一列,序数表格
 _header_object=document.getElementById("header_"+id);//表头
 _data_object=document.getElementById(id);//数据表格
 _sum_object=document.getElementById("sum_"+id);//汇总表格
 _hbar_object=hbar;//横向滚动条
 _vbar_object=vbar;//纵向滚动条
 /*
  * 注册全局变量
  */
 put(id,‘_first_object‘,_first_object);
 put(id,‘_header_object‘,_header_object);
 put(id,‘_data_object‘,_data_object);
 put(id,‘_sum_object‘,_sum_object);
 put(id,‘_hbar_object‘,_hbar_object);
 put(id,‘_vbar_object‘,_vbar_object);
 var bt=_getCurrentStyle(mainFrame,"borderTopWidth");
 var bb=_getCurrentStyle(mainFrame,"borderBottomWidth");
 var bl=_getCurrentStyle(mainFrame,"borderLeftWidth");
 var br=_getCurrentStyle(mainFrame,"borderRightWidth");
 _hbar_object.style.top=parseInt(_hbar_object.style.top)-parseInt(bt)-parseInt(bb);
 _vbar_object.style.left=parseInt(_vbar_object.style.left)-parseInt(bl)-parseInt(br);
 _block_scroll(id);//设置滚动块
}
/**
 * 当鼠标按下时选中行
 * @param e
 * @return
 */
function _selectedRow(e,id,isMultiple)
{
 if(isMultiple)
  return;
 var td_object=e.srcElement?e.srcElement:e.target;
 var _data_object=get(id,‘_data_object‘);
 var table=document.getElementById(id);
 if(td_object.parentNode.tagName=="TR")
 {
  var tr_object=td_object.parentNode;
  var rowIndex=tr_object.rowIndex;//行索引
  var _current_row=get(id,‘_current_row‘);
  var flag=get(id,‘flag‘);
  var _isHbar=get(id,‘_isHbar‘);
  if(flag)
  {
   if(rowIndex==0||rowIndex==1)
   {
    return;
   }
  }
  else
  {
   if(rowIndex==0)
   {
    return;
   }
  }
  if(_isHbar)
  {
   if(rowIndex==table.rows.length-1||rowIndex==table.rows.length-2)
   {
    return;
   }
  }
  else
  {
   if(rowIndex==table.rows.length-1)
   {
    return;
   }
  }
  if(_current_row!=null)
  {//取消之前的选中行状态
   _data_object.rows[_current_row].className="";
  }
  //重新设置选中行状态
  _data_object.rows[rowIndex].className="selectedrow";
  _current_row=rowIndex;
  put(id,‘_current_row‘,_current_row);
 }
}
/**
 * 添加滚动事件监听器
 * @param element要添加事件的父节点
 * @return
 */
function _addScrollEvent(element,id)
{
 var handler=function(e)
 {
  _mouseScrollEvent.call(this, e,id);
 }
 if(document.attachEvent)
 {//微软自定义的添加事件监听器
  element.attachEvent("onmousewheel",handler);
 }
 else
 {//W3C规范定义的添加事件监听器
  element.addEventListener("DOMMouseScroll",handler,false);
 }
}
/**
 * 鼠标轮滚动事件和列表事件
 * @param e
 * @return
 */
function _mouseScrollEvent(e,id)
{
 e=e||window.event;
 var _vbar_object=get(id,‘_vbar_object‘);
 if(e.wheelDelta<=0 || e.detail>0)
 {
  _vbar_object.scrollTop+=18;//设置滚动步长为一行的高度
 }
 else
 {
  _vbar_object.scrollTop-=18;
 }
}
/**
 * 横向滚动
 * @return
 */
function _h_scroll(id)
{
 var _hbar_object=get(id,‘_hbar_object‘);
 var _header_object=get(id,‘_header_object‘);
 var _data_object=get(id,‘_data_object‘);
 var _sum_object=get(id,‘_sum_object‘);
 _header_object.style.left=-(_hbar_object.scrollLeft);
 _data_object.style.left=-(_hbar_object.scrollLeft);
 _sum_object.style.left=-(_hbar_object.scrollLeft);
}
/**
 *纵向滚动
 * @return
 */
function _v_scroll(id)
{
 var _vbar_object=get(id,‘_vbar_object‘);
 var _first_object=get(id,‘_first_object‘);
 var _data_object=get(id,‘_data_object‘);
 _first_object.style.top=-(_vbar_object.scrollTop);
 _data_object.style.top=-(_vbar_object.scrollTop);
}
/**
 * 取出当前元素非style定义的样式
 * @param element
 * @param property
 * @return
 */
function _getCurrentStyle(element,property)
{
 if(element.currentStyle)
 {//元素中非style定义的样式,包括内嵌样式和外部样式表中定义的样式
  return element.currentStyle[property];
 }
 else if(window.getComputedStyle)
 {//firefox的方式
  property=property.replace(/([A-Z])/g, "-$1").toLowerCase();
  return window.getComputedStyle(element,null).getPropertyValue(property);
 }
 else
 {
  return null;
 }
}
/**
 * 设置滚动块
 * @return
 */
function _block_scroll(id)
{
 var _hbar_object=get(id,‘_hbar_object‘);
 var _vbar_object=get(id,‘_vbar_object‘);
 var _data_object=get(id,‘_data_object‘);
 _hbar_object.style.display="block";
 _vbar_object.style.display="block";
 _hbar_object.childNodes[0].style.width=_data_object.offsetWidth;
 _vbar_object.childNodes[0].style.height=_data_object.offsetHeight;
 if(_hbar_object.childNodes[0].offsetWidth<=_hbar_object.offsetWidth)
 {
  _hbar_object.style.display="none";
 }
 if(_vbar_object.childNodes[0].offsetHeight<=_vbar_object.offsetHeight)
 {
  _vbar_object.style.display="none";
 }
}

/////////////////////////////////////////////////////////////////////////////////////
/**
 * js通用对象,主要包括List和Map集合对象的定义
 * @author 陈双
 * @date 2012-10-01
 * @mail [email protected]
 */
////////////////////////////////////////////////////////////////////////////////////
/**
 * List对象
 * @return
 */
function List()
{
 this.container=new Array(1000);//容器
 this.index=-1;//索引
 this.add=function(element){//添加元素
  this.index++;
  this.container[this.index]=element;
 }
 this.get=function(i){//获取元素
  if(this.index==-1||i<0)
  {
   return null;
  }
  return this.container[i];
 }
 this.size=function(){//List 对象的大小
  return this.index+1;
 }
 this.clear=function(){//清空List对象
  if(this.index!=-1)
  {
   for(var i=0;i<=this.index;i++)
   {
    this.container[i]=null;
   }
  }
  this.index=-1;
 }
 this.contain=function(element){//是否包含某元素
  if(this.index==-1||(!element))
  {
   return false;
  }
  for(var i=0;i<=this.index;i++)
  {
   if(this.container[i]==element)
   {
    return true;
   }
  }
 }
 this.isEmpty=function(){//是否为空
  return this.index==-1?true:false;
 }
 this.remove=function(element){//删除一个元素
  if((!element)||(!this.index))
  {
   return;
  }
  var po=-1;
  var flag=false;//是否移除了
  for(var i=0;i<=this.index;i++)
  {
   if(this.container[i]==element)
   {
    po=i;
    if(po==this.index)
    {
     po=-1;
    }
    flag=true;
   }
   if(po!=-1)
   {
    this.container[po]=this.container[po+1];
    po++;
   }
  }
  if(flag)
  {
   this.index=this.index-1;
  }
 }
 this.removeIn=function(i){//删除指定位置的元素
  if(i<0||this.index<0)
  {
   return;
  }
  var po=-1;
  var flag=false;//是否移除了
  for(var j=0;j<=this.index;j++)
  {
   if(j==i)
   {
    po=j;
    if(po==this.index)
    {
     po=-1;
    }
    flag=true;
   }
   if(po!=-1)
   {
    this.container[po]=this.container[po+1];
    po++;
   }
  }
  if(flag)
  {
   this.index=this.index-1;
  }
 }
}
/**
 * Map对象
 * @return
 */
function Map()
{
 this.index=-1;
 this.entrys=new Array(1000);
 this.get=function(key){//通过key映射value
  if(this.index==-1)
  {
   return null;
  }
  for(var i=0;i<=this.index;i++)
  {
   var entry=this.entrys[i];
   if(entry.key==key)
   {
    return entry.value;
   }
  }
  return null;
 }
 this.size=function(){//返回元素个数
  return this.index+1;
 }
 this.containsKey=function(key){//是否包含key值
  if(this.index==-1)
  {
   return false;
  }
  for(var i=0;i<=this.index;i++)
  {
   var entry=this.entrys[i];
   if(entry.key==key)
   {
    return true;
   }
  }
  return false;
 }
 this.containsValue=function(value){//是否包含值
  if(this.index==-1)
  {
   return false;
  }
  for(var i=0;i<=this.index;i++)
  {
   var entry=this.entrys[i];
   if(entry.value==value)
   {
    return true;
   }
  }
  return false;
 }
 this.put=function(key,value){//添加元素
  if(this.containsKey(key))
  {
   this.remove(key);
  }
  this.index++;
  this.entrys[this.index]=new Entry(key,value);
 }
 this.keySet=function(){//返回key集合
  if(this.index==-1)
  {
   return null;
  }
  var keys=new List();
  for(var i=0;i<=this.index;i++)
  {
   keys.add(this.entrys[i].key);
  }
  return keys;
 }
 this.values=function(){//返回值集合
  if(this.index==-1)
  {
   return null;
  }
  var value=new List();
  for(var i=0;i<=this.index;i++)
  {
   value.add(this.entrys[i].value);
  }
  return value;
 }
 this.clear=function(){//清空
  if(this.index!=-1)
  {
   for(var i=0;i<=this.index;i++)
   {
    this.entrys[i]=null;
   }
   this.index=-1;
  }
 }
 this.remove=function(key){//移除某个元素
  if(this.index==-1)
  {
   return;
  }
  var po=-1;
  var flag=false;
  for(var i=0;i<=this.index;i++)
  {
   var entry=this.entrys[i];
   if(entry.key==key)
   {
    po=i;
    if(i==this.index)
    {
     po=-1;
    }
    flag=true;
   }
   if(po!=-1)
   {
    this.entrys[po]=this.entrys[po+1];
    po++;
   }
  }
  if(flag)
  {
   this.index=this.index-1;
  }
 }
 this.isEmpty=function(){//是否为空
  if(this.index==-1)
  {
   return true;
  }
  return false;
 }
 this.entrySet=function(){//返回Entry
  if(this.index==-1)
  {
   return null;
  }
  var entry=new List();
  for(var i=0;i<=this.index;i++)
  {
   entry.add(this.entrys[i]);
  }
  return entry;
 }
}
/**
 * Map中的节点对象
 * @param key
 * @param value
 * @return
 */
function Entry(key,value)
{
 this.key=key;
 this.value=value;
}
css代码:

/*datagrid 大块样式*/
.datagrid {position:relative;background:white;margin:0px;padding:0px;overflow:hidden;border:1px inset;-moz-user-select:none;}
/*datagrid 表格全局样式*/
.datagrid table {table-layout:fixed;margin:0px;}
.datagrid table td {height:18px;cursor:default;font-size:12px;font-family:verdana;text-indent:2px;border-right:1px solid #cccccc;border-bottom:1px solid #cccccc;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;word-break:keep-all;}
.datagrid table td .arrow {font-size:8px;color:#808080;}
.datagrid table .lastdata {border-right:none;}
.datagrid table .column {cursor:default;background:buttonface;border-top:1px solid #fff;border-right:1px solid #404040;border-bottom:1px solid #404040;border-left:1px solid #fff;}
.datagrid table .over {cursor:default;background:buttonface;border-top:1px solid #fff;border-right:1px solid #404040;border-bottom:1px solid #404040;border-left:1px solid #fff;}
.datagrid table .sortdown {cursor:default;background:buttonface;border-right:1px solid #ffffff;border-bottom:1px solid #ffffff;border-left:1px solid #404040;border-top:1px solid #404040;position:relative;left:1px;}
.datagrid table .dataover {background:#FAFAFA;}
.datagrid table .firstcolumn {width:30px;text-indent:0px;text-align:center;background:buttonface;border-top:1px solid #fff;border-right:1px solid #404040;border-bottom:1px solid #404040;border-left:1px solid #fff;}
.datagrid table .lastcolumn {width:17px;background:buttonface;border-top:1px solid #fff;border-right:1px solid #404040;border-bottom:1px solid #404040;border-left:1px solid #fff;}
/*datagrid 选定行样式*/
.datagrid table .selectedrow {background:highlight;color:white;}
/*datagrid 表头样式*/
.titlecolumn {width:100%;position:absolute;top:0px;left:0px;z-index:3;}
/*datagrid 左边栏样式*/
.slidecolumn {width:30px;position:absolute;top:0px;left:0px;z-index:2;}
.slidecolumn td {width:30px;text-indent:0px;text-align:center;background:buttonface;border-top:1px solid #fff;border-right:1px solid #404040;border-bottom:1px solid #404040;border-left:1px solid #fff;}
/*datagrid 内容表体样式*/
.datacolumn {width:100%;position:absolute;top:0px;left:0px;}
.datacolumn td {top:0px;left:0px;margin:0px;padding:0px}
.datacolumn td input {margin:0px;border:0px #cccccc solid;}

多级动态暂未实现

时间: 2024-10-19 04:34:09

jsp 自定义标签实现表格转载http://blog.csdn.net/chenshuang_com的相关文章

JSP自定义标签渲染时报Illegal to flush错误

javax.servlet.ServletException:Illegal to flush within a custom tag 此错误是因为在JSP页面中的某一个自定义标签的doStartTag或doEndTag中用了out.flush,而其他的自定义标签没有导致.可以去掉out.flush. JSP自定义标签渲染时报Illegal to flush错误,布布扣,bubuko.com

JSP 自定义标签 生命周期

1. 2. JSP 自定义标签 生命周期,布布扣,bubuko.com

JSP自定义标签开发入门《转》

JSP自定义标签开发入门 一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发自定义标签所涉及到的接口与类的层次结构(其中SimpleTag接口与SimpleTagSupport类是JSP2.0中新引入的). 目标1:自定义一个用表格显示用户信息的简单标签 效果图: 在jsp页面使用此自定义标签: 假设我们有一个UserInfo的javabean,那

整理一份jsp自定义标签以及权限控制标签

jsp自定义标签使用场景因地制宜,可以实现自定义的标签输出功能也可以实现权限的管理 1:先定义标签类 1-1:页面输出标签 package com.suyin.web.jspsectag; import java.io.IOException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.Tag; public cla

一个简单的jsp自定义标签

学到了一个简单的jsp自定义标签,后面有更多的例子,会更新出来: 例子1: 步骤: 1.编写标签实现类: 继承javax.servlet.jsp.tagext.SimpleTagSupport; 重写doTag,实现在网页上输出: 2.在web-inf目录或其子目录下,建立helloword.tld文件,即自定义标签的说明文件 注意:标签处理类必须放在包中,不能是裸体类:不需要修改web.xml: //tld: tag lib description 标签库描述 java代码: package

JSP自定义标签配置

JSP自定义标签 <taglib> <taglib-uri>/WEB-INF/you.tld</taglib-uri> <taglib-location>/WEB-INF/you.tld</taglib-location> </taglib> 由这个配置可知,JSP自定义标签配置文件不是放在lib目录下,也不是放在classes文件夹中,更不是放在WebRoot目录下,而是放在WEB-INF目录下

JSP自定义标签开发入门

一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发自定义标签所涉及到的接口与类的层次结构(其中SimpleTag接口与SimpleTagSupport类是JSP2.0中新引入的). 目标1:自定义一个用表格显示用户信息的简单标签 效果图: 在jsp页面使用此自定义标签: 假设我们有一个UserInfo的javabean,那么在JSP页面使用此标签只

基于JSP 自定义标签使用实例介绍

添加JSP自定义标签: 先添加一个tld文件到WEB-INF文件夹中<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://

jsp自定义标签tag EL函数

原文:jsp自定义标签tagEL函数 源代码下载地址:http://www.zuidaima.com/share/1550463459052544.htm 简单易懂的自定义EL函数 tag.java </pre><p> </p><pre name="code" class="java">package com.zuidaima.tag; import java.io.IOException; import javax.