JSF: datatable : deletar uma linha

9 respostas
A

Oi! Cada linha do meu datatable corresponde a um projeto. Eu queria que na minha última coluna tivesse um botão de deletar, que deleta-se o projeto correspondente aquela linha. Mas como eu vou saber qual linha foi selecionada para que eu delete o projeto correto? Ai segue o datable como esta (sem o botão de deletar):

<h:dataTable value="#{timesheetBean.timesheet.projetos}" var="projeto">
		<h:column>
			<f:facet name="header">
				<h:outputText value="Projeto"></h:outputText>
			</f:facet>
			<h:outputText value="#{projeto.nome}"></h:outputText>
		</h:column>
		<h:column>
			<f:facet name="header">
				<h:outputText value="Domingo"></h:outputText>
			</f:facet>
			<h:outputText value="#{projeto.horaDom}"></h:outputText>
		</h:column>
		<h:column>
			<f:facet name="header">
				<h:outputText value="Segunda"></h:outputText>
			</f:facet>
			<h:outputText value="#{projeto.horaSeg}"></h:outputText>
		</h:column>
		<h:column>
			<f:facet name="header">
				<h:outputText value="Terca"></h:outputText>
			</f:facet>
			<h:outputText value="#{projeto.horaTer}"></h:outputText>
		</h:column>
		<h:column>
			<f:facet name="header">
				<h:outputText value="Quarta"></h:outputText>
			</f:facet>
			<h:outputText value="#{projeto.horaQua}"></h:outputText>
		</h:column>
		<h:column>
			<f:facet name="header">
				<h:outputText value="Quinta"></h:outputText>
			</f:facet>
			<h:outputText value="#{projeto.horaQui}"></h:outputText>
		</h:column>
		<h:column>
			<f:facet name="header">
				<h:outputText value="Sexta"></h:outputText>
			</f:facet>
			<h:outputText value="#{projeto.horaSex}"></h:outputText>
		</h:column>
		<h:column>
			<f:facet name="header">
				<h:outputText value="Sabado"></h:outputText>
			</f:facet>
			<h:outputText value="#{projeto.horaSab}"></h:outputText>
		</h:column>
	</h:dataTable>

Obrigada!
Ariane.

9 Respostas

L

Oi Ariane,

Quando precisei fazer alguma coisa nesse sentido acabei optando por colocar
um commandLink que faz a exclusão em cada linha da datatable, por simplificação mesmo. É possível fazer da maneira que vc está pensando, mas é um pouco complexo. Esse é o código que usei:

<h:column>
	<f:facet name="header">
			<h:outputText value="Excluir"/>
	    </f:facet>
	    <div class="imgCenter">
		    <h:commandLink 
			    action="sucess"
			    actionListener="#{MeuBean.delete}">
			<h:graphicImage id="imgDel" url="/img/excluir.gif"/>
		<f:param id="codigo" name="codigo" value="#{obj.id}" />
			</h:commandLink>   
		</div>       
</h:column>
A

O pior é que eu já fiz isso, mas faz 1 ano… e eu não lembro… Eu lembro que não era muito intuitivo, mas era possível.

D

Olá Ariane!

Vou descrever os passos ai vc precisa correr atrás para aprender o que fazer.

1 - Cria mais uma coluna com um commandButton
2 - O commandButton criado deve ser amarrado (usar o parâmetro bindind) com um componente (UICommand) no seu Backing Bean.
3 - No parâmetro value vc precisa passar o valor que identifica aquela linha (para o banco seria o ID da linja da tabela por exemplo)
3 - No parâmetro action do commandButton indique o método do Backing Bean que vai ser executado.
4 - Nesse método vc pega o valor do UICommand que está amarrado com o botão e exclui o registro da base de dados ou da sua estrutura. O valor do command button vai ser o ID, sendo assim fica fácil de excluir.
5 - Configura o faces-config para depois de excluir retornar a essa página. Ela vai ser recarregada sem a linha que agora já foi excluída.

Até mais!

A

Eu acredito que eu fiz o que você disse, mas deve ter algo errado porque não invoca o método do botão.

A coluna do botão:

<h:column>
			<f:facet name="header">
				<h:outputText value="Deleta"></h:outputText>
			</f:facet>
			<h:commandButton value="x" binding="#{timesheetBean.timesheet.component}" action="#{timesheetBean.timesheet.deleteProjeto}"></h:commandButton>
		</h:column>

e este é o método:

public String deleteProjeto(){
		String nome = component.getId();
		Projeto projeto = new Projeto(nome);
		projetos.remove(projeto);
		return "reload";
	}

Eu não tenho a minina idéia se esta certo, porque eu não lembro deste UIComponent.

A

isso tudo porque JSF é uma framework intuitiva e prática…

No value você coloca o que vai estar escrito no botão, não?

A

Eu vou tentar explicar o problema de um jeito melhor e dizer aonde exatamente eu empaquei.

Eu tenho uma datatable assim:

| Mon  | | Tue | | Wed | | Thu | | Fri    | | Sat   | | Sun | | Delete

Project1 | 0:00 | | 0:00 | | 0:00 | | 0:00 | | 0:00 | | 0:00 | | 0:00 | | X
Project2 | 0:00 | | 0:00 | | 0:00 | | 0:00 | | 0:00 | | 0:00 | | 0:00 | | X

linha -> representa o Projeto (nome e horas gastas)
colunas -> dias da semana
última coluna -> botão delete (deleta o Projeto daquela linha)

O botão é configurado assim:

<h:commandButton value="x" binding="#{timesheetBean.timesheet.component}" action="#{timesheetBean.timesheet.deleteProject}"></h:commandButton>

O binding faz direitinho (chama o método setComponent() ), mas eu não sei qual método do UIComponent eu devo utilizar para recuperar o Projeto da linha em questão, para que ai eu possa deletar o projeto.

Obrigada! Desculpa a insistência…

H

Pessoal, eu acho q estamos complicando demais. Poderia ser assim:

public String deleteProjeto(){
               Projeto projeto = (Projeto) request.getAttribute("projeto");//mesmo nome do attributo var
                                                                            na tag dataTable
  		projetos.remove(projeto);
 		return "reload";
 	}

Isso é possivel porque qndo você clica no commandButton o jsf pesquisa na lista q deu origem a tabela qual objeto foi clicado. Através do equals. Isso quer dizer q o equals tem q funcionar. :wink:

Espero ter ajudado.

Humberto Lima

A

Obrigada! Mas que tipo de variável é esta request? Eu tentei usar o UIData e fazer o binding com o datatable, deu certo :), é só utiilizar o método getRowData()

H
/**
	 * Referência para o context do JSF.
	 */
	protected FacesContext context = FacesContext.getCurrentInstance();

	/**
	 * Referência para o request.
	 */
	protected HttpServletRequest request = (HttpServletRequest) context
			.getExternalContext().getRequest();

Humberto Lima

Criado 27 de julho de 2007
Ultima resposta 2 de ago. de 2007
Respostas 9
Participantes 4