2014-11-06 3 views
0

У меня есть следующие CellTable CellTableGWT CellTable: Как обновить TextBox Динамически

Когда пользователь нажимает на Pay Мин. CheckBox, он должен скопировать значение из Нужно теперь перейти к Оплатить сегодня текстовое поле И пересчитать итоговое значение для Pay Today column.

Вот код для CheckboxCell и TextInputCell (Pay Сегодня) Столбцы (Pay Min.):

private Column<AccountInvoice, Boolean> buildPayMin() { 

    columnPayMin = new Column<AccountInvoice, Boolean>(new CheckboxCell(true, false)) { 
     @Override 
     public Boolean getValue(AccountInvoice object) { 
      return object.isPayMinimum(); 
     } 

     @Override 
     public void onBrowserEvent(Context context, Element elem, AccountInvoice object, NativeEvent event){ 

      // Get event type 
      int eventType = Event.as(event).getTypeInt(); 

      // See if this is a 'change' event 
      if (eventType == Event.ONCHANGE) { 

       String value = columnMinDue.getValue(object); 

       // Get the cell to copy the value from     
       TextInputCell cell = (TextInputCell) columnPayToday.getCell(); 
       // Re-create the view data for the cell 
       TextInputCell.ViewData viewData = new TextInputCell.ViewData(value); 
       cell.setViewData(object, viewData); 
       // Refresh 
       cellTable.redraw(); 

       event.preventDefault(); 
       event.stopPropagation(); 
      } 
     } 
    }; 
    columnPayMin.setDataStoreName(columnPayMinHeader); 
    columnPayMin.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); 
    columnPayMin.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); 
    return columnPayMin; 
} 

// ----------------------------------------------------------- 

private Column<AccountInvoice, String> buildPayToday() { 
    columnPayToday = new Column<AccountInvoice, String>(new TextInputCell()) { 
     @Override 
     public String getValue(AccountInvoice object) { 
      return object.getPaymentAmount(); 
     } 
    }; 
    columnPayToday.setDataStoreName(columnPayTodayHeader); 
    columnPayToday.setFieldUpdater(new FieldUpdater<AccountInvoice, String>() { 
     @Override 
     public void update(int index, AccountInvoice object, String value) { 
      object.setPaymentAmount(value); 
      cellTable.redraw(); 
     } 
    }); 
    return columnPayToday; 
} 

я могу получить значение скопировать, но общая сумма для Pay Today столбец не обновляется. Кажется, он обновляется только тогда, когда значение вводится вручную в текстовое поле Pay Today. Я даже пробовал делать:

columnPayToday.getFieldUpdater().update(context.getIndex(), object, value); 

, который тоже не помог.

Спасибо за любую помощь, которую вы могли бы предоставить.

ответ

2

ViewData представляет собой временное значение в вашем TextInputCell. Когда вы вызываете cellTable.redraw(), TextInputCell возвращается к исходному значению (одному из метода getValue() для этого столбца).

Не перерисовывайте таблицу, если вы хотите изменить только состояние «просмотра» TextInputCell или вызвать accountInvoice.setPayToday# (или какой бы то ни было метод) для обновления объекта, а затем вызвать refresh() в ListDataProvider (который является более эффективный способ обновления таблицы по сравнению с перерисовкой).

+0

Благодарим вас за ответ. Пожалуйста, посмотрите, как я изменил код в соответствии с вашими предложениями: http://pastebin.com/Z4bQYrzf К сожалению, он по-прежнему не работает. *** 'Window.alert' *** запускает только те, что-то ***' dataProviderList.refresh() '***, следуя за ним, убивает его, и он не срабатывает, даже если флажок установлен снова. Я также решил использовать *** FieldUpdater *** вместо *** onBrowserEvent ***, который не имеет никакого эффекта, но код короче. – user1576840

+1

Вы все еще вызываете 'cellTable.redraw()' - на этот раз в FieldUpdater в другом столбце. Ваш плохой стол постоянно перерисовывается! Вы почти никогда не должны вызывать redraw() в любом месте вашего кода. –

+0

Спасибо! Я исправил проблему, и она прекрасно работает сейчас! – user1576840

Смежные вопросы