Как отобразить данные списка сетки в SectionStack в SmartGwt
У меня есть две секции стека в коде, onw показывает динамическую форму для входных данных, а вторая секция стека показывает listgrid, которая покажет входные данные, когда я нажму кнопку "Сохранить" в моей секции динамической формы.
Я создал три класса: один - EmployeeApplicationForm, расширяющий динамическую форму, второй - EquiryList, расширяющий listgrid, и третий - EnquiryFormRecord, расширяющий ListGridRecord для методов получения и установки.
Я сделал выборку данных текстовых полей и вызвал конструктор EnquiryFormRecord для получения и установки данных в переменную "data". но я не могу получить доступ к этой переменной "data" в мой класс EnquiryList для "setData(data)" в поле listGird.
Мой код такой. Пожалуйста, поделитесь своей идеей, чтобы решить эту проблему. EmployeeApplicationClass And EnquiryList:
class EmployeeApplicationForm extends DynamicForm {
ButtonItem saveButton;
ButtonItem resetButton;
EnquiryFormRecord[] data;
public EmployeeApplicationForm() {
setNumCols(6);
setWidth100();
setHeight(135);
setErrorOrientation(FormErrorOrientation.RIGHT);
final TextItem fname = new TextItem("FirstName");
final TextItem lname = new TextItem("LastName");
saveButton = new ButtonItem("Save");
saveButton.setStartRow(true);
saveButton.setEndRow(false);
resetButton = new ButtonItem("Reset");
resetButton.setStartRow(false);
resetButton.setEndRow(false);
saveButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
// TODO Auto-generated method stub
// if validation passes then show user an alert message box
if (valid()) {
SC.say("Form passed validation");
}
String fn = fname.getValueAsString();
String ln = lname.getValueAsString();
data = new EnquiryFormRecord[] { new EnquiryFormRecord(fn, ln) };
}
});
resetButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
// TODO Auto-generated method stub
resetForm();
}
});
setFields(fname, lname, saveButton, resetButton);
}
private boolean valid() {
return this.validate();
}
private void resetForm() {
this.reset();
}
}
class EnquiryList extends ListGrid {
public EnquiryList(EnquiryFormRecord[] data) {
ListGridField fname = new ListGridField("fname","First Name");
ListGridField lname = new ListGridField("lname","Last Name");
setFields(fname, lname);
setData(data);------/*Hera I am getting error. I cannot access the EmployeeAppliocationForm class "data" variable here*/
setCanEdit(true);
setShowAllRecords(true);
// setSortField(0);
setAlternateRecordStyles(true);
setCanDragRecordsOut(true);
setHoverWidth(200);
setHoverHeight(20);
setSelectionType(SelectionStyle.SINGLE);
}
}
2 ответа
В этом случае предпочтительнее использовать композицию объектов, чем наследование, поскольку вы не расширяете состояние / поведение ни в одном из объектов (DynamicForm, ListGrid, ListGridRecord).
Предпочитаете композицию наследству?
Зачем вообще использовать наследование?
Вы можете использовать композицию объекта, как описано ниже.
Одна вещь, которую нужно понять, это то, что записи должны быть добавлены в таблицу при нажатии кнопок / событиях.
Вы пытаетесь использовать setData во время инициализации экрана.
Вместо этого setData (скорее addData) должен вызываться из обработчика события кнопки.
Способ инициализации сетки
private ListGrid getListGrid() {
// preparing grid fields
ListGridField fname = new ListGridField("fname", "First Name");
ListGridField lname = new ListGridField("lname", "Last Name");
// creating and configuring grid
ListGrid grid = new ListGrid();
grid.setWidth100();
grid.setHeight100();
grid.setFields(fname, lname);
return grid;
}
Способ инициализации формы. Приходится проходить сетку, чтобы добавлять / обновлять записи о событиях кнопок.
private DynamicForm getDynamicForm(final ListGrid grid) {
// preparing form items
final TextItem fname = new TextItem("firstName", "First Name"); // its better to explicitly specify both name and title
final TextItem lname = new TextItem("lastName", "Last Name");
ButtonItem saveButton = new ButtonItem("Save");
saveButton.setStartRow(true);
saveButton.setEndRow(false);
saveButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
String fn = fname.getValueAsString();
String ln = lname.getValueAsString();
Record record = new Record();
record.setAttribute("fname", fn); // record attribute names must match grid field name
record.setAttribute("lname", ln);
grid.addData(record); // addData should be used to add new records per save operation
// setData should be used to set all records in grid per save operation
// in this case, its probably not what is required, as this will overwrite previous records in grid
// resulting, only one record left in grid after every save operation
// grid.setData(new Record[]{record});
}
});
// creating and configuring form
DynamicForm form = new DynamicForm();
form.setWidth100();
form.setHeight(135);
form.setNumCols(6);
form.setErrorOrientation(FormErrorOrientation.RIGHT);
form.setFields(fname, lname, saveButton);
return form;
}
Положить его вместе
ListGrid grid = getListGrid();
DynamicForm form = getDynamicForm(grid);
...
formSection.setItems(form);
...
gridSection.setItems(grid);
...
sections.setSections(formSection, gridSection);
Я думаю, что короткий ответ будет использовать синтаксис для доступа к переменным класса. Так что вместо setData(data)
это было бы setData(EmployeeApplicationForm.this.data);
Вышеуказанное должно работать, но я должен сказать, что способ его настройки сбивает с толку и должен быть переработан.