如何获取DevExpress xtragrid的所有可见行

时间:2015-10-05 11:45:34

标签: c# gridview devexpress xtragrid

我有一个带有GridView的DevExpress(14.2)XtraGrid。在一列中,我想显示一个复杂的值来生成。所以我这样做是异步的。例如,如果我加载10000行,我不想为每一行启动10000个异步调用来生成复杂值。如果只是可见行得到更新,我认为这会很好。可见意味着它们实际显示给用户。

这是我到目前为止所尝试的(Datasource = List):

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

最后两行未加载,但它们是可见的 有人知道如何处理这个以及如何扩展它以进行滚动?

1 个答案:

答案 0 :(得分:3)

您可以使用未记录的BaseView.GetViewInfo方法获取可见行。此方法返回BaseViewInfo类型的对象,您需要将其转换为GridViewInfo类型。之后,您可以使用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事件。