C# 最初将ComboBox绑定到包含0项的数据源,后来添加的项会导致ArgumentOutOfRangeException

C# 最初将ComboBox绑定到包含0项的数据源,后来添加的项会导致ArgumentOutOfRangeException,c#,winforms,binding,combobox,C#,Winforms,Binding,Combobox,更新 看来这可能是另外一回事。存在绑定到列表框的帐户的绑定列表。当用户选择一个帐户时,他们的账单周期将显示在组合框中(之后,他们可以查看每个周期的账单)。在我尝试将项目添加到绑定到组合框的空列表之前,如果我从加载了预先存在的计费周期的帐户切换到没有计费周期的帐户,然后尝试切换回,则会引发相同的异常。下面的信息是针对这样一个场景,我将切换到一个没有预先存在的计费周期的帐户,并尝试添加一个新的计费周期。如果有帮助的话,我已经添加了一些代码来显示ListBox的绑定 结束更新 我遇到了一个看似简单的问

更新

看来这可能是另外一回事。存在绑定到列表框的帐户的绑定列表。当用户选择一个帐户时,他们的账单周期将显示在组合框中(之后,他们可以查看每个周期的账单)。在我尝试将项目添加到绑定到组合框的空列表之前,如果我从加载了预先存在的计费周期的帐户切换到没有计费周期的帐户,然后尝试切换回,则会引发相同的异常。下面的信息是针对这样一个场景,我将切换到一个没有预先存在的计费周期的帐户,并尝试添加一个新的计费周期。如果有帮助的话,我已经添加了一些代码来显示ListBox的绑定

结束更新

我遇到了一个看似简单的问题,但我不知道如何继续。我有一个
组合框
数据绑定到一个
绑定列表
(由
绑定源
封装),其中包含计费周期对象。对象包含自己的
绑定列表
,这些列表的内容显示在网格中(作为账单)。这样,当用户选择计费周期时,网格将反映该周期的正确账单

以下是绑定代码:

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;
并非所有帐户都有预先存在的计费周期,因此组合框将绑定到空列表。当我选择在稍后通过
Periods.add(period)
向这些空列表中添加计费周期时,我会得到以下异常:

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

Additional information: InvalidArgument=Value of '0' is not valid for 'SelectedIndex'.
因此,我在web上进行了一些搜索,发现通过向组合框的数据源添加一个项目,即使该项目为空,也会触发SelectedIndexChanged事件,但是当该项目为空时,SelectedIndex“0”无效,因为该索引引用了第一个项目(考虑到异常文本,这是有意义的)

我的问题是:我想保持我的绑定行为,以保持ComboBox项更改显示的账单。我想不出一种方法来实现这一点,或者还没有找到一种方法,它不会在一个初始为空的数据源上绊倒。理想情况下,我将采用的行为是组合框不绑定,除非其底层数据源为非空(以避免此错误)

  • 在添加我的项之前,我尝试挂起绑定源的绑定,然后继续,但这不起作用
  • 我尝试在添加前禁用组合框,在添加后启用组合框,但没有效果
  • 我尝试在添加之前删除所有现有绑定,然后重新添加它们,但也失败了。最后一个我真的搞不清楚,因为这实际上是在第一次设置绑定时模拟应用程序的“加载”

我唯一能想到的另一件事是在没有绑定的情况下手动管理ComboBox和数据网格,但这将是一件非常痛苦的事情。没有别的办法吗?一定有

让朋友看了代码后,我们在不同的机器上尝试了相同的代码。它运行良好,没有任何变化。我们在原始机器上尝试了一系列“修复”,最后它使用了一些黑客修复。。。事实证明,我们根本不需要黑客修复,这是构建文件的缓存问题

记住孩子们,如果你有问题,重建你的项目


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

在让朋友查看代码后,我们在不同的机器上尝试了相同的代码。它运行良好,没有任何变化。我们在原始机器上尝试了一系列“修复”,最后它使用了一些黑客修复。。。事实证明,我们根本不需要黑客修复,这是构建文件的缓存问题

记住孩子们,如果你有问题,重建你的项目


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

我的问题类似,但解决方案不同。我在使用
ComboBox.DataSource
BindingList
时遇到了同样的异常,但只有在调试时,异常才真正停止执行。当我刚刚运行应用程序时,没有例外。然后,我在工具>选项>调试>常规中启用了“仅启用我的代码”选项,异常消失。

我的问题类似,但解决方案不同。我在使用
ComboBox.DataSource
BindingList
时遇到了同样的异常,但只有在调试时,异常才真正停止执行。当我刚刚运行应用程序时,没有例外。然后,我在“工具”>“选项”>“调试”>“常规”中启用了“仅启用我的代码”选项,异常已消失。

您是否尝试过在添加项目时让组合框取消订阅selectionindexchanged事件,然后在之后重新订阅?很难回答此类问题或帮助查找问题。最好发布一个非常简单的代码来重现这个问题:)@Tofystedeth我自己没有订阅
SelectedIndexChanged
事件,它是由
组合框
类隐式处理的。我还检查了设计器代码,没有看到VisualStudio订阅了事件处理程序。我知道取消订阅的唯一方法如下:
combobox.SelectedIndexChanged-=eventHandler
但是
eventHandler
尚未订阅,因此我不确定它是否有效@RezaAghaei我会做点什么。我本打算上下发誓我以前没有订阅隐式处理程序,但我找不到这样做的例子,所以评论被收回了。@RezaAghaei我认为我的代码肯定有问题,因为在我做的复制测试项目中,没有问题。所有绑定都以相同的方式进行(从以前的绑定源构建新的绑定源)