Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с h:dataTable и h:selectOneMenu 
:(
    Опции темы
TopaZ
Дата 27.2.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Здравствуйте!
Помогите пожалуйста с такой проблемой:
я создаю dataTable для заполнения таблицы БД, в dataTable в каждой строке должно быть по 3 selectOneMenu, причем каждый из них должен содержать в себе список элементов соответствующий выбранному до этого selectOneMenu (т.е. сначала нужно выбрать например в одном selectOneMenu страну, в другом область, в третьем город и соответственно не должно быть ситуации что в США есть Харьковская область в которой есть город Лондон). 
В каждой строке помимо комбобоксов будут еще и другие колонки, но они в рассмотрении не учавствуют.

Далее нужно заполнить таким образом несколько строк и сохранить сразу все в БД, ну или сначала скажем в ArrayList<TableRowEntry>

Вопросы:
1) как осуществить зависимость selectOneMenu один от другого (я пробовал для каждого прописать свойство onchange="submit()", но это не привело к немедленной записи выбранного значения в бин, и соответственно я не могу определить, что выдать в остальные комбо-боксы. При этом сабмит происходит только после выбора всех трех комбобоксов). Пробовал еще подключить в комбо-боксы a4j:support из библиотеки RichFaces и установить reRender, но отдельный комбо-бокс перерендерить не получилось(ошибка). 

2)как сохранять сразу все непустые строки?

3)как добавлять в таблицу пустую строку для заполнения по началу заполнения последней незаполненной (т.е изначально при загрузке страницы например будет выдаваться 5 пустых строк, а при заполнении всех, т.е. при начале заполнения 5-й должна отрисоваться 6-я и т.д. )
 smile 
Может кто-нибудь поделится примером таблицы с подобной функциональностью?
Спасибо.
PM MAIL   Вверх
powerOn
Дата 27.2.2009, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 28
Всего: 159



TopaZ, слишком много вопросов сразу. Давай по-порядку.

Цитата(TopaZ @  27.2.2009,  21:54 Найти цитируемый пост)
Пробовал еще подключить в комбо-боксы a4j:support из библиотеки RichFaces и установить reRender, но отдельный комбо-бокс перерендерить не получилось(ошибка). 


Что за ошибка? Как подключал. Выкладывай код.



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
TopaZ
Дата 27.2.2009, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



У каждого проекта есть категории работ, а у каждой категории - соответственно виды работ(активити)
Пока что во все комбо-боксы выдаются все записи из соответствующих таблиц БД.
Вот код страницы:
Код

 <a4j:outputPanel>
      <h:dataTable   rows="3" value="#{timeTicketBean.ticketList}" var="listEntry">
             <h:column>
                    <f:facet name="header">
                        <h:outputText value="Project"  style="font-weight: bold"/>
                    </f:facet>
                    <h:selectOneMenu value="#{listEntry.projectID}" >
                            <f:selectItem itemLabel="---Select project---" itemValue="#{-1}"/>
                     <f:selectItems value="#{timeTicketBean.projectItemList}"/>
                   <a4j:support event="onchange" reRender="data"/>
                   </h:selectOneMenu>
                </h:column>

                <h:column>
                   <f:facet name="header">
                      <h:outputText value="Categories"/>
                   </f:facet>
                   <h:selectOneMenu id="data" value="#{listEntry.categoryOfActID}" >
                  <f:selectItem itemLabel="---Select category---" itemValue="#{-1}"/>
                   <f:selectItems  value="#{timeTicketBean.categoryItemList}"/>
                  </h:selectOneMenu>

                </h:column>
    
                <h:column>
                   <f:facet name="header">
                      <h:outputText value="Activities"/>
                   </f:facet>
                  <h:selectOneMenu  value="#{listEntry.activityID}" >
                     <f:selectItem itemLabel="---Select activity---" itemValue="#{-1}"/>
                     <f:selectItems value="#{timeTicketBean.activityItemList}"/>
                   </h:selectOneMenu>
                </h:column>
            </h:dataTable> 
     </a4j:outputPanel>


А вот ошибка:
Код

Exception while calling encodeEnd on component : {Component-Path : [Class: org.ajax4jsf.component.AjaxViewRoot,ViewId: /time_ticket.jsp][Class: javax.faces.component.html.HtmlForm,Id: j_id_jsp_1669527053_1][Class: org.ajax4jsf.component.html.HtmlAjaxOutputPanel,Id: j_id_jsp_1669527053_2][Class: javax.faces.component.html.HtmlDataTable,Id: j_id_jsp_1669527053_3][Class: javax.faces.component.UIColumn,Id: j_id_jsp_1669527053_10][Class: javax.faces.component.html.HtmlSelectOneMenu,Id: data]}

Caused by:
org.apache.jasper.el.JspPropertyNotFoundException - /time_ticket.jsp(46,18) '#{listEntry.categoryOfActID}' Target Unreachable, identifier 'listEntry' resolved to null
- Stack Trace
javax.faces.FacesException: Exception while calling encodeEnd on component : {Component-Path : [Class: org.ajax4jsf.component.AjaxViewRoot,ViewId: /time_ticket.jsp][Class: javax.faces.component.html.HtmlForm,Id: j_id_jsp_1669527053_1][Class: org.ajax4jsf.component.html.HtmlAjaxOutputPanel,Id: j_id_jsp_1669527053_2][Class: javax.faces.component.html.HtmlDataTable,Id: j_id_jsp_1669527053_3][Class: javax.faces.component.UIColumn,Id: j_id_jsp_1669527053_10][Class: javax.faces.component.html.HtmlSelectOneMenu,Id: data]}
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:559)
    at org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:286)
    at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:125)
    at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
    at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
    at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
    at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
    at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
    at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
    at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
    at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
    at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:68)
    at org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:116)
    at org.ajax4jsf.renderkit.AjaxContainerRenderer.encodeAjax(AjaxContainerRenderer.java:123)
    at org.ajax4jsf.component.AjaxViewRoot.encodeAjax(AjaxViewRoot.java:641)
    at org.ajax4jsf.component.AjaxViewRoot.encodeChildren(AjaxViewRoot.java:512)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:239)
    at org.apache.myfaces.application.jsp.JspViewHandlerImpl.actuallyRenderView(JspViewHandlerImpl.java:423)
    at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:380)
    at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
    at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:189)
    at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:140)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:152)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:147)
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:276)
    at org.ajax4jsf.Filter.doFilter(Filter.java:175)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:595)
Caused by: org.apache.jasper.el.JspPropertyNotFoundException: /time_ticket.jsp(46,18) '#{listEntry.categoryOfActID}' Target Unreachable, identifier 'listEntry' resolved to null
    at org.apache.jasper.el.JspValueExpression.getType(JspValueExpression.java:61)
    at org.apache.myfaces.shared_impl.renderkit._SharedRendererUtils.findUIOutputConverter(_SharedRendererUtils.java:58)
    at org.apache.myfaces.shared_impl.renderkit.RendererUtils.findUIOutputConverter(RendererUtils.java:391)
    at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.findUIOutputConverterFailSafe(HtmlRendererUtils.java:393)
    at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.internalRenderSelect(HtmlRendererUtils.java:316)
    at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.renderMenu(HtmlRendererUtils.java:288)
    at org.apache.myfaces.shared_impl.renderkit.html.HtmlMenuRendererBase.encodeEnd(HtmlMenuRendererBase.java:57)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:556)
    ... 40 more


Это сообщение отредактировал(а) TopaZ - 27.2.2009, 22:45
PM MAIL   Вверх
Jamon
Дата 28.2.2009, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 1.9.2007

Репутация: нет
Всего: нет



Хм,я бы попробовал юзать контрол от richfaces - rich:inplaceSelect, к нему можно привязать actionListener в джава бине. Соответственно, когда делается выбор первого бокса, кидается это событие, и в бине ты можешь заполнить коллекции, к которым будешь подвязывать остальные боксы, и плюс сюда же reRender на них. 

НО. у меня подобная штука не работает(. Т.е. не кидается это событие... и учти, что только inplaceSelect умеет работать c  SelectItem'ом, для которого заданы как value, так и label. Обычный рич комбобокс только один параметр тянет (это ему огромные минус, вообще не понятно почему нельзя было сделать поддержку того и того)
PM MAIL   Вверх
TopaZ
Дата 1.3.2009, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Jamon, частично получилось, используя rich:inplaceSelect, но в целом такое решение похоже не подойдет:
1) inplaceSelect(и его actionListener) у меня заработал корректно только в опере, ни в IE, ни в Firefox, ни в Safari, ни в Google Chrome actionListenerне работает.
2) для того чтобы заработало в опере, нужно добавить аттрибут showControls="true", но при этом после выбора появляются две кнопочки (сохранить и отменить) возле контрола inplaceSelect. Listener срабатывает только когда нажимаешь на кнопочку сохранить- в общем что-попало получается

Вот код:
Код

<h:dataTable   rows="3" value="#{timeTicketBean.ticketList}" var="listEntry">

               <h:column>
                   <f:facet name="header">
                      <h:outputText value="Project"  style="font-weight: bold"/>
                   </f:facet>
                   <rich:inplaceSelect  value="#{listEntry.projectID}" valueChangeListener="#{timeTicketBean.projectSelected}"  showControls="true" defaultLabel="Select project" >
                 <%--    <f:selectItem itemLabel="---Select project---" itemValue="#{-1}"/> --%>
                     <f:selectItems value="#{timeTicketBean.projectItemList}"/>
                <a4j:support event="onchange" reRender="data" /> 
                   </rich:inplaceSelect>
                 
                </h:column>
...

Может есть еще какие-нибудь варианты реализации?
PM MAIL   Вверх
Jamon
Дата 4.3.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 1.9.2007

Репутация: нет
Всего: нет



Появилась идея, можно юзать a4j:support:

Код

<h:selectOneMenu>
<f:selectItems value="#{bean.items}"/>
<a4j:support event="onchange" actionListener="#{bean.listener}" immediate="true"/>
</h:selectOneManu>


смысл такой - к обычному jsf тэгу мы прикручиываем ajax функциональность, и теперь при бросании компонентом указанного js события должен вызываться listener (этим не ограничивается, можно так же настроить reRender). 
Это все исходя из их доков. 

Но опять же проблема - у меня, пока что, не заработало(
попробуй - может получитсяsmile
PM MAIL   Вверх
TopaZ
Дата 4.3.2009, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Jamon я в самом начале поста показывал, что использовал этот элемент, но все дело даже не в том, что не посылается событие (оно в итоге посылается), а в том, что по всей видимости при reRendere таблицы "теряется" объект, который содержит в себе listEntry, т.е. таблица попросту не получает объект, котрый надо перерендерить (ну или что-то в этом роде). Похоже все дело кроется именно в том как правильно работать в данном случае с таблицой h:dataTable. Возможно там нужно использовать какую-нибудь специфическую модель данных или как-то биндить и отлавливать все действия, которые происходят внутри таблицы... Пытался найти какую-нить доку по dataTable, но толкового ничего не нашел... 

PM MAIL   Вверх
TopaZ
Дата 7.3.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Ура! Основную проблему решил. Как только доделаю этот кусок, сразу выложу здесь решение.
Остался только вопрос по автоматическому добавлению пустых строк в таблицу.
PM MAIL   Вверх
Jamon
Дата 9.3.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 1.9.2007

Репутация: нет
Всего: нет



Выложи пока решение основной проблемы, плиз=)
PM MAIL   Вверх
TopaZ
Дата 11.3.2009, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Значит так. Все дело заключалось в том, что нужно было использовать DataModel (в моем случае ListDataModel). При работе c h:dataTable данные заворачиваются в модель данных. Таким образом далее чтобы получить все строки таблицы можно использовать метод getWrappedData(), а для получения одной строки используется метод getRowData().

Таким образом класс, представляющий одну строку в таблице имеет вид:
Код

public class TimeTicketEntry {
private Integer projectID;
private Integer categoryOfActID;
private Integer activityID;
private ArrayList<SelectItem> activityItemList=new ArrayList<SelectItem>();
private ArrayList<SelectItem> categoryItemList=new ArrayList<SelectItem>();
private Boolean activitiesDisabled=true;//сначала элементы неактивны
private Boolean categoriesDisabled=true;


public ArrayList<SelectItem> getActivityItemList() {
    return activityItemList;
}

public void setActivityItemList(ArrayList<SelectItem> activityItemList) {
    this.activityItemList = activityItemList;
}

public ArrayList<SelectItem> getCategoryItemList() {
    return categoryItemList;
}

public void setCategoryItemList(ArrayList<SelectItem> categoryItemList) {
    this.categoryItemList = categoryItemList;
}

public Integer getActivityID() {
    System.out.println("getActivityID in entry:"+this.activityID);
    return activityID;
}

public void setActivityID(Integer activityID) {
    System.out.println("setActivityID in entry:"+activityID);
    this.activityID = activityID;
}



public Integer getProjectID() {
    return projectID;
}

public void setProjectID(Integer projectID) {
    System.out.println("setProjectID in entry:"+projectID);
    this.projectID = projectID;
}

public Integer getCategoryOfActID() {
    System.out.println("getCategoryID in entry:"+this.categoryOfActID);
    return categoryOfActID;
}

public void setCategoryOfActID(Integer categoryOfActID) {
    System.out.println("setCategoryID in entry:"+categoryOfActID);
    this.categoryOfActID = categoryOfActID;
}


public Boolean getActivitiesDisabled() {
    return activitiesDisabled;
}

public void setActivitiesDisabled(Boolean activitiesDisabled) {
    this.activitiesDisabled = activitiesDisabled;
}

public Boolean getCategoriesDisabled() {
    return categoriesDisabled;
}

public void setCategoriesDisabled(Boolean categoriesDisabled) {
    this.categoriesDisabled = categoriesDisabled;
}


}


Теперь класс в котором у меня содержатся листенеры и основная работа стаблицей:
Код

public class TimeTicketBean {
    
    private ArrayList<SelectItem> projectsItemList=new ArrayList<SelectItem>();
    private ListDataModel model=null;
    private ArrayList<TimeTicketEntry> ticketList= new ArrayList<TimeTicketEntry>(5);
    public SelectItem getSelectProject() {
        return selectProject;
    }
    public ArrayList<TimeTicketEntry> getTicketList() {
        
        return this.ticketList;
    }
    
    
    public void setTicketList(TimeTicketEntry ticketEntry){
        this.ticketList.add(ticketEntry);
    }
    
    
    // получение списка имен проектов и их идентификаторов для SelectOneMenu из БД 
    public ArrayList<SelectItem> getProjectItemList(){
        projectsItemList=new ArrayList<SelectItem>();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        try{
            Session session=HibernateUtil.currentSession(); 
            
            ArrayList<Projects> projectsList = (ArrayList<Projects>)session.createQuery("select proj from Projects proj").list();
            for(Projects proj:projectsList)
            {
                this.projectsItemList.add(new SelectItem((int)proj.getProjectId(),(String)proj.getProjectName()));
            }
            
        }
        catch(Exception ex){
            
            facesContext.addMessage(null,new FacesMessage("Error: " + ex.toString()+" : "+ ex.getMessage()));
        }
        finally { 
            
            HibernateUtil.closeSession();
        } 
        return projectsItemList;
        }
    
    // получение списка имен активностей и их идентификаторов для SelectOneMenu из БД 
    public ArrayList<SelectItem> createActivityItemList(Integer CategoryID){
        ArrayList<SelectItem> activityItemList=new ArrayList<SelectItem>();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        try{
            Session session=HibernateUtil.currentSession(); 
            ArrayList<Activities> activList = (ArrayList<Activities>)session.createQuery("select distinct catOfActs.activities from CategoriesOfActivities catOfActs where catOfActs.categories.categoryId=:catID").setInteger("catID", CategoryID).list();
            
        
            for(Activities acts:activList)
            {
                activityItemList.add(new SelectItem((int)acts.getActivityId(), (String)acts.getActivityName()));
                
            }
            
            
        }
        catch(Exception ex){
            
            facesContext.addMessage(null,new FacesMessage("Error: " + ex.toString()+" : "+ ex.getMessage()));
        }
        finally { 
            
            
            HibernateUtil.closeSession();
        } 
        return activityItemList;
    }
// создание списков категорий работ для selectOneMenu из БД 
    public ArrayList<SelectItem> createCategoryItemList(Integer projectID){
        
        ArrayList<SelectItem> categoryItemList=new ArrayList<SelectItem>();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        try{
            Session session=HibernateUtil.currentSession(); 
            
            ArrayList<Categories> catList = (ArrayList<Categories>)session.createQuery("select distinct plan.categoriesOfActivities.categories from PlanWorkTime plan where plan.projects.projectId=:projID").setInteger("projID", projectID).list();
        
            for(Categories cats:catList)
            {
                categoryItemList.add(new SelectItem((int)cats.getCategoryId(), (String)cats.getCategoryName()));
                
            }
            
        }
        catch(Exception ex){
            
            facesContext.addMessage(null,new FacesMessage("Error: " + ex.toString()+" : "+ ex.getMessage()));
        }
        finally { 
            
            HibernateUtil.closeSession();
        } 
        return categoryItemList;
    }
    
    
    public DataModel getTickets(){return model;}
    
    
    public void reloadCategories(ValueChangeEvent event)
    {
        System.out.println("Reload table started");
        TimeTicketEntry currentEntry=(TimeTicketEntry)model.getRowData();
        currentEntry.setCategoriesDisabled(true);
        currentEntry.setProjectID((Integer)event.getNewValue());
        currentEntry.setCategoryItemList(this.createCategoryItemList(currentEntry.getProjectID()));
        
        if((currentEntry.getProjectID()!=null)&& (currentEntry.getProjectID()!=-1)&&(currentEntry.getCategoryItemList().size()>1))
        {
            currentEntry.setCategoriesDisabled(false);
        }else{currentEntry.setCategoriesDisabled(true);
        currentEntry.setActivitiesDisabled(true);}
        model.setRowIndex(model.getRowIndex());
    }
    
    
    public void reloadActivities(ValueChangeEvent event)
    {
        System.out.println("Reload table started");
        TimeTicketEntry currentEntry=(TimeTicketEntry)model.getRowData();
        currentEntry.setActivitiesDisabled(true);
        currentEntry.setCategoryOfActID((Integer)event.getNewValue());
        currentEntry.setActivityItemList(this.createActivityItemList(currentEntry.getCategoryOfActID()));
        
        if((currentEntry.getProjectID()!=null)&& (currentEntry.getProjectID()!=-1)&&(currentEntry.getCategoryOfActID()!=null)&&(currentEntry.getCategoryOfActID()!=-1)&& (currentEntry.getActivityItemList().size()>1))
        {
            currentEntry.setActivitiesDisabled(false);
        }else{currentEntry.setActivitiesDisabled(true);}
        model.setRowIndex(model.getRowIndex());
        
    }

    public ListDataModel getModel() {
        return model;
    }

    public void setModel(ListDataModel model) {
        this.model = model;
    }
    
}

Где-то так. Вообще-то вписывать запросы к БД в этот класс не стоило, но для ускорения написания работоспособного приложения пока что будет так, а потом можно будет и разделить на уровни DAO и бизнес логики.

Теперь сама страница:
Код

<h:dataTable  id="tickets" value="#{timeTicketBean.model}" var="listEntry">

               <h:column>
                   <f:facet name="header">
                      <h:outputText value="Project"  style="font-weight: bold"/>
                   </f:facet>
                   <h:selectOneMenu id="proj"  value="#{listEntry.projectID}" onchange="submit()" valueChangeListener="#{timeTicketBean.reloadCategories}"  >
                     
                     <f:selectItems value="#{timeTicketBean.projectItemList}"/>
             
                   </h:selectOneMenu>
                   
                 
                </h:column>


                <h:column>

                   <f:facet name="header">

                      <h:outputText value="Categories"/>

                   </f:facet>

                  <h:selectOneMenu id="tick" disabled="#{listEntry.categoriesDisabled}" value="#{listEntry.categoryOfActID}" onchange="submit()" valueChangeListener="#{timeTicketBean.reloadActivities}">
                      
                     <f:selectItems  value="#{listEntry.categoryItemList}"/>
                  </h:selectOneMenu>

                </h:column>
                
                <h:column>

                   <f:facet name="header">

                      <h:outputText value="Activities"/>

                   </f:facet>

                  <h:selectOneMenu disabled="#{listEntry.activitiesDisabled}" value="#{listEntry.activityID}"  >
                     
                     <f:selectItems value="#{listEntry.activityItemList}"/>
                   </h:selectOneMenu>

                </h:column>
         
            </h:dataTable> 
 

Вданном примере не показано сохранение таблицы в список или в БД, но думаю понятно как это сделать (на примере листенеров). 

Остается вопрос как сделать автоматическое добавление пустой строки по заполнению имеющихся. Как это делается, с помощью JavaScript или может еще как-то?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.