2017-09-29 2 views
1

私は改札内の編集可能なグリッドと呼ばれる、編集を表形式でDBからのデータを表示、保存、キャンセル、ボタンを削除する必要があります。表の行にwicketで2つの関連するドロップダウンで編集可能なグリッドを実装するにはどうすればいいですか?

編集ボタンデータのクリックを2つのドロップダウン選択に示され、最初のドロップダウンの選択に基づいて、次に2番目のドロップダウン・データ・モデルを変更すべき第1のドロップダウンからデータを選択すべきである後。

私はhttps://github.com/wicketstuff/core/tree/master/editable-grid-parent通過しました。しかし、それはwicketの1ドロップダウンと編集可能なグリッドだけを表示し、私は2ドロップダウンが欲しい。これで助けてください。

UPDATE: 私はドロップダウン細胞の振る舞いを我慢する必要がある場所このことについてどんな考えを持っていないこの

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

パターンは2、3ドロップダウンに適用することができBeahvioursを追加します。気をつけて、列のリストがどのようにビルドされているかを読んでください。 –

+0

は、多分あなたは「選択肢のwikcket動的リスト」したい(真ん中の文は私のために明確ではありません)。このパターンは簡単にgooglableです –

+0

このソースのパターンは2回のドロップダウンに適用できますが、選択肢のリストは動的ではありません。どのように私はこのソースを使用して、一般的に選択のwicketドロップダウンコンポーネントのリストを使用して動的にです。 – nitin

答えて

0

動的リスト(第1の固定であり、第2のIDに依存し、動的に計算)による質問おそらくほとんど直接的な答え:純粋なリンクを含まないSOルールと一緒に http://examples7x.wicket.apache.org/ajax/choice

、公式の例から抜粋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); 
     } 
    }); 
    } 
} 

コメント後の更新。以前のgithubコードに戻し、固定リストをモデルで置き換える必要があります。どうやって???派生またはコピー、IModelでコンストラクタを追加... Wicketは非常に良いオブジェクトデザインを持っています。我々は(計画されていない)グリッドの作者に知られていない列タイプを追加同様に 。

ところでコメントが「働いていないその」非常に広いです。申し訳ありませんが、私はできれば助けますが、あなたのために完全なプロジェクトを作ってはいけません。あなたがコーディングを楽しむことを願っています。

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")); 
      } 

}); 

このソースからあまりにも

+0

@jackezこれは問題ありませんが、私は編集可能なグリッドの例でこれを試してみましたが、動作しません。 getColumn()で編集可能なグリッドの例でアイデアを与えてください。 – nitin

+0

それは私の質問ですが、私はコードに振る舞いを入れなければなりません。 – nitin

+0

あなたの質問を更新してください.... – nitin

関連する問題