2017-09-29 59 views
1

我需要編輯,顯示從數據庫中的數據以表格的形式,保存,取消,刪除按鈕,在檢票其所謂的編輯網格。如何使用2個相關的下拉菜單實現可編輯的網格?

在錶行應在2個下拉選擇被顯示後編輯按鈕點擊數據並基於第一下拉的選擇來選擇從第一下拉數據然後第二下拉數據模型應該改變。

我已經通過了https://github.com/wicketstuff/core/tree/master/editable-grid-parent。但它只顯示1個下拉式可編輯網格,我想要2個下拉菜單。請幫助。

更新: 我已經使用這個

private List<AbstractEditablePropertyColumn<Person, String>> getColumns() 
     { 
    List<AbstractEditablePropertyColumn<Person, String>> columns = new ArrayList<AbstractEditablePropertyColumn<Person, String>>(); 
    stateDropDownPropertyColumn = new AbstractEditablePropertyColumn<Person, String>(new PropertyModel<String>(this, "selectedMake"), "state") 
    { 

     private static final long serialVersionUID = 1L; 

     public EditableCellPanel<Person> getEditableCellPanel(String componentId) 
     { 

      return getStateDDCellpanel(componentId,this);    
     } 
    }; 

    cityDropDownPropertyColumn = new AbstractEditablePropertyColumn<Person, String>(new Model<String>("CarModel"), "city"){ 

     private static final long serialVersionUID = 1L; 

     @Override 
     public EditableCellPanel<Person> getEditableCellPanel(String componentId) { 
      // TODO Auto-generated method stub 
      return getCityDDCellpanel(componentId,this); 
     }}; 

    columns.add(stateDropDownPropertyColumn); 
    columns.add(cityDropDownPropertyColumn); 
    return columns; 
} 
    private EditableRequiredDropDownCellPanel<Person, String> getStateDDCellpanel(String componentId, 
            AbstractEditablePropertyColumn<Person, String> DropDownPropertyColumn){ 

    this.stateComponentID = componentId; 
    this.stateDropDownPropertyColumn = DropDownPropertyColumn; 
    stateDropDownCellPanel = new EditableRequiredDropDownCellPanel<Person,  String>(stateComponentID, stateDropDownPropertyColumn, stateChoices); 

    return stateDropDownCellPanel; 

} 

private EditableRequiredDropDownCellPanel<Person, String> getCityDDCellpanel(String componentId, 
     AbstractEditablePropertyColumn<Person, String> DropDownPropertyColumn){ 

    this.cityComponentID = componentId; 
    this.cityDropDownPropertyColumn = DropDownPropertyColumn; 
    cityDropDownCellPanel = new EditableRequiredDropDownCellPanel<Person, String>(cityComponentID, cityDropDownPropertyColumn, cityChoices); 
    cityDropDownCellPanel.setOutputMarkupId(true); 
    cityDropDownCellPanel.setOutputMarkupPlaceholderTag(true); 
    return cityDropDownCellPanel; 

} 

我沒有這個,我需要忍受下拉細胞的行爲的任何想法。

+0

模式可以應用到兩個,三個下拉菜單。閱讀小心,如何建立列的列表,並添加您的。 –

+0

MAYBE你想要「wikcket動態選擇列表」(中間的句子對我來說不清楚)。此模式易於使用 –

+0

來自此源的模式可應用於2個下拉列表,但選擇列表不是動態的。我將如何使用這個源代碼,並且通常使用wicket下拉列表選項是動態的。 – nitin

回答

0

可能幾乎直接回答根據動態列表(第一是固定的,第二ID依賴,動態計算)問題: http://examples7x.wicket.apache.org/ajax/choice

爲了與SO規則不包括純鏈接,摘錄從官方例如Apache許可證 (準備縮短 - 未編譯)

模型允許您準備更改的數據,並且AJAX事件強制刷新 - 這是想法的核心。事件(ajax行爲)與第一個「製造者」相關聯,行爲力量更新「模型」。這是典型的wicket + ajax模式。

/** 
* Linked select boxes example 
* 
* @author Igor Vaynberg (ivaynberg) 
*/ 
public class ChoicePage extends BasePage 
{ 
private String selectedMake; 

private final Map<String, List<String>> modelsMap = new HashMap<>(); // map:company->model 

/** 
* @return Currently selected make 
*/ 
public String getSelectedMake() 
{ 
    return selectedMake; 
} 

/** 
* @param selectedMake 
*   The make that is currently selected 
*/ 
public void setSelectedMake(String selectedMake) 
{ 
    this.selectedMake = selectedMake; 
} 

/** 
* Constructor. 
*/ 
public ChoicePage() 
{ 
    modelsMap.put("AUDI", Arrays.asList("A4", "A6", "TT")); 
    modelsMap.put("CADILLAC", Arrays.asList("CTS", "DTS", "ESCALADE", "SRX", "DEVILLE")); 
    modelsMap.put("FORD", Arrays.asList("CROWN", "ESCAPE", "EXPEDITION", "EXPLORER", "F-150")); 

    IModel<List<String>> makeChoices = new AbstractReadOnlyModel<List<String>>() 
    { 
     @Override 
     public List<String> getObject() 
     { 
      return new ArrayList<>(modelsMap.keySet()); 
     } 

    }; 

    IModel<List<String>> modelChoices = new AbstractReadOnlyModel<List<String>>() 
    { 
     @Override 
     public List<String> getObject() 
     { 
      List<String> models = modelsMap.get(selectedMake); 
      if (models == null) 
      { 
       models = Collections.emptyList(); 
      } 
      return models; 
     } 

    }; 

    Form<?> form = new Form("form"); 
    add(form); 

    final DropDownChoice<String> makes = new DropDownChoice<>("makes", 
     new PropertyModel<String>(this, "selectedMake"), makeChoices); 

    final DropDownChoice<String> models = new DropDownChoice<>("models", 
     new Model<String>(), modelChoices); 
    models.setOutputMarkupId(true); 

    form.add(makes); 
    form.add(models); 

    ... 

    makes.add(new AjaxFormComponentUpdatingBehavior("change") 
    { 
     @Override 
     protected void onUpdate(AjaxRequestTarget target) 
     { 
      target.add(models); 
     } 
    }); 
    } 
} 

UPDATE after comment。讓我們回到之前的github代碼,必須按模型替換固定列表。怎麼樣???派生或複製,使用IModel添加構造器... Wicket具有非常好的對象設計。 以類似的方式,我們添加未知的列類型(未計劃)網格作者。

BTW您的評論「它不工作」是非常廣闊的。對不起,如果可以,我可以幫忙,但是不要爲你完成全部項目。希望你會喜歡編碼。

package org.wicketstuff.egrid.column; 

import java.util.List; 

import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; 
import org.apache.wicket.markup.html.form.DropDownChoice; 
import org.apache.wicket.markup.html.form.FormComponent; 
/** 
* 
* @author Nadeem Mohammad 
* 
*/ 
public class EditableRequiredDropDownCellPanel<T, S> extends EditableCellPanel 
{ 

    private static final long serialVersionUID = 1L; 

    public EditableRequiredDropDownCellPanel(final String id, final PropertyColumn<T, S> column, @SuppressWarnings("rawtypes") final List choices) 
    { 
     super(id); 

     @SuppressWarnings("unchecked") 
     DropDownChoice<T> field = new DropDownChoice<T>("dropdown", choices); <--- **** Here should be model **** 
     field.setLabel(column.getDisplayModel()); 
     add(field); 
    } 

    @Override 
    public FormComponent<?> getEditableComponent() 
    { 
     return (FormComponent<?>) get("dropdown"); 
    } 
} 

然後改變類返回這裏:

columns.add(new AbstractEditablePropertyColumn<Person, String>(new Model<String>("Age"), "age") 
     { 

      private static final long serialVersionUID = 1L; 

      public EditableCellPanel getEditableCellPanel(String componentId) 
      { 
       return new ***** EditableRequiredDropDownCellPanel ***** <Person, String>(componentId, this, Arrays.asList("10","11","12","13","14","15")); 
      } 

}); 

添加Beahviours也從這個來源

+0

@jackez這很好,但我已經嘗試過這種可編輯網格的例子,它不工作。你能否用getColumn()在可編輯網格示例中給出一個想法。 – nitin

+0

這是我的問題是我應該在哪裏把行爲放在代碼中。 – nitin

+0

更新這個問題,爲您提供幫助.... – nitin

相關問題