如何在SmartGwt中的SectionStack中显示listgrid数据

时间:2013-04-17 10:13:10

标签: textbox smartgwt listgrid

我在代码中有两个sectionstacksection,onw显示输入数据的动态表单,第二个sectionstacksection显示listgrid,当我点击动态表单部分中的save按钮时,它将显示输入数据。

我创建了三个类,一个是扩展动态表单的EmployeeApplicationForm,第二个是扩展listgrid的EquiryList,第三个是EnquiryFormRecord,它正在为getter和setter扩展ListGridRecord。

我已经完成了对文本框数据的操作,并调用了一个EnquiryFormRecord构造函数来获取和设置“data”变量中的数据。但我无法在listGird字段中将此“data”变量访问我的EnquiryList类到“setData(data)”。

我的代码是这样的。请分享您的想法以解决此问题 EmployeeApplicationClass和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 个答案:

答案 0 :(得分:0)

我认为简短的回答是使用语法来访问封闭的类变量。因此,不是setData(data),而是setData(EmployeeApplicationForm.this.data);

上面应该有用,但我必须说它的设置方式令人困惑,应该重新加工。

答案 1 :(得分:0)

在这种情况下,最好使用对象组合而不是继承,因为您没有在任何对象(DynamicForm,ListGrid,ListGridRecord)中扩展状态/行为。
Prefer composition over inheritance?
Why use inheritance at all?

您可以使用对象组合,如下所述。

要理解的一点是,需要在按钮点击/事件的基础上将记录添加到网格中 您正在尝试在屏幕初始化期间使用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);