2012-09-27 5 views
6

Ich habe ein Erfassungsformular für einen Works Order, und es hat eine CustomerBindingSource und eine WorksOrderBindingSource Kontrolle. Die meisten Bearbeitungsfelder sind an die WorksOrderBindingSource gebunden, mit einer ComboBox, deren Liste an die CustomerBindingSource gebunden ist, und ihre SelectedValue ist an das CustomerId Feld in der WorksOrderBindingSource gebunden. Das ist alles sehr Routine und Standard, keine Funnies hier.Wie kann ich einen aktuellen BindingSource-Datensatz auf null setzen?

Dann habe ich auch einige Textfelder, in denen ich die Eigenschaften des aktuell ausgewählten Kunden für den aktuell bearbeiteten Werkauftrag anzeigen kann. Ich habe diese Felder auch an die CustomerBindingSource gebunden. Wenn ein Kunde ausgewählt ist, zeigen diese Felder die Eigenschaften dieses Kunden erwartungsgemäß an.

Mein Problem ist, wenn ich das Formular verwenden möchte, um einen neuen Werksauftrag zu erfassen. Ich instanziiere ein neues WorksOrder Objekt mit CustomerId == null und binde es an die WorksOrderBindingSource. Ich habe kein Objekt in der CustomerBindingSource mit einer Id == null, so wie erwartet, ist die Dropdown-Combobox leer, aber die CustomerBindingSource.Current Eigenschaft verweist auf das erste Customer-Objekt in dieser Datenquelle. Die kundengebundenen Anzeigefelder zeigen Werte für diesen Kunden an, während noch kein Kunde ausgewählt wurde.

Die einzige Workaround für das, die für mich offensichtlich ist, scheint ungeschickt. Darin habe ich zwei vom Kunden eingegebene Bindungsquellen, eine für einen ausgewählten Kunden, und um die Kundenanzeigefelder zu füllen, und eine andere, um nur das Kunden-Dropdown zu füllen. Dann muss ich ein Auswahlereignis behandeln, und nur wenn ein Kunde ausgewählt ist, dann finde ich diesen Kunden in der Bindungsquelle für die Anzeigefelder, und wenn keine ausgewählt ist, setze die Datenquelle für die Anzeigefelder auf Null. Das fühlt sich schrecklich ungeschickt an. Gibt es einen anderen Weg, um zu erreichen, was ich will?

+0

Warum nicht einen "bitte-wählen-einen-Kunden" -Eintrag zur Bindungsquelle hinzufügen? – Bijan

+0

Sie müssen den Benutzer zwingen, die aktuellen Änderungen zu speichern, damit Ihrem NewRow eine gültige CustomerID zugewiesen wird. –

Antwort

1

ich dieses Thema gefunden mit genau meinem Problem aber ohne befriedigende Antwort. Ich weiß, es ist ein altes Thema, aber Alah ..

Ich endete mit einer funktionierenden Lösung: Ich fügte ein Ereignis [PositionChanged] zu meiner Bindungsquelle (wäre Ihre CustomerBindingSource).

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

Was ich nutzen, um „klar“ ein Binding ist einfach seine Datasource wie folgt festgelegt:

CustomerBindingSource.DataSource = typeof (Kunde);

Hoffe, das hilft.

EDIT:

Aus Gründen der Klarheit, wenn Sie die BindingSource.DataSource Eigenschaft, wie beschrieben, gibt es nichts zu verhindern Sie die ursprüngliche Datenquelle zu einem späteren Zeitpunkt neu zuzuordnen:

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

Ich möchte die Bindungsquelle nicht löschen. Ich möchte, dass es bekannt ist, dass kein Eintrag in der Bindungsquelle ausgewählt oder "aktiv" ist. – ProfK

+0

Ich dachte, du meintest, wenn du einen neuen WorkOrder erstellst, möchtest du die Felder, die sich auf den Kunden beziehen, "leer" machen. Wenn ja, dann wird meine Methode funktionieren, aber wenn ich Ihren Anwendungsfall falsch verstehe, könnten Sie das klären? –

+1

Ich möchte die Felder mit Bezug auf den Kunden ausblenden, aber ich möchte nicht die Kundendatensätze in der CustomerBindingSource.DataSource verlieren. Ich möchte nur keinen dieser Datensätze ausgewählt haben. – ProfK