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

如何在C#的SfDataGrid中基于列值比较实现数据筛选?

在Syncfusion SfDataGrid中实现跨列值比较的筛选

针对你需要筛选Sales_Price列值小于等于Cost_Price列值的需求,提供两种可行实现方案:

方案1:通过ICollectionView过滤数据源

这种方式直接操作绑定的数据源视图,逻辑直观,适合跨列比较场景:

假设你的SfDataGrid绑定的是ObservableCollection<Product>(Product类包含Product_Name、Cost_Price、Sales_Price属性),步骤如下:

  1. 初始化数据源与视图:
private ObservableCollection<Product> productList;
private ICollectionView productView;

// 初始化并填充50行数据
productList = new ObservableCollection<Product>();
// 此处添加数据填充逻辑...
productView = CollectionViewSource.GetDefaultView(productList);
sfDataGrid1.ItemsSource = productView;
  1. 在sfButton1点击事件中实现筛选:
private void sfButton1_Click(object sender, EventArgs e)
{
    // 清除原有筛选
    productView.Filter = null;
    // 设置跨列筛选逻辑
    productView.Filter = item =>
    {
        var product = item as Product;
        if (product == null) return false;
        return product.Sales_Price <= product.Cost_Price;
    };
    // 刷新视图生效
    productView.Refresh();
}

方案2:使用SfDataGrid自定义筛选器

通过实现IFilterBehavior接口,为指定列添加跨列筛选逻辑:

  1. 创建自定义筛选器类:
public class CrossColumnFilter : IFilterBehavior
{
    public bool CanFilterColumn(GridColumn column)
    {
        // 指定仅对Sales_Price列应用此筛选
        return column.MappingName == "Sales_Price";
    }

    public IEnumerable<object> FilterRecords(GridColumn column, IEnumerable<object> records, string filterText, FilterOperator filterOperator, bool isCaseSensitive)
    {
        foreach (var record in records)
        {
            var product = record as Product;
            if (product != null && product.Sales_Price <= product.Cost_Price)
            {
                yield return record;
            }
        }
    }
}
  1. 在sfButton1点击事件中启用并应用筛选:
private void sfButton1_Click(object sender, EventArgs e)
{
    sfDataGrid1.AllowFiltering = true;
    var salesColumn = sfDataGrid1.Columns["Sales_Price"];
    salesColumn.FilterBehavior = new CrossColumnFilter();
    // 添加空筛选谓词触发筛选执行
    salesColumn.FilterPredicates.Add(new FilterPredicate() { FilterType = FilterType.Equals, FilterValue = string.Empty });
}

注意事项

  • 确保Product类中Cost_Price与Sales_Price属性类型一致(如int或decimal),避免类型转换错误。
  • 如需取消筛选,只需清除列的筛选谓词或重置productView.Filter为null后刷新视图即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:46:08