我用實例項目寫了個子父頁面傳值,算是比較靈活的寫法,可以把js提取出來寫成包,然后調用,我先一步一步寫,為有困難的朋友打個樣。
先畫個頁面:
上面是個查詢用的表單,底下是表格,內存分頁,用到了VBox布局注意BoxFlex屬性的應用,頁面還有一個window頁面。我會把源碼放出來。
1.先看查詢
姓名的查詢按鈕會彈出一個window,打開window前后台都差不多,我用了前台,這個樣子滴
<f:TriggerBox runat="server" Label="姓名" AutoPostBack="false" TriggerIcon="Search" OnClientTriggerClick="ShowWindow()" ID="TriggerBox1" EnablePostBack="False"> </f:TriggerBox>
1 //顯示window 2 function ShowWindow() { 3 F('<% =Window1.ClientID %>').f_show('./selectgrid.aspx', '選擇', 800, 500); 4 }
第一個參數是url,第二個是標題,然后是寬和高。js比回發快不多說。

選擇window下有按鈕三個:確定,確定並查詢,取消在最底下,注意grid 的EnableMultiSelect 屬性,三按鈕都是前台寫的,沒有觸發后台,可能是寫的簡單,但也感覺挺靈活的。
貼出來注意多看一眼注釋,確認和確認並查詢的方法,其實就是多個回發,但回發要在上層執行,方法寫在后台我感覺亂,轉不過來,所以都搬前台來了,一步一步寫,所以靈活,我可以中間干點別的。
function select(select_back) {
//得到選擇的行
var rows = F('<% =Grid1.ClientID %>').f_getSelectedRows();
//選擇項
var provinceName;
//注意each的使用
Ext.Array.each(rows, function (rowIndex, index) {
//得到選擇的行數據和列數據
var rec = F('<% =Grid1.ClientID %>').store.getAt(rowIndex);
provinceName = rec.get('Name');
});
//核心:得到當前的window
var activeWindow = F.wnd.getActiveWindow();
//核心:執行上層的js
activeWindow.window.selectProvince(provinceName, select_back);
//核心:隱藏該window
activeWindow.f_hide();
}
執行了上層的selectProvince方法,再把selectProvince方法貼出來,上層就是window_grid頁面
function selectProvince(name, select_back) {
//給控件賦值
F('<% =TriggerBox1.ClientID %>').setValue(name);
//是否回發
if (select_back) {
//回發事件
F.customEvent('SelectGrid');
}
}
其實有了customEvent方法 愛怎么回發怎么回發,后台方法就是通過姓名查詢數據,沒啥好寫的。
這個例子主要是打開window,打開的window通過執行上層的js回發至后台靈活執行方法。
2.修改
也是打開個window,這里得到了一個選擇行的Id,當做參數傳過去了,后來發現這個沒用到,反正我沒用到,注意
rec.get(方法 參數是ColumnID
function Grid_Edit() {
var rows = F('<% =Grid1.ClientID %>').f_getSelectedRows();
var id;
Ext.Array.each(rows, function (rowIndex, index) {
var rec = F('<% =Grid1.ClientID %>').store.getAt(rowIndex);
id = rec.get('ItemId');
});
F('<% =Window1.ClientID %>').f_show('./gridedit.aspx?id=' + id, '修改', 500, 300);
}
加載數據也是js寫的,Bindedit方法上下也用到了。
F.ready(function () {
Bindedit();
});
function Bindedit(Position) {
var activeWindow = F.wnd.getActiveWindow();
var id = activeWindow.window.GetSelectID(Position);
F.customEvent('Bindedit_' + id);
}
用到了上層的GetSelectID方法,參數是上還是下。
function GetSelectID(Position) {
var grid = F('<% =Grid1.ClientID %>');
var selectedValues = [];
var rows = grid.f_getSelectedRows(), id;
Ext.Array.each(rows, function (rowIndex, index) {
//上機制,到0了就上不去了
if (Position == "top" && rowIndex != 0) {
rowIndex = rowIndex - 1;
}
//到最后也上不去了
if (Position == "next" && rowIndex != grid.f_getPaging().f_pageSize - 1 && rowIndex != grid.getStore().getCount()) {
rowIndex = rowIndex + 1;
}
//想寫翻頁着,不好寫
if (rowIndex == grid.f_getPaging().f_pageSize - 1) {
//F.customEvent('rowIndex_Next_');
}
//新方法:選擇當前行
selectedValues.push(rowIndex);
grid.f_selectRows(selectedValues);
//得到行對應列的數據
var rec = grid.store.getAt(rowIndex);
id = rec.get('ItemId');
});
return id;
}
還有一個方法是GetWindow,我以前寫過,看看代碼吧。晚了睡覺。
這個JS寫的有點腫,可以直接后台調用,可以參見
ASP.NET-FineUI開發實踐-17對傳值進行了優化
發個圖:
