我有一个包含10000多行的DataTable,这是由SQL Server查询产生的。 DataTable用作DataGridView的DataSource,如下所示(简化代码):
MyBindingSource = New BindingSource(MyDataTable, Nothing)
MyDataGridView.DataSource = MyBindingSource
由于加载时间过长,我想以某种方式限制DataGridView中显示的行数。
我无法在查询中使用TOP
,因为我需要DataTable中的所有数据以便稍后进行过滤,而无需重新设置DataSource(MyBindingSource.Filter = MyFilter
)。
另外,我无法使用Filter
属性来限制行数,因为查询结果中没有可用于此的相关数据。为了解决这个问题,我考虑过将TSQL ROW_NUMBER
添加到查询结果(MyBindingSource.Filter = "[RowNumberField] < 100"
),但这只有在过滤器中没有使用其他字段时才会起作用。
有什么想法吗?
答案 0 :(得分:0)
以下是两个选项:
我只是使用这个technique使用BindingNavigator GUI控件(使用BindingSource对象来识别分页符)来对所有视图(过滤或未过滤)实现分页。
您还可以使用OR operator按多个条件进行过滤,但我看不出这对您当前的方法有何帮助,因为每次过滤后都必须重新计算行号,例如[RowNumberField]&lt;在过滤器之后,100可能只返回100行而没有过滤器。
您可以做的是将过滤逻辑移动到您的SQL查询,然后始终只显示基于行号的前X行(我假设您每次使用TSQL的ROW_NUMBER()动态添加)。< / p>
这种方法的优势在于,您可以在TSQL中执行更强大的过滤,并使数据源更小。
如果你采用这种方法,请注意将查询与视图逻辑混合 - 我建议使用Repository Pattern。