2012-09-27 10 views
6

Mam formularz przechwytywania dla zamówienia na roboty i ma on kontrolkę CustomerBindingSource i WorksOrderBindingSource. Większość pól edycji jest związanych z WorksOrderBindingSource, z ComboBox, którego lista jest powiązana z CustomerBindingSource, a jej SelectedValue jest związana z polem CustomerId w WorksOrderBindingSource. Wszystko to jest bardzo rutynowe i standardowe, nie ma tu nic zabawnego.Jak ustawić bieżący rekord źródła BindingSource na wartość null?

Następnie mam również pola pól tekstowych, w których używam do pokazania właściwości aktualnie wybranego klienta, dla aktualnie edytowanych zleceń robót. Powiązałem te pola również z CustomerBindingSource. Po wybraniu klienta te pola pokazują właściwości tego klienta zgodnie z oczekiwaniami.

Mój problem polega na tym, że chcę użyć formularza do przechwycenia nowego zamówienia na roboty. Wywołuję nowy obiekt WorksOrder, z CustomerId == null i wiążę go z WorksOrderBindingSource. Nie mam obiektu w CustomerBindingSource z Id == null, więc, zgodnie z oczekiwaniami, rozwijana lista rozwijana jest pusta, ale właściwość CustomerBindingSource.Current wskazuje na pierwszy obiekt klienta w tym źródle danych. Połączone przez klienta pola wyświetlania pokazują wartości dla tego klienta, podczas gdy żaden klient nie został jeszcze wybrany.

Jedyne obejście tego problemu wydaje mi się nieporęczne. Mam w nim dwa wiążące typowane przez klienta źródła, jeden dla wybranego klienta i zapełnić pola wyświetlania klienta, a drugi tylko dla zapełnienia listy odbiorców. Następnie muszę obsłużyć zdarzenie selekcji i tylko wtedy, gdy wybrany jest klient, znajdź go w źródle powiązania dla pól wyświetlania, a jeśli nie jest on wybrany, ustaw źródło danych dla pól wyświetlania na wartość null. To strasznie niezdarne. Czy istnieje inny sposób osiągnięcia tego, czego chcę?

+0

Dlaczego nie dodać elementu "proszę wybrać klient" do źródła wiążącego? – Bijan

+0

Co zmusić użytkownika do zapisania bieżących zmian, aby prawidłowy identyfikator klienta został przypisany do urządzenia NewRow –

Odpowiedz

1

znalazłem ten temat z dokładnie moim problemem, ale bez satysfakcjonującej odpowiedzi. Wiem, że jest to stary temat, ale ..

Skończyłem z działającym rozwiązaniem: Dodałem zdarzenie [PositionChanged] do mojego źródła powiązań (może to być Twój CustomerBindingSource).

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

Co mogę używać do "clear" BindingSource jest po prostu ustawić jego DataSource tak:

CustomerBindingSource.DataSource = typeof (Customer);

Mam nadzieję, że to pomoże.

EDIT:

Dla jasności, gdy ustawić właściwość BindingSource.DataSource jak opisano, nie ma nic do zapobiegania przeniesieniu oryginalnego źródła danych w późniejszym punkcie:

//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; 

... 
+1

Nie chcę usuwać źródła powiązania. Chcę, aby było wiadomo, że nikt nie rejestruje w źródle wiążącym, lub jest "aktywny". – ProfK

+0

Pomyślałem, że masz na myśli to, że kiedy tworzysz nowy WorkOrder, chcesz "wyczyścić" pola związane z Klientem. Jeśli tak, to moja metoda zadziała, ale jeśli źle zrozumiem twój przypadek użycia, czy mógłbyś to wyjaśnić? –

+1

Chcę, aby puste pola związane z klientem, ale nie chcę stracić zestawu rekordów klienta w 'CustomerBindingSource.DataSource'. Chcę tylko, żeby żaden z tych rekordów nie został wybrany. – ProfK

Powiązane problemy