在 C# 中我有以下代码
txtCode.DataBindings.Add(new Binding("Text", _bsDetail, "Code", true, DataSourceUpdateMode.OnPropertyChanged));
在 VB.NET 中
txtCode.DataBindings.Add(new Binding("Text", _bsDetail, "Code", true, DataSourceUpdateMode.OnPropertyChanged))
在 C# 中,我可以在绑定(bind)源上设置数据源之前调用此代码,在 VB.NET 中,我必须在调用此代码之前分配数据源。我在 VB.NET 中收到以下错误
无法绑定(bind)到数据源上的属性或列代码。 参数名称:dataMember'
有没有办法在 VB.NET 中分配数据源之前调用此代码?
最佳答案
Is there a way I can call this code before assigning the datasource in VB.NET?
是的,它与 C# 中使用的代码序列相同。 C# 中没有任何固有的东西允许您所描述的内容。
为了向自己证明这一点,创建一个新的 C# Winform 项目并将以下代码添加到 Form1。
BindingSource bs;
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
bs = new BindingSource();
Debugger.Break();
Binding b = new Binding("Text", bs, "Code", true, DataSourceUpdateMode.OnPropertyChanged);
this.DataBindings.Add(b);
}
现在运行代码,当调试器中断时,逐步执行代码。您将看到错误发生在最后一行。这是堆栈跟踪的摘录。错误发生在 CheckBinding method因为尚未为 BindingSource
分配一个公开 Code
属性的 DataSource
。
at System.Windows.Forms.BindToObject.CheckBinding() at System.Windows.Forms.BindToObject.SetBindingManagerBase(BindingManagerBase lManager) at System.Windows.Forms.Binding.SetListManager(BindingManagerBase bindingManagerBase) at System.Windows.Forms.ListManagerBindingsCollection.AddCore(Binding dataBinding) at System.Windows.Forms.BindingsCollection.Add(Binding binding) at System.Windows.Forms.BindingContext.UpdateBinding(BindingContext newBindingContext, Binding binding) at System.Windows.Forms.Binding.SetBindableComponent(IBindableComponent value) at System.Windows.Forms.ControlBindingsCollection.AddCore(Binding dataBinding) at System.Windows.Forms.BindingsCollection.Add(Binding binding) at System.Windows.Forms.ControlBindingsCollection.Add(Binding binding)
可以通过将 BindingSource
置于 initializing 状态来抑制绑定(bind)检查。 BindingSource
实现了 ISupportInitialize Interface暴露了 BeginInit Method .将 OnLoad
代码替换为以下代码:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
bs = new BindingSource();
ISupportInitialize isi = (ISupportInitialize)bs;
Debugger.Break();
isi.BeginInit();
Binding b = new Binding("Text", bs, "Code", true, DataSourceUpdateMode.OnPropertyChanged);
this.DataBindings.Add(b);
isi.EndInit();
}
运行代码并在调试器中再次逐步执行代码。您会看到错误没有发生在 DataBindings.Add
语句中,而是发生在 EndInit Method 中。此时 CheckBindings
最终被调用并失败,因为没有提供数据源。
at System.Windows.Forms.BindToObject.CheckBinding() at System.Windows.Forms.BindToObject.DataSource_Initialized(Object sender, EventArgs e) at System.Windows.Forms.BindingSource.OnInitialized() at System.Windows.Forms.BindingSource.System.ComponentModel.ISupportInitialize.EndInit()
所以简化的代码模式是:
- 创建一个 BindingSource 实例。
- 在 BindingSource 上调用 BeginInit。
- 针对 BindingSource 创建/添加所有绑定(bind)。
- 设置 BindingSource.DataSource 属性。
- 在 BindingSource 上调用 EndInit。
此模式与使用的语言无关。
关于c# - VB 和 C# 之间的绑定(bind)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57862717/