You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用DataTable.DefaultView.RowFilter筛选?C#项目中无法识别该属性

问题分析与解决方案

你遇到的问题不是DefaultView被弃用,而是数据源类型不匹配:

  • 旧VB.NET项目里的数据源是DataTable,它自带DefaultView属性;
  • 现在C#项目中绑定的是List<IdValueReadModel>(自定义实体类的泛型列表),这类集合没有DefaultView,所以(cbClient.DataSource as DataTable)会返回null,调用DefaultView自然报错。

下面提供两种可行的筛选方案:


方案1:用BindingSource作为中间层(推荐,贴近旧项目用法)

BindingSource支持Filter属性,能直接对绑定的泛型列表做类似RowFilter的筛选,无需修改数据源类型。

步骤1:修改绑定代码,引入BindingSource

// 定义类级别的BindingSource实例,保存原始数据
private BindingSource _clientBindingSource = new BindingSource();

public void LoadDataToClients(IEnumerable<IdValueReadModel> clients)
{
    _clientBindingSource.DataSource = clients.ToList();
    cbClient.DataSource = _clientBindingSource;
    cbClient.DisplayMember = "Value";
    cbClient.ValueMember = "Id";
}

步骤2:实现筛选逻辑

string filterText = txtFilterClient.Text.Trim();
if (string.IsNullOrEmpty(filterText))
{
    _clientBindingSource.Filter = ""; // 清空筛选,显示全部数据
}
else
{
    // 转义单引号,避免筛选文本包含单引号时出错
    string safeFilterText = filterText.Replace("'", "''");
    // 用类似SQL的LIKE语法筛选,属性名要和IdValueReadModel的Value属性一致
    _clientBindingSource.Filter = $"Value LIKE '%{safeFilterText}%'";
}

方案2:用LINQ直接过滤列表

如果不想用BindingSource,可以直接通过LINQ过滤原始列表,再重新绑定控件。

步骤1:保存原始数据源

需要在类中保存原始的客户端列表,避免每次筛选都重新获取数据:

private List<IdValueReadModel> _originalClients;

public void LoadDataToClients(IEnumerable<IdValueReadModel> clients)
{
    _originalClients = clients.ToList();
    cbClient.DataSource = _originalClients;
    cbClient.DisplayMember = "Value";
    cbClient.ValueMember = "Id";
}

步骤2:实现筛选逻辑

string filterText = txtFilterClient.Text.Trim();
List<IdValueReadModel> filteredClients;

if (string.IsNullOrEmpty(filterText))
{
    filteredClients = _originalClients.ToList();
}
else
{
    // 自定义匹配逻辑,比如忽略大小写
    filteredClients = _originalClients
        .Where(c => c.Value.IndexOf(filterText, StringComparison.OrdinalIgnoreCase) >= 0)
        .ToList();
}

// 重新绑定筛选后的列表
cbClient.DataSource = filteredClients;
cbClient.DisplayMember = "Value";
cbClient.ValueMember = "Id";

补充说明

  • DefaultView并没有被弃用,它依然是DataTable的核心属性,只是不适用于泛型列表这类非ADO.NET数据集类型;
  • 方案1的BindingSource.Filter支持更多筛选语法(比如多条件组合),方案2的LINQ方式更灵活,可自定义复杂匹配规则。

内容的提问来源于stack exchange,提问作者Arie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:52:41