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

How to get all visible rows of DevExpress xtragrid

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

这是我目前尝试的方法(数据源 = 列表):

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.

时触发

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

您可以使用未记录的 BaseView.GetViewInfo 方法获取可见行。此方法 return 需要将 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 事件。