我有一个工作订单的捕获表单,它有一个CustomerBindingSource
和一个WorksOrderBindingSource
控件。大多数编辑字段都绑定到WorksOrderBindingSource
,其中一个ComboBox的列表绑定到CustomerBindingSource
,其SelectedValue
绑定到CustomerId
中的WorksOrderBindingSource
字段}}。这是非常常规和标准的,没有任何好玩的东西。
然后,我还有一些文本框字段,我用它来显示当前所选客户的属性,用于当前编辑的工单。我也将这些字段绑定到CustomerBindingSource
。选择客户后,这些字段会按预期显示该客户的属性。
我的问题是当我想使用表单捕获新的工作订单时。我使用WorksOrder
实例化一个新的CustomerId == null
对象,并将其绑定到WorksOrderBindingSource
。我在CustomerBindingSource
中没有Id == null
的对象,因此,正如预期的那样,下拉组合框是空白的,但CustomerBindingSource.Current
属性指向该数据源中的第一个Customer对象。客户链接的显示字段显示该客户的值,而尚未选择任何客户。
这对我来说唯一明显的解决方法似乎很笨拙。在其中,我有两个客户类型的绑定源,一个用于选定的客户,并填充客户显示字段,另一个仅用于填充客户下拉列表。然后,我必须处理选择事件,并且仅当选择了客户时,才在显示字段的绑定源中找到该客户,如果没有选择,则将显示字段的数据源设置为null。这感觉非常笨拙。有没有其他方法可以达到我的目的?
答案 0 :(得分:1)
我发现这个主题的确是我的问题,但没有令人满意的答案。我知道这是一个古老的话题,但阿拉...
我最终找到了一个有效的解决方案:我在我的bindingsource中添加了一个[PositionChanged]事件(将是你的CustomerBindingSource)。
private void CustomerBindingSource_PositionChanged(object sender, EventArgs e)
{
if(<yourCombobox>.SelectedIndex==-1)
{
CustomerBindingSource.SuspendBinding();
}
else
{
CustomerBindingSource.ResumeBinding();
}
}
答案 1 :(得分:0)
我用来“清除”BindingSource的方法就是简单地设置它的DataSource:
CustomerBindingSource.DataSource = typeof(Customer);
希望这有帮助。
编辑:
为清楚起见,当您按照描述设置BindingSource.DataSource属性时,没有什么可以阻止您稍后重新分配原始数据源:
//Retrieve customers from database
List<Customer> Customers = WhatEverCallToDB();
CustomerBindingSource.DataSource = Customers;
...
//Later we need to blank the Customer fields on the Windows Form
CustomerBindingSource.DataSource = typeof(Customer);
...
//Then again at a later point we can restore the BindingSource:
CustomerBindingSource.DataSource = Customers;
...