程式先锋Java技术维客

datatable动态添加列应当如何来实现

十月 15, 2009 by czl
许多开发JSF的朋友可能会遇到这样的问题,如果DataTable的列不固定,需要动态生成, 应该如何实现呢。

 

假设FacesConfig中配置一个名为bean的MBean,该MBean中需定义一个类型为javax.faces.component.html.HtmlDataTable类型的变量dt,页面中的DataTable设置bingding="#{bean.dt}"。

 

首先了解一下JSF中DataTable的渲染方式:

 

DataTable

--<Header> UIComponent

--<Children>List<HtmlColumn>

----<HtmlColumn>

------<Header>UIComponent

----<Children>List<UIComponent>

因此,要在后台变更DataTable的状态,可以用dt.setHeader(UIComponent)设置DataTable的表头,然后可以往dt.getChildren()中添加HtmlColumn类型的列,同样,列中也可以由Header和Children组成。

代码实现如下:

 

private void initialReportTable(List<ExcelReport> reportList) {
    dt.getChildren().clear();
    for (ExcelReport report : reportList) {
        HtmlColumn column = new HtmlColumn();
        HtmlOutputText header = new HtmlOutputText();
        header.setValueExpression("value",
        getValueExpression("#{rmaReport.captions.c"
            + report.getPosition() + "}"));
        column.setHeader(header);

        HtmlOutputText value = new HtmlOutputText();
        String ve = getVEString(report);
        System.out.println(report.getCaption() + " : " + ve);
        value.setValueExpression("value", getValueExpression(ve));
        column.getChildren().add(value);

        dt.getChildren().add(column);
    }
}

其中,动态建立控件的方法为直接创建一个控件,然后通过ValueExpression来设置控件在运行时显示的值,如果是Column中的数据,则可以使用#{tableVar.ColumnName}格式的EL表达式。



发表一条评论:
  • HTML语法: 启用

Search

 

« 七月 2010
星期日星期一星期二星期三星期四星期五星期六
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
       
今天

Feeds

Navigation