如何根据 rowSelect 事件更新要启用或禁用的 dataTable 中的特定 inputText
How to update specific inputText in dataTable to be enabled or disabled based on rowSelect event
我需要你的帮助来更新特定的 inputText 组件,以便在选中行中的复选框后在 dataTable 中启用它。这是数据表的代码:
<h:form id="request">
<p:dataTable value="#{dataTableView.employeeList}" id="Employee" var="emp"
selection="#{dataTableView.selectedEmployees}" rowKey="#{emp.id}">
<p:ajax event="rowSelectCheckbox" listener="#{dataTableView.EnableInputText}" />
<p:ajax event="rowSelect" listener="#{dataTableView.EnableInputText}" />
<p:columnGroup type="header">
<p:row>
<p:column/>
<p:column headerText="ID"/>
<p:column headerText="Name"/>
<p:column headerText="Location"/>
<p:column headerText="Remarks"/>
</p:row>
</p:columnGroup>
<p:column selectionMode="multiple" style="width:2%;text-align:center"/>
<p:column headerText="ID">
<h:outputText value="#{emp.id}"/>
</p:column>
<p:column headerText="Name">
<h:outputText value="#{emp.name}"/>
</p:column>
<p:column headerText="Location">
<h:outputText value="#{emp.location}"/>
</p:column>
<p:column headerText="Remarks">
<h:inputText id="inputT1" value="#{emp.remarks}" disabled="#{emp.disable}"/>
</p:column>
</p:dataTable>
</h:form>
以及支持 bean 中的代码:
private List<Student> employeeList = new ArrayList<Student>();
private List<Student> selectedEmployees;
private boolean disable=true;
public void EnableInputText(SelectEvent event) {
RequestContext context = RequestContext.getCurrentInstance();
for(int i=0;i<selectedEmployees.size();i++){
for(int j=0;j<employeeList.size();j++){
if(selectedEmployees.get(i).getId().equals(employeeList.get(j).getId()))
{
selectedEmployees.get(j).setDisable(false);
context.update("request:Employee:"+i+":inputT1");
//employeeList.get(j).setDisable(false);
}
}
}
}
目前,我可以单击复选框,但inputText
将保持禁用状态,我将收到错误消息:
java.lang.UnsupportedOperationException
你的问题与 JAVA 相关,而不是 Primefaces。
问题看起来是 selectedEmployees.get(j).setDisable(false);
更有机会获得java.lang.IndexOutOfBoundsException
。
你只需要在事件触发后更新数据table。
<p:ajax event="rowSelectCheckbox"
listener="#{dataTableView.EnableInputText}" update="Employee" />
<p:ajax event="rowSelect"
listener="#{dataTableView.onRowSelect}" update="Employee"/>
<p:ajax event="rowUnselectCheckbox"
listener="#{dataTableView.onRowUnselect}" update="Employee"/>
选中复选框 select :
public void EnableInputText(SelectEvent event){
for (int i = 0;i<selectedEmployees.size();i++) {
for (int j = 0;j<employeeList.size();j++) {
if (selectedEmployees.get(i).getId().equals(employeeList.get(j).getId())) {
employeeList.get(j).setDisabled(false);
}
}
}
}
第select行:
public void onRowSelect(SelectEvent selectEvent){
Employee emp = (Employee)selectEvent.getObject();
for (Employee e : employeeList) {
if (emp.getId().equals(e.getId())) {
e.setDisabled(false);
}
else {
e.setDisabled(true);
}
}
}
未选中复选框select
public void onRowUnselect(UnselectEvent unselectEvent){
Employee emp = (Employee)unselectEvent.getObject();
for (Employee e : employeeList) {
if (emp.getId().equals(e.getId())) {
e.setDisabled(true);
}
}
}
输出:
我需要你的帮助来更新特定的 inputText 组件,以便在选中行中的复选框后在 dataTable 中启用它。这是数据表的代码:
<h:form id="request">
<p:dataTable value="#{dataTableView.employeeList}" id="Employee" var="emp"
selection="#{dataTableView.selectedEmployees}" rowKey="#{emp.id}">
<p:ajax event="rowSelectCheckbox" listener="#{dataTableView.EnableInputText}" />
<p:ajax event="rowSelect" listener="#{dataTableView.EnableInputText}" />
<p:columnGroup type="header">
<p:row>
<p:column/>
<p:column headerText="ID"/>
<p:column headerText="Name"/>
<p:column headerText="Location"/>
<p:column headerText="Remarks"/>
</p:row>
</p:columnGroup>
<p:column selectionMode="multiple" style="width:2%;text-align:center"/>
<p:column headerText="ID">
<h:outputText value="#{emp.id}"/>
</p:column>
<p:column headerText="Name">
<h:outputText value="#{emp.name}"/>
</p:column>
<p:column headerText="Location">
<h:outputText value="#{emp.location}"/>
</p:column>
<p:column headerText="Remarks">
<h:inputText id="inputT1" value="#{emp.remarks}" disabled="#{emp.disable}"/>
</p:column>
</p:dataTable>
</h:form>
以及支持 bean 中的代码:
private List<Student> employeeList = new ArrayList<Student>();
private List<Student> selectedEmployees;
private boolean disable=true;
public void EnableInputText(SelectEvent event) {
RequestContext context = RequestContext.getCurrentInstance();
for(int i=0;i<selectedEmployees.size();i++){
for(int j=0;j<employeeList.size();j++){
if(selectedEmployees.get(i).getId().equals(employeeList.get(j).getId()))
{
selectedEmployees.get(j).setDisable(false);
context.update("request:Employee:"+i+":inputT1");
//employeeList.get(j).setDisable(false);
}
}
}
}
目前,我可以单击复选框,但inputText
将保持禁用状态,我将收到错误消息:
java.lang.UnsupportedOperationException
你的问题与 JAVA 相关,而不是 Primefaces。
问题看起来是 selectedEmployees.get(j).setDisable(false);
更有机会获得java.lang.IndexOutOfBoundsException
。
你只需要在事件触发后更新数据table。
<p:ajax event="rowSelectCheckbox"
listener="#{dataTableView.EnableInputText}" update="Employee" />
<p:ajax event="rowSelect"
listener="#{dataTableView.onRowSelect}" update="Employee"/>
<p:ajax event="rowUnselectCheckbox"
listener="#{dataTableView.onRowUnselect}" update="Employee"/>
选中复选框 select :
public void EnableInputText(SelectEvent event){
for (int i = 0;i<selectedEmployees.size();i++) {
for (int j = 0;j<employeeList.size();j++) {
if (selectedEmployees.get(i).getId().equals(employeeList.get(j).getId())) {
employeeList.get(j).setDisabled(false);
}
}
}
}
第select行:
public void onRowSelect(SelectEvent selectEvent){
Employee emp = (Employee)selectEvent.getObject();
for (Employee e : employeeList) {
if (emp.getId().equals(e.getId())) {
e.setDisabled(false);
}
else {
e.setDisabled(true);
}
}
}
未选中复选框select
public void onRowUnselect(UnselectEvent unselectEvent){
Employee emp = (Employee)unselectEvent.getObject();
for (Employee e : employeeList) {
if (emp.getId().equals(e.getId())) {
e.setDisabled(true);
}
}
}
输出: