WinForm加载时如何读取DataSet绑定的Details View文本框值并执行对应逻辑
问题根因
你遇到的是WinForm数据绑定的执行顺序问题:Form.Load 事件触发时,简单绑定(Details视图下文本框的字段绑定)的初始值还未同步到控件属性;BindingSource.BindingComplete 未生效大概率是你绑定赋值的顺序不对,或事件注册晚于第一次绑定完成;初始绑定赋值时TextChanged 事件不会触发是因为此时控件还未完成初始化,事件未被挂载生效。
你的实现思路是可行的,只需要调整逻辑的执行时机,或者换更稳妥的取值方式即可,以下是3种验证过的可行方案:
方案1:直接读取数据源值(最推荐)
不要依赖控件的Text属性,直接从BindingSource绑定的数据源取字段值,不受控件绑定时机影响,稳定性最高。
将以下代码放在Form.Load事件的最后,或者你完成DataSet填充、给BindingSource赋值的代码之后即可:
// 替换为你实际的BindingSource名称、对应字段名 DataRowView currentRow = (DataRowView)bindingSource1.Current; string targetValue = currentRow["对应textBox1绑定的字段名"].ToString(); if (targetValue == "A") { label1.Visible = true; } else if (targetValue == "B") { label1.Visible = false; }
方案2:逻辑放在Form.Shown事件中
如果一定要读取textBox1的Text属性,把判断逻辑放在Form.Shown事件里即可,该事件是窗体第一次渲染显示完成后触发,此时所有控件绑定的初始值都已经同步完成,读取到的Text是准确的。
方案3:绑定Format事件实现全生命周期自动生效
如果需要后续textBox1绑定的字段值变更时,自动同步label的状态,可以给文本框的绑定加Format事件,该事件在绑定每次同步值时都会触发,包含初始加载、后续数据源更新、手动修改控件值等所有场景:
// 这段代码放在Form.Load事件中执行一次即可 textBox1.DataBindings["Text"].Format += (sender, e) => { string val = e.Value?.ToString() ?? string.Empty; label1.Visible = val == "A"; };
内容的提问来源于stack exchange,提问作者Aaron Hurst
相关产品推荐
相关产品推荐

