如何获取 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
事件。
我有一个带有 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
事件。