2011-11-10 24 views
1

我正在使用Wicket DefaultDataTable。它包含用户应该将值放入的一些文本字段。表格是一种形式。当我提交表单时,我想要掌握所有“行”,以便可以遍历它们。我不想使用AJAX。如何从一个Wicket数据表中获取所有模型对象

我已经设法将表格绑定到“Contact”对象,其中EditablePropertyColumn显示了我想要的列中的正确字段和输入框。

我该如何获得排项目?表单提交时,dataTable.getDefaultModelObject()返回null

+1

你能告诉我们表单代码吗? –

回答

2

提交的数据填充到Contact对象中。这是PropertyColumn的工作原理。

+0

谢谢,但是这并没有回答我的问题:在添加到表单的数据表中,(即列出一堆contactobject的数据表)如何获取数据表行并在onsubmit按钮中循环访问它们? – Jojaman

+0

应该是“如何获取数据表行并在onsubmit覆盖中遍历它们,当按下表单submitbutton” – Jojaman

+2

但是,它确实......数据被放入Contact对象,该对象可从您的DataProvider中获得。所以不需要访问行,只需从提供者处获取列表并在此列表上进行迭代即可。 – Nicktar

1

的DefaultDataTable在thath方法的方法newRowItem你可以捕捉所显示的表款:

private List<IModel<T>> models= new LinkedList<IModel<T>>(); 
    @Override 
    protected Item<T> newRowItem(final String id, int index, 
      final IModel<T> model) { 
       models.add(model); 
    } 
0

这将是更容易,如果你表现出你有代码要具体,但我可以想到两个通用的方法。

一种方法是在您构建DefaultDataTable时,维护一个模型引用列表。

如果很难找到这样做的方法,另一种可能的方法是使用Wicket的IVisitor的实现来搜索数据表内的组件,以查找包含模型的组件。

WebMarkupContainer类有一个方法

public final <S extends Component> Object visitChildren(final Class<?> clazz, 
    final IVisitor<S> visitor) 

可用于遍历所有包含在一个特定类的组件,和一种方法

public final Object visitChildren(final IVisitor<Component> visitor) 

其不相同,但不限制于一具体的类。

IVisitor<T extends Component>接口需要你定义一个方法

public Object component(T component) 

其通过这些“访问”的方法以发现作为参数的每个组件调用。返回值是继续或退出遍历的信号,您定义的方法可以将它在组件中找到的内容收集到列表中。

3

说实话,这听起来像你有一些其他(更基本)的东西是错的。正如martin-g提到的那样,可编辑属性列使用属性模型,这意味着当表单被提交时(如果所有验证等都通过),它将在该模型上调用setObject,这又会调用setFoo(其中“ foo“是该列的属性)在POJO上支持您表中的该行数据。

你可以(正如唐提到的)使用访问者遍历表中的子元素。但是,一般来说,这意味着你正在做其他事情。 Wicket是这样编写的,您不必从表单提交中提取数据,并将它自己推送到您的POJO上。模型应该为你做。你不应该在你周围“推”数据。

显示一些代码会有帮助,但缺点:无论你的表从哪里获取数据(某些联系人列表等) - 尝试从这些相同的对象中提取数据。它应该已经为你填充。如果不是,请发布一些代码 - 特别是在初始化表及其数据提供者的位置。

相关问题