如何将BindingSource当前记录设置为null?

时间:2012-09-27 06:28:33

标签: winforms data-binding bindingsource

我有一个工作订单的捕获表单,它有一个CustomerBindingSource和一个WorksOrderBindingSource控件。大多数编辑字段都绑定到WorksOrderBindingSource,其中一个ComboBox的列表绑定到CustomerBindingSource,其SelectedValue绑定到CustomerId中的WorksOrderBindingSource字段}}。这是非常常规和标准的,没有任何好玩的东西。

然后,我还有一些文本框字段,我用它来显示当前所选客户的属性,用于当前编辑的工单。我也将这些字段绑定到CustomerBindingSource。选择客户后,这些字段会按预期显示该客户的属性。

我的问题是当我想使用表单捕获新的工作订单时。我使用WorksOrder实例化一个新的CustomerId == null对象,并将其绑定到WorksOrderBindingSource。我在CustomerBindingSource中没有Id == null的对象,因此,正如预期的那样,下拉组合框是空白的,但CustomerBindingSource.Current属性指向该数据源中的第一个Customer对象。客户链接的显示字段显示该客户的值,而尚未选择任何客户。

这对我来说唯一明显的解决方法似乎很笨拙。在其中,我有两个客户类型的绑定源,一个用于选定的客户,并填充客户显示字段,另一个仅用于填充客户下拉列表。然后,我必须处理选择事件,并且仅当选择了客户时,才在显示字段的绑定源中找到该客户,如果没有选择,则将显示字段的数据源设置为null。这感觉非常笨拙。有没有其他方法可以达到我的目的?

2 个答案:

答案 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;

...