2016-11-21 6 views
2

У меня есть listView, который имеет один столбец, который должен быть доступен для редактирования только в определенных случаях. Если пользователю необходимо изменить столбец, я хочу, чтобы они нажали кнопку редактирования для строки, а затем заменили метку в ячейке текстовым полем. Когда я вызываю replace, я вижу, что TextField теперь находится на месте метки, хотя он никогда не отображается. У меня есть AjaxLink для обработки события. Я использую контейнер для перерисовки listView. Вот мой ListView:Динамически заменить ячейку таблицы ListView на textField wicket

parent = new WebMarkupContainer("emp-table-parent"); 

    parent.add(new AjaxLink<Object>(FIRST_NAME_HEADER_LINK) { 

     /** 
     * 
     */ 
     private static final long serialVersionUID = -1937727929649333407L; 

     @Override 
     public void onClick(AjaxRequestTarget target) { 

      changeGlyphUpdateList(target, parent.get(FIRST_NAME_HEADER_LINK).get(FIRST_NAME_HEADER_ICON), 
        parent.get(LAST_NAME_HEADER_LINK).get(LAST_NAME_HEADER_ICON), 
        parent.get(EMAIL_HEADER_LINK).get(EMAIL_HEADER_ICON), parent.get(ELIGIBILITY_CLASS_HEADER_LINK).get(ELIGIBILITY_CLASS_HEADER_ICON), 
        parent.get(EMPLOYER_HEADER_LINK).get(EMPLOYER_HEADER_ICON)); 

     } 

    }.add(new Label("first-name-header-label", Model.of("First Name")), new WebComponent(FIRST_NAME_HEADER_ICON)), 
      new AjaxLink<Object>(LAST_NAME_HEADER_LINK) { 

       /** 
       * 
       */ 
       private static final long serialVersionUID = -3438649095509412910L; 

       @Override 
       public void onClick(AjaxRequestTarget target) { 

        changeGlyphUpdateList(target, parent.get(LAST_NAME_HEADER_LINK).get(LAST_NAME_HEADER_ICON), 
          parent.get(FIRST_NAME_HEADER_LINK).get(FIRST_NAME_HEADER_ICON), 
          parent.get(EMAIL_HEADER_LINK).get(EMAIL_HEADER_ICON), 
          parent.get(ELIGIBILITY_CLASS_HEADER_LINK).get(ELIGIBILITY_CLASS_HEADER_ICON), 
          parent.get(EMPLOYER_HEADER_LINK).get(EMPLOYER_HEADER_ICON)); 

       } 
    }.add(new Label("last-name-header-label", Model.of("Last Name")), new WebComponent(LAST_NAME_HEADER_ICON)), 
      new AjaxLink<Object>(EMAIL_HEADER_LINK) { 

       /** 
       * 
       */ 
       private static final long serialVersionUID = 2890934302751793454L; 

       @Override 
       public void onClick(AjaxRequestTarget target) { 

        changeGlyphUpdateList(target, parent.get(EMAIL_HEADER_LINK).get(EMAIL_HEADER_ICON), 
          parent.get(LAST_NAME_HEADER_LINK).get(LAST_NAME_HEADER_ICON), 
          parent.get(FIRST_NAME_HEADER_LINK).get(FIRST_NAME_HEADER_ICON), 
          parent.get(ELIGIBILITY_CLASS_HEADER_LINK).get(ELIGIBILITY_CLASS_HEADER_ICON), 
          parent.get(EMPLOYER_HEADER_LINK).get(EMPLOYER_HEADER_ICON)); 

       } 

    }.add(new Label("email-header-label", Model.of("Email")), new WebComponent(EMAIL_HEADER_ICON)), 
      new AjaxLink<Object>(ELIGIBILITY_CLASS_HEADER_LINK) { 

       /** 
       * 
       */ 
       private static final long serialVersionUID = -4022209586109961448L; 

       @Override 
       public void onClick(AjaxRequestTarget target) { 

        changeGlyphUpdateList(target, parent.get(ELIGIBILITY_CLASS_HEADER_LINK).get(ELIGIBILITY_CLASS_HEADER_ICON), 
          parent.get(EMAIL_HEADER_LINK).get(EMAIL_HEADER_ICON), 
          parent.get(LAST_NAME_HEADER_LINK).get(LAST_NAME_HEADER_ICON), 
          parent.get(FIRST_NAME_HEADER_LINK).get(FIRST_NAME_HEADER_ICON), 
          parent.get(EMPLOYER_HEADER_LINK).get(EMPLOYER_HEADER_ICON)); 

       } 

    }.add(new Label("eligibility-class-header-label", Model.of("Elig. Class")), new WebComponent(ELIGIBILITY_CLASS_HEADER_ICON)), 
      new AjaxLink<Object>(EMPLOYER_HEADER_LINK) { 

       /** 
       * 
       */ 
       private static final long serialVersionUID = -738777257301408437L; 

       @Override 
       public void onClick(AjaxRequestTarget target) { 

        changeGlyphUpdateList(target, parent.get(EMPLOYER_HEADER_LINK).get(EMPLOYER_HEADER_ICON), 
          parent.get(ELIGIBILITY_CLASS_HEADER_LINK).get(ELIGIBILITY_CLASS_HEADER_ICON), 
          parent.get(EMAIL_HEADER_LINK).get(EMAIL_HEADER_ICON), 
          parent.get(LAST_NAME_HEADER_LINK).get(LAST_NAME_HEADER_ICON), 
          parent.get(FIRST_NAME_HEADER_LINK).get(FIRST_NAME_HEADER_ICON)); 

       } 

    }.add(new Label("employer-header-label", Model.of("Employer")), new WebComponent(EMPLOYER_HEADER_ICON)), 
    new PageableListView<EmployeeSummaryPkt>("data", employeeSummaryModel.getObject(), 25) { 

       /** 
       * 
       */ 
       private static final long serialVersionUID = -1697070076764699904L; 

       @Override 
       protected void populateItem(final ListItem<EmployeeSummaryPkt> item) { 

        item.setDefaultModel(new CompoundPropertyModel<EmployeeSummaryPkt>(item.getModelObject())); 

        item.add(new Label("firstName"), 
          new Label("lastName"), 
          new Label("employeeEmail"), 
          new Link<Object>("eligibility-class-data-link") { 

           /** 
           * 
           */ 
           private static final long serialVersionUID = -3842291392813313171L; 

           @Override 
           public void onClick() { 

            //LINK TO ELIGIBILITY CLASS OR MAYBE THE SECTION WITHIN THE EMP? 

           } 
        }.add(new Label("employeeEligibilityClassSummaryPkt.name")), 
          new Link<Object>("employer-data-link") { 

           /** 
           * 
           */ 
           private static final long serialVersionUID = 6809571267919974106L; 

           @Override 
           public void onClick() { 

            getIndex().getHomePanel().setNewContent(new EmployerDetailPanel("panel-content", item.getModelObject().getEmployerSummaryPkt().getId())); 

           } 

        }.add(new Label("employerSummaryPkt.name")), 
          new Label("employeeDateOfBirth"), 
          new Label("employee-code", Model.of(item.getModelObject().getEmployeeName())).setOutputMarkupId(true), 
          new AjaxLink<Object>("edit-employee-link") { 

           /** 
           * 
           */ 
           private static final long serialVersionUID = 6061544430700059358L; 

           @Override 
           public void onClick(AjaxRequestTarget target) { 

            logr.log(Level.FINER, "onClick for edit employee"); 

            logr.log(Level.FINER, "employee code pre: " + item.get("employee-code").getClass().getSimpleName()); 
            item.get("employee-code").replaceWith(new TextField<String>("employee-code", new Model<String>(item.getModelObject().getEmployeeName())).setOutputMarkupId(true)); 
            logr.log(Level.FINER, "employee code post: " + item.get("employee-code").getClass().getSimpleName()); 
            target.addChildren(parent, TextField.class); 
            target.add(parent); 
           } 
        }); 
       } 

Как вы можете видеть, ярлык с идентификатором «сотрудник-кода» это метка, я хотел бы заменить. Внутри AjaxLink onClick вы можете увидеть, где я получаю ярлык и заменяю его. Ничто не меняется. Любое направление или помощь приветствуются.

+0

Объявление для родителя не похоже на фрагмент кода, который вы опубликовали? – WiseTree

+0

Извините. Я отредактировал выше, чтобы добавить фрагмент для родителя. – SteveManC

ответ

3

ListView воссоздает каждый, если его элементы на каждом рендере, таким образом, измененный listItem немедленно отбрасывается.

ListView#setReuseItems(true) должно помочь.

+0

Именно то, что я искал. Благодарю. Надеюсь, это поможет другим схожими проблемами. – SteveManC

2

Альтернативой ответу svenmeier может быть также добавление только определенного элемента, который был изменен на AjaxRequestTarget. То есть, заменить

target.addChildren(parent, TextField.class); 
target.add(parent); 

С

target.add(item.get("employee-code")) 

Что бы вызвать только часть разметки, которая касается изменения, которое должно быть повторно вынесено, в отличие от всей таблицы. Если ваша таблица большая и содержит множество элементов, чьи модели связаны с сложными механизмами извлечения, при которых вся таблица будет намного более трудоемким процессом, и, следовательно, рендеринг только элемента будет лучшим решением.

Сказав, что в вашем конкретном случае решение svenmeier лучше, так как в противном случае, если вы реализуете мое решение, а затем повторно отображаете всю таблицу, изменения будут потеряны.

+1

Я согласен, это метод, который я использовал в прошлом, но он ускользнул от меня, потому что я сортировал по функциям столбцов, встроенных в эту таблицу, поэтому я добавлял родителя со всей таблицей. Спасибо за ответ. Я считаю, что ответ @ svnemeier будет более уместным, так как если они сортируются, текстовое поле будет заменено меткой по умолчанию. Тем не менее, очень хороший ответ. – SteveManC