У меня ListGrid, который изначально пуст без записей с тремя определенными ListGridFields.Первый ListGridField является Именем и является редактируемым, второй - «Низким» значением и НЕ редактируется, значение которого равно 0, если добавлена первая строка, или задано верхнему значению предыдущей записи, если это не первая итретий ListGridField - это значение «High», которое также можно редактировать.
Требуется значение «High» ListGridField, содержащее два валидатора, один из которых - IntegerRangeValidator с минимумом 0 и максимумом Integer.MAX_INT.Второй валидатор - это созданный мной пользовательский валидатор, который гарантирует, что введенное пользователем значение не равно или меньше значения «Низкая» записи.
final MXListGrid rangeGrid = new MXListGrid();
rangeGrid.setOverflow(Overflow.AUTO);
rangeGrid.setWidth100();
rangeGrid.setHeight100();
rangeGrid.setAutoFetchData(false);
rangeGrid.setSelectionType(SelectionStyle.SINGLE);
ListGridField l_description = new ListGridField("description", "Description");
l_description.setType(ListGridFieldType.TEXT);
ListGridField l_low = new ListGridField("low", "Low");
l_low.setType(ListGridFieldType.INTEGER);
l_low.setCanEdit(false);
l_low.setCellFormatter(new CellFormatter()
{
public String format(Object value, ListGridRecord record, int rowNum, int colNum)
{
if (value == null) return null;
NumberFormat nf = NumberFormat.getFormat("###,###,###,###");
try
{
return nf.format(((Number) value).longValue());
}
catch (Exception e)
{
return value.toString();
}
}
});
ListGridField l_high = new ListGridField("high", "High");
l_high.setType(ListGridFieldType.INTEGER);
l_high.setCellFormatter(new CellFormatter()
{
public String format(Object value, ListGridRecord record, int rowNum, int colNum)
{
if (value == null) return null;
NumberFormat nf = NumberFormat.getFormat("###,###,###,###");
try
{
return nf.format(((Number) value).longValue());
}
catch (Exception e)
{
return value.toString();
}
}
});
IntegerRangeValidator intRangeValidator = new IntegerRangeValidator();
intRangeValidator.setMax(Integer.MAX_VALUE);
intRangeValidator.setMin(0);
l_high.setValidators(new MXRangeClassificationValidator(), intRangeValidator);
l_high.setRequired(true);
rangeGrid.setFields(l_description, l_low, l_high);
rangeGrid.setCanEdit(true);
rangeGrid.setEditEvent(ListGridEditEvent.CLICK);
У меня есть кнопка на экранеэто позволяет пользователю добавлять новую запись.Согласно приведенной выше логике, если это первая добавляемая запись, нижнее значение устанавливается равным 0, а верхнее значение устанавливается на пустую строку или, если имеются ранее существующие записи, новая строка добавляется ниже текущей выбранной строки иливнизу, если ни одна строка не выбрана, а низкий установлен на максимум предыдущей записи, а высокий установлен на пустую строку, и всегда фокус и курсор перемещаются оттуда, где они находятся, в поле «Имя» новой добавленной строки..
final MXButton addRowBtn = new MXButton("Add Row");
addRowBtn.addClickHandler(new ClickHandler()
{
public void onClick(ClickEvent event)
{
if (rangeGrid.getRecords().length == 0)
{
m_rowCount = 0;
ListGridRecord record = new ListGridRecord();
record.setAttribute("description", "");
record.setAttribute("low", 0);
record.setAttribute("high", "");
rangeGrid.addData(record);
rangeGrid.startEditing(m_rowCount, 0, false);
m_rowCount++;
}
else
{
RecordList list = rangeGrid.getDataAsRecordList();
int selectedRow = m_rowCount - 1;
if (rangeGrid.getSelectedRecord() != null)
{
selectedRow = rangeGrid.getDataAsRecordList().indexOf(rangeGrid.getSelectedRecord());
}
ListGridRecord prevRecord = rangeGrid.getRecord(selectedRow);
ListGridRecord record = new ListGridRecord();
record.setAttribute("description", "");
record.setAttribute("low", Long.valueOf(prevRecord.getAttribute("high")));
record.setAttribute("high", "");
list.addAt(record, selectedRow + 1);
rangeGrid.startEditing(selectedRow + 1, 0, false);
m_rowCount++;
}
}
});
Я также добавил RowEditorExitHandler в свой ListGrid, чтобы я мог контролировать некоторые варианты поведения пользовательского интерфейса по возвращении ручной активации проверки записи для только что вышедшей записи.
// add some row editing validation
rangeGrid.addRowEditorExitHandler(new RowEditorExitHandler() {
@Override
public void onRowEditorExit(RowEditorExitEvent event)
{
GWT.log("leaving row: " + event.getRowNum());
if (!rangeGrid.validateRow(event.getRowNum()))
{
saveBtn.disable();
addRowBtn.disable();
}
else
{
saveBtn.enable();
addRowBtn.enable();
}
}
});
Все это прекрасно работает, если я добавлю запись и сразу введу ошибочное значение в поле «High».Проблема возникает, если я нажимаю кнопку и добавляю новую строку, а затем щелкаю где-нибудь еще на экране, за пределами этой строки, удаляя фокус из вновь добавленной строки.Мой метод RowEditorExitHandler запущен, но мой ручной listGrid.validateRow (event.getRownNum ()) НИКОГДА не выполняется в этом сценарии.Ему не нравится тот факт, что ячейка не была отредактирована вручную ... он игнорирует тот факт, что пользователь не предоставил действительное значение "High".Я пробовал несколько вещей, таких как добавление логики в моем методе RowEditorExitHandler onRowEditorExit, который проверяет значение высокого значения текущей строки и, если это пустая строка или ноль, обновляет его значение в кучу пустых мест и затем запускает метод validateRow.... все еще не выполняет проверку.Проверка выполняется только тогда, когда я снова щелкаю обратно в поле High недавно добавленной записи и нажимаю пробел или вводю недопустимое значение.
Мне нужно знать, как получить новую добавленную строкунемедленно проверить его значения, если пользователь добавляет строку, а затем фокусируется вне вновь добавленной строки, чтобы я мог немедленно отключить добавление строки и кнопки сохранения.Я не хочу выполнять проверку после нажатия на кнопки сохранения или добавления строки, что противоречит цели этой модели проверки, но если это единственное решение, мне придется это сделать ... но странно, чтонезависимо от того, что я пытаюсь, только фактический ввод в поле и выход из строки запускает проверку ... даже программное изменение значений этого поля при выходе и программный запуск проверки не имеет никакого эффекта.
Есть мысли?Извините за скучность ...