Thanks for your suggestion Maurice, I had a bit of trouble getting the syntax
to work correctly so resorted to another solution which I've explained below
for those that might come across this post. It's probably not the best
solution but it's good enough for my demo tomorrow!
Instead of passing a model as the second argument to the getParamPanels
method I passed an object.
This object is then used to hold a list of Models.
Then when adding the components to the list I added the models to a list as
well stored within this second object:
> for (QueryDefParam p : qdp) {
QueryParamValue valueModel = new QueryParamValue(); // this is a generic
model that I'm going to try and use for each component
> if ("TextField".equals(p.getName())) {
> params.add(new TextFieldPanel("panel", new
> CompoundPropertyModel(compModel), p.getDescription()));
> }
> else if ("CheckBox".equals(p.getName())) {
> params.add(new CheckBoxPanel("panel", null,
> p.getDescription()));
> }
response.addValues(valueModel); // we must add the new model to the list
> }
Then when the Submit button is pressed I am able to just loop through the
list from the response object.
Thanks again,
Will
Mr Mean wrote:
>
> In the Button.onSubmit do getForm.visitChildren(FormComponent.class,
> new IVisitor()
> {
> public Object component(Component component)
> {
> //do something with the models from the components here.
> }
> }
>
> Maurice
>
> On Fri, Jun 13, 2008 at 2:10 PM, wfroud <[EMAIL PROTECTED]> wrote:
>>
>> Hi All,
>>
>> I have successfully written some code to create a dynamic form depending
>> on
>> drop down selection.
>>
>> I have used the technique described here
>> http://cwiki.apache.org/WICKET/forms-with-dynamic-elements.html
>>
>> A shortened copy of the code is below.
>>
>> The problem I'm now having is how to extract data entered into the
>> dynamically generated components.
>> I'm starting with trying to get information from the TextField component,
>> so
>> any help regarding
>> this would be of enormous help. Please refer to the TODO comments below,
>> I
>> think I'm close.
>>
>>
>> // Define a model to hold values for any component, at the moment just
>> the
>> TextField.
>>
>> final ComponentPanelModel compPanelModel = new ComponentPanelModel();
>>
>> // Define the list model.
>>
>> final List paramsList = getParamPanels(queryDef, compPanelModel);
>>
>> IModel paramsModel = new LoadableDetachableModel() {
>> protected Object load() {
>> return paramsList;
>> }
>> };
>>
>> // Then add the list to the page.
>>
>> f.add(new ListView("paramsList", paramsModel) {
>>
>> @Override
>> public ListView setReuseItems(boolean arg) {
>> // According to
>> http://cwiki.apache.org/WICKET/using-listviews.html
>> // we need to add this or items will be removed and
>> re-added,
>> // without being validated.
>> return super.setReuseItems(true);
>> }
>>
>> @Override
>> protected void populateItem(ListItem item) {
>> Panel p = (Panel) item.getModelObject();
>> item.setModel(new CompoundPropertyModel(p));
>> item.add(p);
>> }
>>
>> private void optimizedItemRemoval() {
>> // According to
>> http://cwiki.apache.org/WICKET/forms-with-dynamic-elements.html
>> // this should be used to prevent components from
>> forgetting content.
>> // Not sure how to yet.
>> }
>> });
>>
>> // This is the method that returns the various panels:
>>
>> public List getParamPanels(QueryDef queryDef, ComponentPanelModel
>> compModel)
>> {
>>
>> List<Panel> params = new ArrayList<Panel>();
>> if (queryDef == null) {
>> return params;
>> }
>>
>> List<QueryDefParam> qdp =
>> queryDefParamDao.getQueryDefParams(queryDef.getQueryDefId());
>>
>> for (QueryDefParam p : qdp) {
>>
>> if ("TextField".equals(p.getName())) {
>> params.add(new TextFieldPanel("panel", new
>> CompoundPropertyModel(compModel), p.getDescription()));
>> }
>> else if ("CheckBox".equals(p.getName())) {
>> params.add(new CheckBoxPanel("panel",
>> null, p.getDescription()));
>> }
>>
>> }
>>
>> return params;
>> }
>>
>> f.add(new Button("save") {
>> public void onSubmit() {
>>
>> // TODO Iterate through the list of panels, which may
>> differ TextField,
>> Check box etc.
>> // TODO For each one we need to be able to access the
>> model objects value.
>>
>> }
>> });
>>
>>
>> public class ComponentPanelModel {
>> private String textField;
>>
>> public String getTextField() {
>> return textField;
>> }
>>
>> public void setTextField(String textField) {
>> this.textField = textField;
>> }
>> }
>>
>> public class TextFieldPanel extends Panel {
>> public TextFieldPanel(String name, IModel model, String
>> description) {
>> super(name, model);
>> add(new TextField("textField"));
>> add(new Label("description", description));
>> }
>> }
>>
>> public class CheckBoxPanel extends Panel {
>> public CheckBoxPanel(String name, IModel model, String description) {
>> super(name, model);
>> add(new CheckBox("checkBox", new Model()));
>> add(new Label("description", description));
>> }
>> }
>>
>> Thanks again.
>>
>> Will
>> --
>> View this message in context:
>> http://www.nabble.com/Dynamic-Form-Data-Retrieval-tp17822033p17822033.html
>> Sent from the Wicket - User mailing list archive at Nabble.com.
>>
>>
>> ---------------------------------------------------------------------
>> 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]
>
>
>
--
View this message in context:
http://www.nabble.com/Dynamic-Form-Data-Retrieval-tp17822033p17887398.html
Sent from the Wicket - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]