7

我有一个工单的捕获表格,它有一个CustomerBindingSource和一个WorksOrderBindingSource控件。大多数编辑字段都绑定到WorksOrderBindingSource,其中一个组合框的列表绑定到CustomerBindingSource,并且它SelectedValue绑定到 中的CustomerId字段WorksOrderBindingSource。这都是非常常规和标准的,这里没有可笑的。

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

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

对我来说显而易见的唯一解决方法似乎很笨拙。在其中,我有两个客户类型的绑定源,一个用于选定的客户,用于填充客户显示字段,另一个仅用于填充客户下拉列表。然后,我必须处理选择事件,只有选择客户,然后在显示字段的绑定源中找到该客户,如果未选择,则将显示字段的数据源设置为NULL。这感觉非常笨拙。还有其他方法可以实现我想要的吗?

4

2 回答 2

2

我发现这个话题正是我的问题,但没有令人满意的答案。我知道这是一个老话题,但是啊..

我最终得到了一个可行的解决方案:我向绑定源添加了一个 [PositionChanged] 事件(将是您的 CustomerBindingSource)。

        private void CustomerBindingSource_PositionChanged(object sender, EventArgs e)
    {
        if(<yourCombobox>.SelectedIndex==-1)
        {
            CustomerBindingSource.SuspendBinding();
        }
        else
        {
            CustomerBindingSource.ResumeBinding();
        }
    }
于 2017-11-29T11:54:48.550 回答
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;

...
于 2012-10-14T04:35:19.567 回答