我正在使用Wicket DefaultDataTable
。它包含一些用户应该将值放入的文本字段。表格是一种形式。当我提交表单时,我希望获得所有“行”,以便我可以遍历它们。我不想使用AJAX。
我设法将表绑定到“Contact”对象,EditablePropertyColumn
在我想要的列中显示正确的字段和输入框。
如何获取行项目?提交表单时dataTable.getDefaultModelObject()
会返回null
。
答案 0 :(得分:3)
老实说,听起来你有一些其他(更基本的)错误。正如martin-g所提到的,editable属性列使用属性模型,这意味着当提交表单时(如果所有验证等都通过),它将在该模型上调用setObject,而后者将调用setFoo(其中“ POJO上的foo“是该列的属性”,它支持表中的那一行数据。
你可以(如唐提到的那样)使用访问者来遍历你桌子上的孩子。但是,一般来说,这意味着你做错了什么。编写Wicket是为了让您不必从表单提交中提取数据并将其自己推送到您的POJO上。该模型应该为您做到这一点。你不应该在自己周围“推”数据。
显示一些代码会有所帮助,但缺少这一点:无论您的表从哪里获取数据(某些联系人列表等) - 尝试从这些对象中提取数据。它应该已经填好了。如果不是,请发布一些代码 - 尤其是在初始化表及其数据提供者的地方。
答案 1 :(得分:2)
提交的数据填充在Contact对象中。这就是PropertyColumn的工作原理。
答案 2 :(得分:1)
DefaultDataTable在该方法中有一个方法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);
}
答案 3 :(得分: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)
由这些“访问”方法调用,每个组件都作为参数找到。返回值是继续或退出遍历的信号,您定义的方法可以将它在组件中找到的内容收集到列表中。