Как я могу установить для текущей записи BindingSource значение null?

У меня есть форма захвата для заказа на выполнение работ, и в ней есть элементы управления CustomerBindingSource и WorksOrderBindingSource. Большинство полей редактирования привязаны к WorksOrderBindingSource, а ComboBox, список которого привязан к CustomerBindingSource, а его SelectedValue привязан к полю CustomerId в WorksOrderBindingSource. Это все очень рутинно и стандартно, тут не до приколов.

Затем у меня также есть несколько полей текстового поля, в которых я использую для отображения свойств выбранного в данный момент клиента для текущего редактируемого заказа на работу. Я также привязал эти поля к CustomerBindingSource. Когда клиент выбран, в этих полях отображаются свойства этого клиента, как и ожидалось.

Моя проблема заключается в том, что я хочу использовать форму для записи нового заказа на работу. Я создаю новый объект WorksOrder с CustomerId == null и привязываю его к WorksOrderBindingSource. У меня нет объекта в CustomerBindingSource с Id == null, поэтому, как и ожидалось, раскрывающийся список пуст, но свойство CustomerBindingSource.Current указывает на первый объект Customer в этом источнике данных. В полях отображения, связанных с клиентом, отображаются значения для этого клиента, хотя ни один клиент еще не выбран.

Единственный обходной путь для этого, который мне кажется, кажется неуклюжим. В нем у меня есть два источника привязки, типизированные клиентом, один для выбранного клиента и для заполнения полей отображения клиента, а другой просто для заполнения раскрывающегося списка клиента. Затем я должен обработать событие выбора, и только если клиент выбран, затем найти этого клиента в источнике привязки для полей отображения, и если ни один из них не выбран, установить источник данных для полей отображения равным нулю. Это ужасно неуклюже. Есть ли другой способ добиться того, чего я хочу?


person ProfK    schedule 27.09.2012    source источник
comment
Почему бы не добавить элемент «Пожалуйста, выберите клиента» в источник привязки?   -  person Bizhan    schedule 12.10.2012
comment
Как насчет того, чтобы заставить пользователя сохранять текущие изменения, чтобы вашему NewRow был назначен действительный идентификатор клиента?   -  person Mohsen Afshin    schedule 12.10.2012


Ответы (2)


Я нашел эту тему именно с моей проблемой, но без удовлетворительного ответа. Я знаю, что это старая тема, но ах..

В итоге я получил рабочее решение: я добавил событие [PositionChanged] в свой источник привязки (будет вашим CustomerBindingSource).

        private void CustomerBindingSource_PositionChanged(object sender, EventArgs e)
    {
        if(<yourCombobox>.SelectedIndex==-1)
        {
            CustomerBindingSource.SuspendBinding();
        }
        else
        {
            CustomerBindingSource.ResumeBinding();
        }
    }
person Remco Spek    schedule 29.11.2017

То, что я использую для «очистки» 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;

...
person Luc Morin    schedule 14.10.2012
comment
Я не хочу очищать источник привязки. Я хочу, чтобы было известно, что ни одна запись в источнике привязки не выбрана или «активна». - person ProfK; 14.10.2012
comment
Я думал, вы имели в виду, что когда вы создаете новый заказ на работу, вы хотите очистить поля, связанные с клиентом. Если да, то мой метод будет работать, но если я неправильно понимаю ваш вариант использования, не могли бы вы пояснить? - person Luc Morin; 15.10.2012
comment
Я хочу очистить поля, относящиеся к покупателю, но не хочу потерять набор записей о покупателе в файле CustomerBindingSource.DataSource. Я просто хочу, чтобы ни одна из этих записей не была выбрана. - person ProfK; 15.10.2012
comment
Хорошо, ну, в вашем коде у вас уже должна быть ссылка на ваш объект данных, тот, который содержит записи клиентов, такие как DataTable или что-то еще. Итак, с описанной мной техникой вы не потеряете эту ссылку. Вы по-прежнему можете переназначить CustomerBindingSource.DataSource = MyCustomerDataObject позже. - person Luc Morin; 16.10.2012
comment
Когда мне установить DataSource = typeof(Customer)? Когда нужно очистить выбор, я добавляю новый WorksOrder, но тогда пользователю нужно иметь клиентов для выбора. - person ProfK; 16.10.2012
comment
Понимаю. Я думаю, я не понял ваш рабочий процесс должным образом, или я сосредоточился только на очистке полей формы. Использование двух источников BindingSource является опцией. Другой вариант — просто создать новый WorkOrder для текущего выбранного Заказчика по умолчанию, позволяя при необходимости изменить его. Другим вариантом может быть использование фиктивного клиента с пустыми полями при создании заказа на работу. Есть несколько способов содрать шкуру с кошки :-) - person Luc Morin; 17.10.2012