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

绑定UltraWinGrid时List<T>与BindingList<T>行为差异问题问询

问题根因

1. List绑定时仅展示Sequence子带

WinForms 数据绑定以及 Infragistics UltraWinGrid 的默认逻辑,仅会把实体类中第一个定义的集合属性识别为子带进行渲染。你在 Sequence 类中先定义了 SubSequences 集合,后定义了 Operations 集合,所以网格自动生成子带时会直接忽略后定义的 Operations 集合。

2. BindingList绑定时反复调用、内存暴涨

你当前的 BindingList 实现是每次访问属性 getter 时,都实时查询 Repository 并生成全新的 BindingList 实例。UltraWinGrid 绑定过程中会反复遍历访问集合属性做数据校验、结构解析、嵌套层级渲染,每次拿到新的 BindingList 实例都会触发新一轮的绑定逻辑,最终形成无限循环,导致内存持续升高。


解决方向

第一步:优化 Sequence 类的 BindingList 实现,避免每次生成新实例

改用私有字段缓存 BindingList 实例,仅在初始化或者数据主动变更时刷新集合内容,不要每次访问 getter 都生成新对象:

public class Sequence
{
    // 新增私有缓存字段
    private BindingList<Sequence> _subSequences;
    private BindingList<Operation> _operations;
    
    public Sequence()
    {
        InitChildCollections();
    }

    public Sequence(int SequenceNo, int? ParentSequenceNo, SequenceType Type, string Description)
    {
        this.SequenceNo = SequenceNo;
        this.ParentSequenceNo = ParentSequenceNo;
        this.Type = Type;
        this.Description = Description;
        InitChildCollections();
    }

    // 初始化绑定集合,仅在实例构造时执行一次
    private void InitChildCollections()
    {
        var subSeqList = Repository.SequencesList.FindAll(x => x.ParentSequenceNo == this.SequenceNo);
        _subSequences = new BindingList<Sequence>(subSeqList);
        
        var opList = Repository.OperationsList.FindAll(x => x.ParentSequenceNo == this.SequenceNo);
        _operations = new BindingList<Operation>(opList);
    }

    // 集合属性仅返回缓存的实例
    public BindingList<Sequence> SubSequences 
    { 
        get => _subSequences;
    } 
    public BindingList<Operation> Operations 
    { 
        get => _operations;
    }

    // 后续如果Repository数据有变更,调用此方法刷新缓存
    public void RefreshChildren()
    {
        // 刷新子序列
        _subSequences.Clear();
        var newSubs = Repository.SequencesList.FindAll(x => x.ParentSequenceNo == this.SequenceNo);
        foreach (var sub in newSubs) _subSequences.Add(sub);

        // 刷新工序
        _operations.Clear();
        var newOps = Repository.OperationsList.FindAll(x => x.ParentSequenceNo == this.SequenceNo);
        foreach (var op in newOps) _operations.Add(op);
    }

    // 其余原有代码保持不变
}

第二步:配置UltraWinGrid支持多子带渲染

在绑定数据源前开启自动生成所有子带的配置,避免仅渲染第一个集合:

private void FrmMain_Load(object sender, EventArgs e)
{
    MockDataFiller.CreateMockData();
    var rootSequence = Repository.SequencesList.FirstOrDefault(x => x.SequenceNo == 0);
    var zeroSequenceList = new List<Sequence> { rootSequence };
    
    // 新增网格配置,允许自动生成所有集合对应的子带,按需加载避免卡顿
    gridSequences.DisplayLayout.AutoGenerateBands = true;
    gridSequences.DisplayLayout.LoadOnDemand = LoadOnDemand.Enable;
    
    gridSequences.DataSource = zeroSequenceList;
}

如果自动生成的列不符合业务要求,可以手动为每个Band配置对应列的显示规则即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:45:03