2015-10-05 65 views
1

我有一個DevExpress(14.2)XtraGrid與GridView。在一列中,我想展示一個複雜的值。所以我正在做這個異步。例如,如果我加載10000行,我不想爲每行啓動10000次異步調用來生成複雜值。我認爲這將是很好的,如果只是可見的行正在更新。可見意味着它們實際顯示給用戶。如何獲得DevExpress的所有可見行xtragrid

這是我試過至今(數據源=列表):

if (this._myDataSource != null) 
{ 
    foreach (MyObject object in this._myDataSource) 
    { 
     int rowHandle = this.myGridView.GetRowHandle(this._myDataSource.IndexOf(object)); 
     var rowState = this.myGridView.IsRowVisible(rowHandle); 

     switch (rowState) { 
      case RowVisibleState.Visible: 
       object.LoadAsyncData; 
       break; 
     } 
    } 
} 

如果GridView.Layout事件觸發,我執行上面的代碼。所以如果用戶正在排序或分組,這將被執行。

但有一些好奇的行爲。事件發生時,一些行似乎不可見。進一步的佈局事件不會在滾動GridView時觸發。

enter image description here

最後兩行沒有加載,但它們是可見的。
有人知道如何處理這個問題,以及如何擴展這個滾動?

回答

3

您可以通過使用未公開的BaseView.GetViewInfo方法來獲取可見行。此方法返回您需要轉換爲GridViewInfo類型的BaseViewInfo類型的對象。之後,您可以使用GridViewInfo.RowsInfo屬性獲取所有可見的行。
這裏是例子:

var info = (GridViewInfo)gridView1.GetViewInfo(); 

foreach (var rowInfo in info.RowsInfo) 
{ 
    int rowHandle = rowInfo.RowHandle; 

    if (gridView1.IsDataRow(rowHandle)) 
    { 
     var dataObject = (YourDataClass)gridView1.GetRow(rowHandle); 
     dataObject.LoadAsyncData; 
    } 
} 

對於滾動,你可以使用GridView.TopRowChanged事件。

相關問題