2011年6月10日金曜日

S2JSFで二重のループを

表形式の入力欄をS2JSFで作りたいと思いました。



のようなイメージです。

s:forEachを二重で回して外側のループで行を、内側のループで列を作る、というのが素直な気がします。

描画は何も考えることなくできたのですが、データが更新されません。

調べてみると、ボタンを押したときのアクションメソッドに処理が到達していません。

さらに調べると、inputのバリデーションで入力値が許容できない形式と判定されて、元の画面に戻されているようです。

よくよく調べると、内側のループで列数を変えているのが問題のようです。最後の行、勤続年数が2列になっていますが、このために全ての行が2列だと勘違いをしてしまい、4列目のinput要素の初期化が行なわれていないようです。

そこでワークアラウンドを。

Index: org/seasar/jsf/component/ForEach.java
===================================================================
--- org/seasar/jsf/component/ForEach.java (revision 159)
+++ org/seasar/jsf/component/ForEach.java (revision 160)
@@ -59,4 +59,5 @@
 
     private int rowCount;
+    private int maxRowCount;
 
     private Object[] rows = EMPTY_ROWS;
@@ -242,4 +243,5 @@
         setupRows();
         rowCount = rows.length;
+        maxRowCount = (maxRowCount < rowCount)? rowCount : maxRowCount;
         for (int i = 0; i < rows.length; ++i) {
             setRowIndex(i);
@@ -322,5 +324,5 @@
         values[2] = varIndex;
         values[3] = descendantComponentStates;
-        values[4] = new Integer(rowCount);
+        values[4] = new Integer(maxRowCount);
         return values;
     }
@@ -333,4 +335,5 @@
         descendantComponentStates = (Map) values[3];
         rowCount = ((Integer) values[4]).intValue();
+        maxRowCount = rowCount;
     }
 
ご利用は計画的に。

S2JSFは、1.1.2を利用しています。

0 件のコメント:

コメントを投稿