2010-12-30 4 views
17

Ich versuche, eine Tabelle zu haben, die Daten anzeigt, die der Benutzer sowohl eingibt als auch die Daten bearbeitet. Ich habe herausgefunden, wie man das mit Text macht (dh sie können den Namen von etwas in der Tabelle bearbeiten), aber ich kann es nicht mit Auswahlzellen arbeiten lassen.Wie können die Auswahlmöglichkeiten in einer SelectionCell mit GWT dynamisch aktualisiert werden?

Es funktioniert ordnungsgemäß, wenn die Elemente in der Auswahlzelle vordefiniert sind, aber ich kann die Elemente in der Zelle nicht dynamisch aktualisieren, um neue Dinge aufzunehmen, nachdem ich die Zelle erstellt habe.

Um mehr zu erklären, habe ich eine Spalte "Typ". Der Benutzer gibt Elemente in die Tabelle mit einem bestimmten Typ ein, kann aber später auch neue Typen hinzufügen. Wenn sie auf das Element in der Typspalte klicken, möchte ich, dass die Dropdown-Box alle neuen Typen enthält, die sie eingegeben haben, aber ich weiß nicht, wie ich das erreichen soll.

Hier ist der Code, den ich bisher habe (das nicht aktualisiert, wie ich es will). record.getTypeList() wird zusätzliche Einträge enthalten, nachdem der Benutzer neue Typen eingegeben hat.

SelectionCell editTypeComboBox = new SelectionCell(record.getTypeList()); 

    Column<Assignment, String> typeColumn = new Column<Assignment, String>(editTypeComboBox) { 
     @Override 
     public String getValue(Assignment object) { 
      return object.getType(); 
     } 
    }; 
    typeColumn.setFieldUpdater(new FieldUpdater<Assignment, String>() { 

     @Override 
     public void update(int index, Assignment object, String value) { 
      int row = index; 
      String newType = value; 
      record.editAssignType(row, newType); 
      updateClassGradeLabel(); 
      log.info("Set type to " 
        + value); 
      cellTable.redraw(); 
     } 
    }); 

    cellTable.addColumn(typeColumn, "Type"); 

Edit: Dank Peter Knego Feind hilft mir dies herauszufinden. Hier ist die modifizierte DynamicSelectionCell Klasse, wenn jemand, wenn interessiert:

/* 
* Copyright 2010 Google Inc. 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); you may not 
* use this file except in compliance with the License. You may obtain a copy of 
* the License at 
* 
* http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 
* License for the specific language governing permissions and limitations under 
* the License. 
*/ 
package com.google.gwt.cell.client; 

import com.google.gwt.core.client.GWT; 
import com.google.gwt.dom.client.Element; 
import com.google.gwt.dom.client.NativeEvent; 
import com.google.gwt.dom.client.SelectElement; 
import com.google.gwt.safehtml.client.SafeHtmlTemplates; 
import com.google.gwt.safehtml.shared.SafeHtml; 
import com.google.gwt.safehtml.shared.SafeHtmlBuilder; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

/** 
* A {@link Cell} used to render a drop-down list. 
*/ 
public class DynamicSelectionCell extends AbstractInputCell<String, String> { 

    interface Template extends SafeHtmlTemplates { 
    @Template("<option value=\"{0}\">{0}</option>") 
    SafeHtml deselected(String option); 

    @Template("<option value=\"{0}\" selected=\"selected\">{0}</option>") 
    SafeHtml selected(String option); 
    } 

    private static Template template; 

    private HashMap<String, Integer> indexForOption = new HashMap<String, Integer>(); 

    private final List<String> options; 

    /** 
    * Construct a new {@link SelectionCell} with the specified options. 
    * 
    * @param options the options in the cell 
    */ 
    public DynamicSelectionCell(List<String> options) { 
    super("change"); 
    if (template == null) { 
     template = GWT.create(Template.class); 
    } 
    this.options = new ArrayList<String>(options); 
    int index = 0; 
    for (String option : options) { 
     indexForOption.put(option, index++); 
    } 
    } 

    public void addOption(String newOp){ 
     String option = new String(newOp); 
     options.add(option); 
     refreshIndexes(); 
    } 

    public void removeOption(String op){ 
     String option = new String(op); 
     options.remove(indexForOption.get(option)); 
     refreshIndexes(); 
    } 

    private void refreshIndexes(){ 
     int index = 0; 
     for (String option : options) { 
      indexForOption.put(option, index++); 
     } 
    } 

    @Override 
    public void onBrowserEvent(Context context, Element parent, String value, 
     NativeEvent event, ValueUpdater<String> valueUpdater) { 
    super.onBrowserEvent(context, parent, value, event, valueUpdater); 
    String type = event.getType(); 
    if ("change".equals(type)) { 
     Object key = context.getKey(); 
     SelectElement select = parent.getFirstChild().cast(); 
     String newValue = options.get(select.getSelectedIndex()); 
     setViewData(key, newValue); 
     finishEditing(parent, newValue, key, valueUpdater); 
     if (valueUpdater != null) { 
     valueUpdater.update(newValue); 
     } 
    } 
    } 

    @Override 
    public void render(Context context, String value, SafeHtmlBuilder sb) { 
    // Get the view data. 
    Object key = context.getKey(); 
    String viewData = getViewData(key); 
    if (viewData != null && viewData.equals(value)) { 
     clearViewData(key); 
     viewData = null; 
    } 

    int selectedIndex = getSelectedIndex(viewData == null ? value : viewData); 
    sb.appendHtmlConstant("<select tabindex=\"-1\">"); 
    int index = 0; 
    for (String option : options) { 
     if (index++ == selectedIndex) { 
     sb.append(template.selected(option)); 
     } else { 
     sb.append(template.deselected(option)); 
     } 
    } 
    sb.appendHtmlConstant("</select>"); 
    } 

    private int getSelectedIndex(String value) { 
    Integer index = indexForOption.get(value); 
    if (index == null) { 
     return -1; 
    } 
    return index.intValue(); 
    } 
} 

Antwort

11

Leider SelectionCell speichert die Optionen in einer privaten Liste und es gibt keine Methoden, um dies zu manipulieren, nachdem Sie sie in Konstruktor gesetzt haben.

Glücklicherweise ist SelectionCell eine ziemlich einfache Klasse. Machen Sie einfach Ihre eigene (umbenannte) Kopie und fügen Sie addOption(..)/removeOption(..) Methoden zur Manipulation List<String> options hinzu.

+0

Ich mag die Idee, aber ich habe Probleme beim Importieren der richtigen Klassen, um die neue Klasse arbeiten zu lassen. Ich habe die SelectionCell-Klasse kopiert und in DynamicSelectionCell umbenannt, aber die render- und onBrowserEvent-Methoden beschweren sich, dass sie nicht überschrieben werden müssen (render fragt, ob sie mit verschiedenen Parametern implementiert werden sollen, während onBrowserEvent überhaupt nicht implementiert werden muss). . Außerdem bin ich mir nicht sicher, welche "Context" Klasse importiert werden soll. Ich bin mir nicht sicher, wohin ich von hier gehe, irgendeinen Rat? –

+0

Welche GWT-Version verwenden Sie? Die Klasse, von der ich dich angesprochen habe, stammt aus dem Kofferraum. Hier die Version 2.1.1: http://code.google.com/p/google-web-toolkit/source/browse/tags/2.1.1/user/src/com/google/gwt/cell/client/ SelectionCell.java?r=9485 –

+0

Ich überprüfte meine Version und ich lief noch 2.1.0. Nach dem Upgrade auf 2.1.1 ging das Problem weg. Alles funktioniert so, wie ich es jetzt möchte. Danke für die Hilfe. –

Verwandte Themen