Pregunta

En mi aplicación tengo que añadir una fila en un clic de un botón y este botón estará en todas las filas. ¿Necesita ayuda para hacer esto?

Clase Elemento

public class Item {
 public Item()
{

}
private String value;
public Item(String value) { this.value = value; }
public void setValue(String value) { this.value = value; }
public String getValue() { return value; }
}

Administrar haba de Clase

public class MyMB 
{
private List<Item> list;    

public void addItem() { // JSF action method
    list.add(new Item("Default"));
    Iterator<Item> iterator = list.iterator();
    while(iterator.hasNext())
    {
        Item item = (Item)iterator.next();
        System.out.println(item.getValue());
    }
    System.out.println();
    }
/**
 * @return the list
 */
public List<Item> getList() {
    if(list==null)
    {
        loadList();
    }
    return list;
}
private void loadList() {
    list = new ArrayList<Item>();
    list.add(new Item("Data"));
}

}

código JSF

<h:form>
   <rich:dataTable value="#{myMB.list}" var="item" id="tabel">
    <h:column><h:inputText value="#{item.value}" /></h:column>
    <h:column><a4j:commandButton value="Add"  actionListener="#{myMB.addItem}" reRender="tabel"/></h:column>

    

¿Fue útil?

Solución

Todo lo que necesita hacer es, básicamente, de hecho, sólo añadir un objeto vacío con el modelo de datos detrás del atributo value de h:dataTable.

Pero la misma fila vacía debe ser conservado en la solicitud posterior también. Si el bean de respaldo es un ámbito de petición, entonces el modelo de datos obtener recargado sin la fila vacía. Todo esto debería funcionar cuando el grano es sesión en ámbito.

Además hay varios errores en su código JSF. El atributo h:dataTable var falta y el contenido de la columna debe estar dentro de un h:column.

<h:form>
    <h:dataTable value="#{bean.list}" var="item">
        <h:column><h:inputText value="#{item.value}" /></h:column>
    </h:dataTable>
    <h:commandButton value="Add" action="#{bean.add}"/>
</h:form>

sesión o ver scoped frijol puede tener este aspecto:

public class Bean {
    private List<Item> list;

    public Bean() {
        list = new ArrayList<Item>();
    }

    public void add() {
        list.add(new Item());
    }

    public List<Item> getList() {
        return list;
    }
}

La clase Item debe por supuesto tener un defecto sin argumentos constructor. Normalmente, esto ya está disponible de forma implícita, pero si define su propio constructor con argumentos, entonces ya no está disponible. Tendrá que definir explícitamente, de lo contrario no se puede hacer Item item = new Item(); más.

public class Item {

    private String value;

    public Item() {
        // Keep default constructor alive.
    }

    public Item(String value) {
        this.value = value;
    }

    // ...
}

Si prefiere mantener el grano en el ámbito de la petición , entonces usted tendrá que mantener la cantidad de artículos que acaba de agregar, de manera que el grano puede conservar la misma cantidad de carga.

public class Bean {
    private List<Item> list;
    private HtmlInputHidden count = new HtmlInputHidden();

    public Bean() {
        count.setValue(0);
    }

    public void add() {
        list.add(new Item());
    }

    public List<Item> getList() {
        if (list == null) loadList();
        return list;
    }

    public HtmlInputHidden getCount() {
        return count;
    }

    public void setCount(HtmlInputHidden count) {
        this.count = count;
    }

    private void loadList() {
        list = new ArrayList<Item>();

        // Preserve list with newly added items.
        for (int i = 0; i < (Integer) count.getValue(); i++) {
            list.add(new Item());
        }
    }
}

Sólo tendrá que añadir lo siguiente a la <h:form> de la página JSF:

<h:inputHidden binding="#{bean.count}" converter="javax.faces.Integer" />

Para obtener más ideas sobre el uso de tablas de datos en cualquier forma que puede encontrar este artículo útil: utilizando tablas de datos . También contiene un archivo WAR con gran cantidad de ejemplos, tanto en la solicitud y la sesión de alcance.

Otros consejos

Tome esta tabla como ejemplo:

<h:datatable value="#{myBean.list}" ...>
    ...
    <h:column>
       <h:commandButton value="Add a row" action="#{myBean.addRow}"/>
    </h:column>
</h:datatable>

El método myBean.addRow , simplemente añadir un nuevo elemento en la lista:

public class MyBean {

    private List<SomeClass> list;

    ...

    public List<SomeClass> getList() {
        return list;
    }

    public void addRow() {
        list.add(new SomeClass());
    }
}

Cuando se haga clic en el botón, el método addRow añadirá un nuevo elemento en el . La página se actualizará y mostrará la tabla con una nueva fila.

Editar:

En cuanto a su edición posterior, tres cosas:

Punto 1:? Podría, por favor adjuntar el StackTrace de su error

Punto 2: Su método AddRow devolver un String que es un identificador utilizado por JSF para la navegación. Ya que esta acción no implica ninguna de navegación (es decir, la estancia del usuario en la misma página), simplemente null o "" volver:

public String addRow() {
    list.add(new Item("new data"));
    return null;
}

Punto 3: Sugiero que su Item clase proporciona un constructor vacío (además de su constructor actual):

public Item() {
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top