2015-10-05 101 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事件。

相关问题