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

BindingSource的BindingComplete事件未触发,附ComboBox绑定代码

解决BindingSource.BindingComplete事件未触发的问题

我来帮你排查这个BindingComplete事件没触发的问题,结合你给出的代码片段,大概率是这几个环节出了问题,咱们一步步来:

1. 先检查数据源是否真的完成了绑定操作

BindingComplete事件只有在**数据绑定真正完成(包括初始化、更新)**的时候才会触发。你现在只设置了bsContractors.DataSource = typeof(Contractor);,但如果这个BindingSource里没有实际的数据源集合(比如只是指定了类型,没给具体的List<Contractor>数据),或者ComboBox的绑定没有走完初始化流程,事件自然不会触发。

解决办法:

  • 给BindingSource赋值实际的数据源集合,比如:
    bsContractors.DataSource = new List<Contractor> { /* 这里添加你的Contractor实例数据 */ };
    
  • 确保ComboBox的DisplayMember和ValueMember已经正确设置,因为SelectedValue绑定依赖这两个属性(对应你的Contractor类里的具体字段):
    cmbContract_Contractors.DisplayMember = "ContractorName"; // 替换成你用来显示的属性名
    cmbContract_Contractors.ValueMember = "ContractorId"; // 替换成你用来作为值的属性名
    

2. 核对绑定的数据源和触发逻辑

你代码里绑定的是bsProject,但前面定义的是bsContractors——这很可能是笔误!如果绑定的是不同的BindingSource,那bsContractors的BindingComplete当然不会触发,这点一定要仔细检查。

另外,默认的Binding是单向绑定(从数据源到控件),且只有数据源更新时才会触发事件。你可以在添加DataBinding时明确指定更新模式,确保控件值变化时能同步触发绑定事件:

cmbContract_Contractors.DataBindings.Add(
    new Binding("SelectedValue", 
                this.bsContractors, // 这里要和你要监听的BindingSource一致
                "对应的属性名", 
                true, 
                DataSourceUpdateMode.OnPropertyChanged));

3. 确认Contractor类是否实现了INotifyPropertyChanged接口

如果你的Contractor类没有实现这个接口,当数据源的属性发生变化时,BindingSource无法感知到变化,也就不会触发BindingComplete事件。

解决办法:

  • 让Contractor类实现INotifyPropertyChanged:
    public class Contractor : INotifyPropertyChanged
    {
        private int _contractorId;
        public int ContractorId
        {
            get => _contractorId;
            set
            {
                if (_contractorId != value)
                {
                    _contractorId = value;
                    OnPropertyChanged(nameof(ContractorId));
                }
            }
        }
    
        // 其他属性同理实现
    
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

4. 调试阶段可以手动触发绑定

如果以上都检查没问题,你可以在初始化完成后手动调用ResetBindings,强制触发绑定操作,看看事件会不会触发:

bsContractors.ResetBindings(false);

你可以先从「绑定的BindingSource是否正确」「数据源是否有实际数据」这两点入手,这两个是最常见的坑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:56:56