将ComboBox绑定到最初包含0个项目的数据源,稍后添加的项目会导致ArgumentOutOfRangeException

时间:2016-04-07 21:01:41

标签: c# winforms binding combobox

更新

看来这可能是其他的东西。有一个绑定到ListBox的帐户的BindingList。当用户选择一个帐户时,他们的结算周期显示在ComboBox中(之后他们可以查看每个期间的帐单)。在我甚至尝试将项目添加到绑定到ComboBox的空列表之前,如果我从已加载预先存在的结算周期的帐户切换到没有结算周期的帐户,然后尝试切换回来,则会出现相同的异常被扔了。以下信息适用于我将切换到没有预先存在的结算周期的帐户并尝试添加新帐户的情况。我已经添加了一些代码来显示ListBox的绑定,如果有帮助的话。

END UPDATE

我遇到了似乎是一个简单的问题,但我无法弄清楚如何继续。我有ComboBox数据绑定到BindingList(由BindingSource封装),包含结算周期对象。对象包含自己的BindingLists,这些列表的内容显示在网格中(作为账单)。这样,当用户选择结算周期时,网格会反映该期间的正确账单。

这是绑定代码:

BindingSource bs = new BindingSource(Controller, "Accounts");
listAccounts.DataSource = bs;
listAccounts.DisplayMember = "Name";

BindingSource source = new BindingSource(bs, "Periods");
comboPeriod.DataSource = source;
comboPeriod.DisplayMember = "DisplayPeriod";

BindingSource src = new BindingSource(source, "Bills");
gridPaymentSchedule.DataSource = src;

并非所有帐户都有预先存在的结算周期,因此ComboBox将绑定到空列表。当我选择通过Periods.Add(period)稍后向这些空列表添加结算周期时,我会遇到以下异常:

Exception thrown: 'System.ArgumentOutOfRangeException' in System.Windows.Forms.dll

Additional information: InvalidArgument=Value of '0' is not valid for 'SelectedIndex'.

所以我在网上做了一些搜索,我发现通过向ComboBox的数据源添加一个项,即使它是空的,它也会触发SelectedIndexChanged事件,但是当它为空时,SelectedIndex为'0'是无效,因为该索引引用了第一个项目(考虑到异常文本,这是有道理的。)

我的问题是:我想保持我的绑定行为以维护ComboBox项目更改显示的账单。我想不出这样做的方法,或者没有想到一个不会跳过初始空数据源的地方。理想情况下,我要做的是ComboBox不绑定,除非它的底层数据源是非空的(以避免此错误)。

  • 我尝试在添加项目之前暂停绑定源的绑定,然后重新启动,但这不起作用。
  • 我尝试在添加之前禁用ComboBox,并在添加之后启用,但无济于事。
  • 我尝试在添加之前删除所有现有绑定,然后重新添加它们,但这也失败了。最后一个我真的无法弄清楚,因为这实际上是在第一次设置绑定时第一次模拟应用程序的“加载”。

我唯一能想到的是手动管理ComboBox和数据网格而不进行绑定,但这将是一个很大的痛苦。没有其他办法吗?必须有!

2 个答案:

答案 0 :(得分:1)

我的问题很相似,但解决方案却有所不同。我得到了同样的异常,ComboBox.DataSourceBindingList,但只有在调试时,异常并没有真正停止执行。当我刚运行应用程序时,没有例外。然后,我在工具>中启用了"启用我的代码" 选项选项>调试>一般和例外都没有了。

答案 1 :(得分:0)

让朋友看一下代码之后,我们在不同的机器上尝试了相同的代码库。它工作正常,没有任何变化。我们尝试了一堆修复"在原始机器上,最后它使用了一些hacky修复...结果我们根本不需要hacky修复,这是构建文件的缓存问题。

记住孩子,如果您遇到问题,请重新启动您的项目。

所以,要注意:根本没有问题,我的构建文件已经过时并导致错误的行为。