c# - VB 和 C# 之间的绑定(bind)问题

标签 c# vb.net

在 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()

所以简化的代码模式是:

  1. 创建一个 BindingSource 实例。
  2. 在 BindingSource 上调用 BeginInit。
  3. 针对 BindingSource 创建/添加所有绑定(bind)。
  4. 设置 BindingSource.DataSource 属性。
  5. 在 BindingSource 上调用 EndInit。

此模式与使用的语言无关。

关于c# - VB 和 C# 之间的绑定(bind)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57862717/

相关文章:

VB.NET - 应用程序遇到用户定义的断点

c# - 本地唯一标识符

vb.net - 用一行代码设置一组控件可见?

c# - CheckedListBox 数据绑定(bind)到项目的选中状态

c# - Windows Phone 8 - Geolocator PositionChanged 监听器在一段时间后死亡

c# - 在树状通用列表中按字母数字顺序排列子项的扩展方法

asp.net - 覆盖用户控件中的方法

c# - JSON.NET 的 JsonConvert 我做错了什么

c# - 在类库级别捕获 C# 错误

c# - 我们应该使用 Windows 服务还是线程池?