Моя задача: ListGrid с привязкой к данным со столбцом. Заголовок этого столбца должен быть «Информация для {infoDate
в формате ДД-ММ-ГГГГ}» + DateItem (только средство выбора значков), из которого пользователи могут изменять infoDate
, который по умолчанию является текущей датой. Значения в столбце меняются в зависимости от выбранной даты.
Итак, я взял идею из этого вопроса Как добавить кнопку в HeaderSpan из SmartGWT, чтобы перейти к приведенному ниже коду. К сожалению, есть проблема: DateItem не выглядит интерактивным, он выглядит как изображение. Кроме того, я не могу удалить TextField, это либо текстовое поле, либо 3 выбираемых поля параметров.
Я предполагаю, что использование innerHTML не берет на себя функцию самого средства выбора, как я пробовал с Calendar, DateChooser и DatePicker, и это сработало, но проблема заключалась в представлении (мне нужен только значок календаря, который откроет DatePicker onClick ).
Заранее спасибо за любую помощь или идею!
Импорт:
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Node;
import com.google.gwt.dom.client.NodeList;
import com.smartgwt.client.widgets.events.DrawEvent;
import com.smartgwt.client.widgets.events.DrawHandler;
import com.smartgwt.client.widgets.grid.ListGrid;
Код:
ListGrid infoTable = new ListGrid();
infoTable.setShowRecordComponents(true);
infoTable.setShowRecordComponentsByCell(true);
infoTable.setWidth100();
infoTable.setDataSource(dataSource);
infoTable.setCanEdit(false);
infoTable.setCanCollapseGroup(false);
infoTable.setCanFreezeFields(false);
infoTable.setCanGroupBy(false);
infoTable.setCanMultiSort(false);
infoTable.setCanSort(false);
infoTable.setCanResizeFields(false);
infoTable.setAutoFetchData(false);
infoTable.addDrawHandler(new DrawHandler() {
public void onDraw(final DrawEvent event) {
for (Element element : DOMUtils.getElementsByTagName("td")) {
if (element.getInnerHTML().startsWith("Information for")) {
DOMUtils.removeAllChildNodes(element);
final DynamicForm cal = new DynamicForm();
final DateItem infoDate = new DateItem();
infoDate.setDefaultValue(new Date());
infoDate.setTitle(“Information for ”);
infoDate.setTitleAlign(Alignment.LEFT);
infoDate.setWrapTitle(false);
infoDate.setDisplayFormat(DateDisplayFormat.TOEUROPEANSHORTDATE);
infoDate.setUseTextField(true);
infoDate.setAlign(Alignment.RIGHT);
infoDate.addChangedHandler(new ChangedHandler() {
public void onChanged(final ChangedEvent event) {
//fetch new data, according to the date selected);
}
});
cal.setFields(infoDate);
element.setInnerHTML(cal.getInnerHTML());
}
}
// fetch data from DataSource class
infoTable.fetchData();
}
});
И класс DOMUtils:
class DOMUtils {
public static void removeAllChildNodes(Element element) {
NodeList<Node> childList = element.getChildNodes();
for(int childIndex = 0; childIndex < childList.getLength(); childIndex++) {
element.removeChild(childList.getItem(childIndex));
}
}
public static Element[] getElementsByTagName(String tagName)
{
JavaScriptObject elements = getElementsByTagNameInternal(tagName);
int length = getArrayLength(elements);
Element[] result = new Element[length];
for (int i=0; i<length; i++)
{
result[i] = getArrayElement(elements, i);
}
return result;
}
private static native JavaScriptObject getElementsByTagNameInternal(String tagName)/*-{
return $doc.getElementsByTagName(tagName);
}-*/;
private static native int getArrayLength(JavaScriptObject array)/*-{
return array.length;
}-*/;
private static native Element getArrayElement(JavaScriptObject array, int position)/*-{
return (position>=0 && position<array.length?array[position]:null);
}-*/;
}