2013-04-17 26 views
0

我在代碼兩個sectionstacksection,ONW正顯示出輸入數據和第二sectionstacksection動態表單是顯示listgrid它會顯示一個輸入數據時,我打保存在我的動態表單部分按鈕。如何顯示listgrid數據SectionStack在SmartGWT的

我創建了三個類,一個是擴展動態表單的EmployeeApplicationForm,第二個是擴展listgrid的EquiryList,第三個是爲Getter和Setter擴展ListGridRecord的EnquiryFormRecord。

我做feteching文本框的數據並調用構造函數EnquiryFormRecord得到和「數據」變量設置DATAS。但我無法訪問這個「數據」變量到我的EnquiryList類到「listData(data)」listGird字段。

我的代碼是這樣的。請分享你的想法來解決這個問題 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); 
} 
} 

回答

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); 
+0

Perfect..Thanx很多.. –

+0

我怎麼能與會話綁定呢? –

+0

@VishalShrimali不清楚綁定到會話的含義。如果它與這個問題沒有直接關係,可能會更好地作爲一個單獨的問題提出。 – Sithsu

0

我覺得短期的答案是使用語法來訪問封閉類變量。所以,而不是setData(data)這將是setData(EmployeeApplicationForm.this.data);

上述應該工作,但我不得不說,它的設置是混亂,應該重新工作。

+0

沒有它不工作,我只是創造一個dynamicform類輸入數據和一個listgrid班組長顯示所有形式在輸入的數據,當我點擊保存按鈕,保存按鈕也是動態表單類的一部分。 但它沒有發生。爲什麼。同樣的事情,我在OnModuleLoad中做了。在同一個OnModuleLoad方法中,動態表單和listgrid都是完美的。但如果我把在不同的班級像上面它不工作...... –