1. 程式人生 > >elfenliedef的程式設計之旅

elfenliedef的程式設計之旅

Ext grid顯示的行記錄背景顏色都是一樣的,這樣不容易區分不同行的顏色、方便使用者區分不同的記錄。
改變單元格背景顏色的方法有幾種,由簡單的說起吧!
第一種情況:載入資料時改變列的顏色。這種方式是通過Ext.grid.ColumnModel中某一列的renderer 函式來實現的。
首先定義一個樣式如下:
.x-grid-record-gray{
background: #c3daf9;
}


定義改變顏色的列,加上renderer 渲染函式:
{header:’摘要’,dataIndex:’zhaoyao’,align:’left’,width:150,
renderer : function(value, m){
m.css=’x-grid-record-gray’;
return value;
}
}

第二種情況:載入資料完成後改變行的顏色
首先要解決的一個問題是如果判斷資料已經載入完畢,最簡單的方法是給grid的store新增onload事件。
如果你想有條件地改變某行的背景顏色,則還需要遍歷gird的store,這裡有個簡單的方法即store的
each方法。看下面這個例子:
grid.getStore().addListener(‘load’,handleGridLoadEvent);
function handleGridLoadEvent(store,records) {
var girdcount=0;
store.each(function(r){
if(r.get(‘STORESUSEDQTY’)==0){
grid.getView().getRow(girdcount).style.backgroundColor=’#c3daf9′;
}
girdcount=girdcount+1;
});
}

第三種情況:使用Ext本身的顏色渲染效果
在grid中配置stripeRows為true,可以實現隔行變色,但不能達到根據不同記錄集實現不同顏色的顯示效果.

說完上面常見的幾種方法之後,在來結合專案中的需求來實現背景顏色變色。現在專案中的Ext grid表格是三方公司用程式碼更具配置檔案動態生成的,其程式碼都封裝了一個動態命名的名稱空間裡,JavaScript程式碼寫在了頁面上。我只能在這個 Ext grid程式碼生成之後獲得一個grid引用。
下面是部分程式碼:
Ext.namespace(‘BO_PC_REQUIRE_S’);
BO_PC_REQUIRE_S.Grid=function(){
currentRowInd=0;
currentColInd=0;
var AWS_GRID_CHECK;
var AWS_FORM;
var AWS_GRID_DS_PLANT;
var AWS_GRID_DS;
var AWS_GRID_CM;
var AWS_GRID_PANEL;

return {
perPage: 50,
currentRowInd:0,
currentColInd:0,
init : function(){

},
getDataSource: function() {
return AWS_GRID_DS;
},
getGridPanel: function() {
return AWS_GRID_PANEL;
},
getCurrentRowInd: function() {
return currentRowInd;
},
getCurrentColInd: function() {
return currentColInd;
},
getTitle: function(){
return ‘採購需求單子表(設計師)’;
},
saveData: function(){
if(typeof(outerDoSaveGrid)==’function’){return outerDoSaveGrid();}
},
setCellValue: function(f,v,r){
var rowInd=currentRowInd;
if(r!=undefined)rowInd=r;
AWS_GRID_DS.getAt(rowInd).set(f,v);
},
getCellValue: function(f,r){
var rowInd=currentRowInd;
if(r!=undefined)rowInd=r;
return AWS_GRID_DS.getAt(rowInd).get(f);
}
}//End return
});

參考上門說的三種方法,第一種不可實現,第二種可以實現,但存在一些問題:資料載入完之後,達到不同行顯示不同背景色的目的,但是當你單擊表頭進行排序的時候,表格內的所有行背景顏色又都回到了預設顏色,讓人煩惱!這時候想想,我可不可以重寫表頭的事件,使執行這些事件的時候,也是行背景變色呢?實現程式碼如下:
BO_PC_REQUIRE_S.Grid.getGridPanel().getStore().addListener(‘load’,
handleGridLoadEvent);
function handleGridLoadEvent(store,records) {
var girdcount=0;
store.each(function(r){
if(r.get(‘STORESUSEDQTY’)==0){
BO_PC_REQUIRE_S.Grid.getGridPanel().getView().getRow(girdcount).style.backgroundColor=’#c3daf9′;
}
girdcount=girdcount+1;
});
}

BO_PC_REQUIRE_S.Grid.getGridPanel().addListener(‘headerclick’,
function(){
var girdcount=0;
BO_PC_REQUIRE_S.Grid.getDataSource().each(function(r){
if(r.get(‘STORESUSEDQTY’)==0){
BO_PC_REQUIRE_S.Grid.getGridPanel().getView().getRow(girdcount).style.backgroundColor=’#c3daf9′;
}
girdcount=girdcount+1;
});
});

BO_PC_REQUIRE_S.Grid.getGridPanel().addListener(‘headermousedown’, function(){});

這樣做又有了問題,表格排序事件不起作用了,有沒有更好的解決辦法呢?看看API,grid裡有個檢視,通過改變視圖裡的getRowClass方法,可以實現行跨多列顯示、單行內顯示多行內容等等效果。可不可以參照這個思路,通過改變css實現行背景換色呢?
程式碼如下:
BO_PC_REQUIRE_S.Grid.getGridPanel().getView().getRowClass=function(record,rowIndex,rowParams,store){
if(record.data.STORESUSEDQTY==0){
return ‘x-grid-record-gray’;
}else{
return ”;
}};