背景:在專案中遇到了這樣的問題,使用的datagrid需要預設選中第一條資料,即資料載入後,無需使用者點選,即可預設選中一項,並且,datagrid支援篩選操作,需要完成這樣的功能,資料來源中的資料項的某些屬性更新時,需要重新整理ui,並且需要保持當前的多選項。
問題:上面的背景中提到了兩個問題,一是需要預設選中第一項;二是datagrid相關的檢視進行重新整理時需要保持上次的多選項。預設選中第一項可以在資料載入完成後使用乙個雙向繫結完成,而保持上次的多選項,datagrid提供了乙個內部屬性用來控制,即為issynchronizedwithcurrentitem
,其值為false時,會保持上次的多選項,但此時設定當前選中的。這樣只可以實現,便卻要判斷每乙個當前選中項可以會空的場景,並及時的設定當前選中項為檢視中的第一項,太過複雜,容易出錯。
解決方案:自定乙個集合及所使用的檢視類,在檢視類中判斷當前選中項為空且檢視列表不為空的情況下,設定當前選中項為列表中第一項,否則為需要保持多選項的情況,即需要控制項的issynchronizedwithcurrentitem=false來保證,在檢視中設定預設選中項時又需要設定issynchronizedwithcurrentitem=true才能保持檢視中的更改可以及時的重新整理到ui上去。因此需要做好的兩種情況的判斷,從而正確切換issynchronizedwithcurrentitem,保證ui的正確性。
實現:資料的篩選需要重新filter一次,需要呼叫檢視的refresh操作,通過分析原始碼,分析出重新整理的過程,實現的示例圖可參照下圖:
注意:issynchronizedwithcurrentitem主要是用來同步當前選中項,在多ui使用同一資料來源時可以同步當前選中項,但這裡的實現並不支援,因為需要檢視類與ui耦合。
實現原始碼:
publicclass customcollection: observablecollection, icollectionviewfactory
private
readonly
selector _selector;
public
icollectionview createview()
}public
class
myview : listcollectionview
}private
readonly
selector _selector;
private
readonly
bool?_dgsynchronized;
private
object _precurrentitem = null
;
protected
override
void
refreshoverride()
protected
override
void
oncollectionchanged(notifycollectionchangedeventargs args)
else
_selector.issynchronizedwithcurrentitem = false
; }
base
.oncollectionchanged(args);
}protected
override
void
oncurrentchanged()}}
easyUI跨tab重新整理datagrid
專案上遇到乙個情況,需要在當前頁 tab 完成操作後重新整理另外乙個tab中datagrid的資料,然而在當前tab中獲取到datagrid呼叫其load方法,datagrid從伺服器獲取到資料了,但是那個tab中的datagrid資料清空了!最終沒有找到好的解決方法,只好用一種迂迴的方式解決 1 ...
flex中獲取datagrid選中行的列值
var v object datagrid.editeditemposition var colindex number v.columnindex var rowindex number v.rowindex var colatagridcolumn datagrid.columns colind...
DataGrid 換行問題
1.在頁面新增 在grid的html裡面新增 itemstyle wrap false 如 asp templatecolumn itemstyle wrap false itemtemplate asp linkbutton id lb edit runat server commandname ...