我正在研究一个当前具有相当复杂功能的系统,该系统返回一个DataTable,然后它绑定到ASP.NET WebForm上的GUI控件.
我的问题是我需要过滤返回的数据 - 不应该向用户显示一些正在返回的数据.
我知道DataTable.select(),但这不是我真正需要的.首先,它返回一个DataRows数组,我需要一个DataTable,所以我可以将它数据绑定到GUI控件.但更重要的是,我需要做的过滤不是可以轻松放入简单表达式的东西.我有一个我不想显示的元素数组,我需要将DataTable中的每个元素与该数组进行比较.
当然,我能做的就是创建一个新的DataTable,从原始内容中读取所有内容,添加新的内容,然后将新内容数据绑定到GUI控件.但不知何故,这似乎是错误的.在这种情况下,原始DataTable中的元素数量可能不足以将它们全部复制到内存中会导致太多麻烦,但我想知道是否还有其他方法.
.NET DataTable是否具有允许我通过回调函数进行过滤的功能?
Tho*_*que 17
使用DataView.ToTable方法:
DataTable sourceTable = ...
string filter = ...
string sort = ...
DataView view = new DataView(sourceTable, filter, sort, DataViewRowState.CurrentRows);
DataTable newTable = view.ToTable();
Run Code Online (Sandbox Code Playgroud)
如果您不能将过滤逻辑放在过滤器表达式中,则可以使用Linq to DataSet:
var query = from row in sourceTable.AsEnumerable()
where row.Field<int>("foo") > 42
&& row.Field<string>("bar") == "hello"
&& ...
select r;
var newTable = query.AsDataView().ToTable();
Run Code Online (Sandbox Code Playgroud)
或者,如果您已经有一个实现过滤的方法:
bool FilterRow(DataRow row)
{
...
}
...
var newTable = sourceTable.AsEnumerable().Where(FilterRow).AsDataView().ToTable();
Run Code Online (Sandbox Code Playgroud)
将 GUI 控件绑定到满足您的条件的 DataRows 列表怎么样?像这样的东西:
var lst = new List<DataRow>();
foreach(DataRow dr in dt.Rows) {
if (SatisfiesCondition(dr)) lst.Add(dr);
}
// in Linq dialect
var lst = dt.AsEnumerable().Where(SatisfiesCondition).ToList();
// here: bind control to list
Run Code Online (Sandbox Code Playgroud)
这样做,数据行不会被复制,但列表将保留对您需要的行的引用。
| 归档时间: |
|
| 查看次数: |
27903 次 |
| 最近记录: |