かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

VWPのテーブルに集計結果を表示してみよう

この1つ前の投稿は簡単すぎたので、もうちょいひねってみる。
最終的にこんな画面を目指す。

まずは、適当にデータプロバイダを作ってバインドした表を作る。
TableにTableRowGroupをドラッグアンドドロップで追加する。
んで、こんなBeanをDataProviderを作る。

// Bean
public class EmpAccum {
    private String title;
    private String value;
    
    /** Creates a new instance of EmpAccum */
    public EmpAccum() {
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
    
}
// DataProvider
public class EmpAccumDataProvider extends ObjectListDataProvider {
    
    /** Creates a new instance of EmpAccumDataProvider */
    public EmpAccumDataProvider() {
        setObjectType(EmpAccum.class);
    }
    
}

これをSessionBean1にプロパティでもたせてTableRowGroup2にバインドしておく。
TableLayoutはこんな感じ

そして、ボタンクリックのアクションの中身はこんな具合。
合計と平均を作ってDataProviderに設定してる。

    public String button1_action() {
        List emps = getSessionBean1().getEmployeesDataProvider().getList();
        int sum = 0;
        for (Iterator it = emps.iterator(); it.hasNext();) {
            Employees emp = (Employees) it.next();
            sum += emp.getSalary().intValue();
        }
        
        EmpAccum sumData = new EmpAccum();
        EmpAccum avgData = new EmpAccum();
        
        sumData.setTitle("合計:");
        sumData.setValue(Integer.toString(sum));
        
        avgData.setTitle("平均:");
        avgData.setValue(Integer.toString(sum / emps.size()));
        
        List accums = new ArrayList();
        accums.add(sumData);
        accums.add(avgData);
        getSessionBean1().getEmpAccumDataProvider().setList(accums);
        
        return null;
    }

これで実行すると…

まだタイトルが残る。
TableRowGroup2のカラムのTitleを空文字にすれば完成。
TableRowGroup2のemptyDataMsgには全角スペースぶちこんどいた。
これが一番目立たない?