You are welcome.
Just an additional comment. On method
public IModel<TestBean> model(TestBean object) {
return new Model<TestBean>(object);
}
of the DataProvider it might be better to return an LDM in order to
keep page lightweight.
Cheers,
Ernesto
On Fri, Apr 30, 2010 at 9:51 AM, Robert Kimotho <[email protected]> wrote:
> Thanks alot Ernesto, exactly what I've been wanting, the dropdown no longer
> crashes when there is no data.
>
> Cheers,
> Kimotho.
>
> On Thu, Apr 29, 2010 at 4:39 PM, Ernesto Reinaldo Barreiro <
> [email protected]> wrote:
>
>> 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]
>>
>>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]