【发布时间】:2018-04-20 09:54:31
【问题描述】:
如果您在未调试的情况下运行以下代码(或启用“仅启用我的代码”),它似乎可以工作。但是如果你用调试器启动它并关闭“启用我的代码”,你会得到这个异常(然后被库代码吞没):
System.ArgumentException occurred
HResult=-2147024809
Message=Complex DataBinding accepts as a data source either an IList or an IListSource.
Source=System.Windows.Forms
StackTrace:
at System.Windows.Forms.ListControl.set_DataSource(Object value)
InnerException:
这是我的代码的最小版本:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm(new MainModel()));
}
}
public class MainModel {
public IList Options { get; } = new List<string> { "Foo", "Bar" };
}
class MainForm : Form {
private System.ComponentModel.IContainer components;
private ComboBox comboBox;
private BindingSource bindingSource;
private ErrorProvider errorProvider;
public MainForm(MainModel mainModel) {
InitializeComponent();
bindingSource.DataSource = mainModel;
}
private void InitializeComponent() {
components = new System.ComponentModel.Container();
bindingSource = new BindingSource(components);
errorProvider = new ErrorProvider(components);
((System.ComponentModel.ISupportInitialize) bindingSource).BeginInit();
((System.ComponentModel.ISupportInitialize) errorProvider).BeginInit();
SuspendLayout();
bindingSource.DataSource = typeof(MainModel);
comboBox = new ComboBox();
comboBox.DataBindings.Add(new Binding("DataSource", bindingSource, "Options", true));
comboBox.DropDownStyle = ComboBoxStyle.DropDownList;
Controls.Add(comboBox);
errorProvider.ContainerControl = this;
errorProvider.DataSource = bindingSource;
((System.ComponentModel.ISupportInitialize) bindingSource).EndInit();
((System.ComponentModel.ISupportInitialize) errorProvider).EndInit();
ResumeLayout(false);
}
}
问题似乎与数据绑定有关。如果我注释掉comboBox.DataBindings.Add(new Binding("DataSource", bindingSource, "Options", true));这一行,则不会发生异常。
我在网上找到了许多对这个异常的引用,但似乎在所有这些情况下,问题在于数据源不是IList(如异常消息所述)。然而,在这种情况下,Options 是 IList。所以我无法解释这个异常。
我注意到如果我删除ErrorProvider,不会发生异常。但我不知道为什么会这样;我需要在我的实际程序中提供错误提供程序。
我在 Visual Studio 2015 中工作,目标是 .NET 4.6。
【问题讨论】:
-
数据绑定到
DataSource?!
标签: c# .net winforms data-binding bindingsource