我有一个带有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
时,布局事件不会触发。
最后两行未加载,但它们是可见的 有人知道如何处理这个以及如何扩展它以进行滚动?
答案 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
事件。