Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# VB与C之间的绑定问题#_C#_Vb.net - Fatal编程技术网

C# VB与C之间的绑定问题#

C# VB与C之间的绑定问题#,c#,vb.net,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#中

在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#中,我可以在bindingsource上设置数据源之前调用此代码,在VB.NET中,我必须在调用此代码之前分配数据源。我在VB.NET中遇到以下错误

无法绑定到数据源上的属性或列代码。 参数名称:dataMember'

在VB.NET中分配数据源之前,是否有方法调用此代码

在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);
}
现在运行代码,当调试器中断时,逐步完成代码。您将在最后一行看到错误发生。下面是堆栈跟踪的摘录。该错误发生在中,因为未为
BindingSource
分配公开
code
属性的
DataSource

在System.Windows.Forms.BindToObject.CheckBinding()中 位于System.Windows.Forms.BindToObject.SetBindingManagerBase(BindingManagerBase lManager) 位于System.Windows.Forms.Binding.SetListManager(BindingManagerBase BindingManagerBase) 位于System.Windows.Forms.ListManagerBindingsCollection.AddCore(绑定数据绑定) 位于System.Windows.Forms.BindingsCollection.Add(绑定绑定) 位于System.Windows.Forms.BindingContext.UpdateBinding(BindingContext-newBindingContext,Binding-Binding) 位于System.Windows.Forms.Binding.SetBindableComponent(IBindableComponent值) 位于System.Windows.Forms.ControlBindingsCollection.AddCore(绑定数据绑定) 位于System.Windows.Forms.BindingsCollection.Add(绑定绑定) 位于System.Windows.Forms.ControlBindingsCollection.Add(绑定绑定)

通过将
BindingSource
置于初始化状态,可以抑制绑定检查<代码>绑定源代码实现公开的。将
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
语句中,而是发生在最终调用
CheckBindings
并失败的点上,因为没有提供数据源

在System.Windows.Forms.BindToObject.CheckBinding()中 在System.Windows.Forms.BindToObject.DataSource_处初始化(对象发送方,事件参数e) 位于System.Windows.Forms.BindingSource.OnInitialized()处 位于System.Windows.Forms.BindingSource.System.ComponentModel.ISupportInitialize.EndInit()处

因此,简化的代码模式是:

  • 创建BindingSource实例
  • 在BindingSource上调用BeginInit
  • 根据BindingSource创建/添加所有绑定
  • 设置BindingSource.DataSource属性
  • 在BindingSource上调用EndInit

  • 此模式独立于所使用的语言。

    在C#中,您确定BindingSource.DataSource未应用于设计器生成的代码中吗?(即:检查.designer.cs文件)。@AlwaysLearning,我确信,bindingsource是通过代码在行上设置断点创建的,并查看
    \u bsDetail
    的值。我猜是
    \u bsDetail.code
    不存在或什么都不是。@David\u bsDetail被创建为不是什么。bindingsource上没有名为Code(bsDetail.Code)的属性,这是控件需要绑定到的数据源中的列。