Kimotho,
Following example works.
------------------------------------
package test.dataview;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class TestBean implements Serializable {
private static final long serialVersionUID = 1L;
public static final List<String> CATEGORIES = new ArrayList<String>();
static {
CATEGORIES.add("A");
CATEGORIES.add("B");
CATEGORIES.add("C");
};
private static List<TestBean> beans;
String name;
String category;
public TestBean() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public static List<TestBean> getBeans() {
if(beans == null) {
beans = new ArrayList<TestBean>();
for(String cat: new String[]{"A","B"})
for(int i=0; i<10; i++) {
TestBean bean = new TestBean();
bean.setCategory(cat);
bean.setName("Name " + cat + i);
beans.add(bean);
}
}
return beans;
}
}
--------------------
package test.dataview;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.markup.repeater.data.IDataProvider;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
public class TestBeanDataProvider implements IDataProvider<TestBean> {
private static final long serialVersionUID = 1L;
private TestBean filter;
private List<TestBean> list;
/**
*
*/
public TestBeanDataProvider() {
}
public java.util.Iterator<? extends TestBean> iterator(int first, int
count) {
return getList().iterator();
};
public int size() {
return getList().size();
}
public IModel<TestBean> model(TestBean object) {
return new Model<TestBean>(object);
}
List<TestBean> getList() {
if(filter == null || filter.category == null) {
return TestBean.getBeans();
}
if(list == null) {
list = new ArrayList<TestBean>();
for(TestBean bean: TestBean.getBeans()){
if(bean.category.equals(filter.category))
list.add(bean);
}
}
return list;
}
public void detach() {
list = null;
};
public TestBean getFilter() {
return filter;
}
public void setFilter(TestBean filter) {
this.filter = filter;
}
}
-------------------------
package test.dataview;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.Model;
public class TestDataViewPanel extends Panel {
private static final long serialVersionUID = 1L;
private WebMarkupContainer toRepaint;
private TestBean bean;
private TestBeanDataProvider dataProvider;
/**
* Constructor that is invoked when page is invoked without a session.
*
* @param parameters
* Page parameters
*/
public TestDataViewPanel(String id) {
super(id);
bean = new TestBean();
dataProvider = new TestBeanDataProvider();
toRepaint = new WebMarkupContainer("toRepaint");
toRepaint.setOutputMarkupId(true);
add(toRepaint);
Form<TestBean> form = new Form<TestBean>("form");
toRepaint.add(form);
DropDownChoice<String> category = new
DropDownChoice<String>("category", new Model<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
return bean.getCategory();
}
@Override
public void setObject(String object) {
bean.setCategory(object);
}
},TestBean.CATEGORIES);
category.add(new AjaxFormComponentUpdatingBehavior("onchange") {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
dataProvider.setFilter(bean);
target.addComponent(toRepaint);
}
});
form.add(category);
form.add(new DataView<TestBean>("rows", dataProvider) {
private static final long serialVersionUID = 1L;
public void populateItem(final Item<TestBean> item)
{
final TestBean user = item.getModelObject();
item.add(new Label("id", user.getName()));
}
});
}
}
--------------------------------------
<html
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:panel>
<div wicket:id="toRepaint">
<form wicket:id="form">
<div>
Category: <select wicket:id="category"></select>
</div>
<table>
<tbody>
<tr wicket:id="rows">
<td><span wicket:id="id"></span></td>
</tr>
</tbody>
</table>
</form>
</div>
</wicket:panel>
</body>
</html>
---------------------------
Is something like this what you want to achieve?
Ernesto
On Thu, Apr 29, 2010 at 2:25 PM, Ernesto Reinaldo Barreiro
<[email protected]> wrote:
> Just some questions... How does DataView's dataProvider get's affected
> by the code on onUpdate? Does getDataProvider(params); recreate it?
> Then the instance stored on DataView is different from the one you
> retrieve with getDataProvider(params)? Why not implement a
> SortableDataProvider, keep a local copy of it, pass it to DataView and
> update it's sort state on the onUpdate method?
>
> Ernesto
>
> On Thu, Apr 29, 2010 at 1:51 PM, Robert Kimotho <[email protected]> wrote:
>> I have experienced the same issue, the only difference is that
>> when there was no data in the database the dropdown crashed and could
>> not display any
>> values, I'm also using AjaxFormComponentUpdatingBehavior onchange
>>
>> Here is a section of my code:-
>>
>> final WebMarkupContainer commentListContainer = new
>> WebMarkupContainer("commentListContainer");
>> commentListContainer.setOutputMarkupId(true);
>>
>> final DropDownChoice<String> cats = new DropDownChoice<String>("cat_select",
>> new PropertyModel<String>(new VComment(), "category")
>> , category.getCategoriesByType("vcomment"), new ChoiceRenderer<String>());
>> cats.setOutputMarkupId(true);
>> add(cats);
>>
>> final AbstractDataProvider<VComment> dataProvider = (VCommentDataProvider)
>> getDataProvider(params);
>>
>> final DataView<VComment> commentView = new DataView<VComment>("commentList",
>> dataProvider, 10) {
>>
>> @Override
>> protected void populateItem(Item<VComment> item) {.....}
>> }
>> commentListContainer.add(commentView);
>> ........
>> cats.add(new AjaxFormComponentUpdatingBehavior("onchange") {
>> @Override
>> protected void onUpdate(AjaxRequestTarget target) {
>> params.put("cat", cats.getModelObject());
>> getDataProvider(params);
>> target.addComponent(commentListContainer);
>> target.addComponent(cats);
>> }
>> });
>>
>> Kimotho.
>>
>> On Thu, Apr 29, 2010 at 12:42 PM, Ernesto Reinaldo Barreiro <
>> [email protected]> wrote:
>>> Can you post the code that was failing somewhere? Maybe someone can
>>> spot what is happening;-)
>>>
>>> Best,
>>>
>>> Ernesto
>>>
>>> On Thu, Apr 29, 2010 at 11:21 AM, Reinout van Schouwen
>>> <[email protected]> wrote:
>>>>
>>>> Replying to myself.
>>>>
>>>> I've worked around the problem by not using the AJAX method to update my
>>>> DataView but by reloading the page with different pageparameters after a
>>>> selection instead. Far from ideal, but the best I could come up with.
>>>>
>>>> Alternative solutions still welcome!
>>>>
>>>> Op maandag 26-04-2010 om 14:20 uur [tijdzone +0200], schreef Reinout van
>>>> Schouwen:
>>>>> I'm having trouble figuring out the following problem.
>>>>>
>>>>> I have a div (coupled to a WebMarkupContainer) containing a form and a
>>>>> list. The list is populated with a DataView, which gets its data from a
>>>>> SortableDataProvider that I have implemented according to the repeater
>>>>> examples provided on wicket-library.com.
>>>>>
>>>>> What I want to do is to change the sort order based on a user selection
>>>>> from a DropDownChoice in the form. I've used an
>>>>> AjaxFormComponentUpdatingBehavior to listen to the dropdown's onchange
>>>>> event. In the onUpdate() method I change the sortparam in the
>>>>> dataprovider according to the selection and then add the container div
>>>>> to the AjaxRequestTarget.
>>>>>
>>>>> What I expect to happen is that the DataView updates to reflect the new
>>>>> sort order. What actually happens is that the DataView completely
>>>>> disappears from the page! (The Wicket Ajax Debug window shows me that
>>>>> the spot where the list should be in the HTML within the ajax-response
>>>>> is indeed empty.)
>>>>>
>>>>> I've already set the outputmarkupid and the outputmarkupplaceholdertag
>>>>> properties on the container to true but that makes no difference.
>>>>>
>>>>> Any ideas are appreciated!
>>>>>
>>>>> regards,
>>>>>
>>>>
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: [email protected]
>>>> For additional commands, e-mail: [email protected]
>>>>
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>>
>>>
>>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]