2012-02-04 14 views
2

にcelltableでボタンを追加/削除することができ、私は私のCellTableGWT:どのように私は行く

ButtonCell reListCell = new ButtonCell(); 
reListColumn = new Column<EmployerJobs, String>(reListCell) { 
    @Override 
    public String getValue(EmployerJobs object) { 
    return "ReList"; 
    } 
}; 

ctJobs.addColumn(reListColumn, 
    EmployerDashBoardConstants.EMPTYHEADERCOLUMN); 

にこのボタン電池を持っていますが、私は以下の条件を渡すと、このセルを表示させたいです

public void getDateDiff(final EmployerJobs object) { 
    rpcService.getDateDiff(object.getJobValidDate(), new AsyncCallback<Boolean>() { 
    public void onFailure(Throwable caught) { 
    } 

    public void onSuccess(Boolean jobExpired) { 
     if(jobExpired) { 
     // HERE I WANT TO SHOW MY RELISTCELL, means if the job is expired only then 
     // there will be a button showing relist would be appear in that row ,for 
     // the jobs which are not expired NO button should appear.. 
     } 
    } 
    }); 
} 

これをどのように達成できますか?

ありがとう

+1

日付が有効かどうかを確認するために、テーブルのすべての行についてサーバーを呼び出すのは非常に過剰だと思われます。おそらく、クライアントをチェックし、ボタンが押された場合はサーバー上で確認してください。 – DTing

答えて

4

私はDTingに同意します。
各セル/行のバックエンドを照会するのは効率的ではありません。 に表示されるEmployerJobsのリストをリクエストしたときに、情報(jobExpired)をEmployerJobsクラスに入れて転送します。
定期的にリストを更新して、変更を考慮に入れることができます(その方法については、expensesサンプルを参照してください)。

しかし、最初の質問(セルを隠して)。

  • ActionCellを使用して、レンダリングメソッドをオーバーライドします。

ActionCell:

ActionCell<EmployerJobs> reListCell = new ActionCell<EmployerJobs>("ReList", 
    new ActionCell.Delegate<EmployerJobs>() { 
     @Override 
     public void execute(EmployerJobs object) { 
      // code to be executed 
     } 
    }) 
{ 
    @Override 
    public void render(Cell.Context context,EmployerJobs value,SafeHtmlBuilder sb) { 
     if (value.isJobExpired()) // isJobExpired returns the field jobExpired. 
      super.render(context,value,sb); 
     } 
}; 

reListColumn = new Column<EmployerJobs, EmployerJobs>(reListCell) { 
     @Override 
     public String getValue(EmployerJobs object) { 
     return object; 
     } 
}; 

ctJobs.addColumn(reListColumn, 
    EmployerDashBoardConstants.EMPTYHEADERCOLUMN); 
  • ボタン型電池を使用して、列のrenderメソッドをオーバーライドします。

ボタン型電池:

ButtonCell reListCell = new ButtonCell(); 
reListColumn = new Column<EmployerJobs, String>(reListCell) { 
    @Override 
    public String getValue(EmployerJobs object) { 
    return "ReList"; 
    } 
    @Override 
    public void render(Cell.Context context,EmployerJobs object,SafeHtmlBuilder sb) { 
    if (value.isJobExpired()) // isJobExpired returns the field jobExpired. 
     super.render(context,value,sb); 
    } 
}; 

ctJobs.addColumn(reListColumn, 
    EmployerDashBoardConstants.EMPTYHEADERCOLUMN); 
1

ちょうどウミト溶液#2ボタン型電池を試してみました。できます!ボタンに特定のアクションをリンクする

、reListColumn.setFieldUpdater(新しいFieldUpdater .... は

1

を必要とされるであろうし、私はあまりにもボタン型電池ソリューションを試してみました。しかし、あなたは誰ノーボタンとしてセルをクリックした場合クライアント側でエラーが発生します。

com.google.gwt.core.client.JavaScriptException:com.google.gwt.core.client.impl.Impl @(TypeError例外)::適用(Ljava/LANG /オブジェクトを(JavaScriptオブジェクト(445)、JavaScriptオブジェクト(240)、JavaScriptオブジェクト(637)]):parent is null

だから私は、イベントをオーバーライドして、私が欲しい場合は、イベントを避けるために、これを追加しました:

 @Override 
     public void onBrowserEvent(com.google.gwt.cell.client.Cell.Context context, 
       Element parent, YourObject object, NativeEvent event) { 
      if (object.isCompleted()) 
       super.onBrowserEvent(context, parent, object, event); 
     } 

それはそれを行うには良い方法だが、それが動作するかどうか私にはわかりません。