2012-09-27 11 views
6

Ho un modulo di acquisizione per un ordine di lavoro e ha un controllo CustomerBindingSource e un WorksOrderBindingSource. La maggior parte dei campi di modifica è associata allo WorksOrderBindingSource, con un ComboBox il cui elenco è associato allo CustomerBindingSource e il suo SelectedValue è associato al campo CustomerId nello WorksOrderBindingSource. Questo è tutto molto di routine e standard, nessun divertimento qui.Come posso impostare un record corrente di BindingSource su null?

Quindi, ho anche alcuni campi di testo in cui uso per mostrare le proprietà del cliente attualmente selezionato, per l'ordine di lavoro attualmente modificato. Ho associato questi campi anche allo CustomerBindingSource. Quando un cliente è selezionato, questi campi mostrano le proprietà di quel cliente come previsto.

Il mio problema è quando voglio utilizzare il modulo per acquisire un nuovo ordine di lavoro. Istanziare un nuovo oggetto WorksOrder, con CustomerId == null e associarlo allo WorksOrderBindingSource. Non ho alcun oggetto nel CustomerBindingSource con un Id == null, quindi, come previsto, la casella combinata a discesa è vuota, ma la proprietà CustomerBindingSource.Current punta al primo oggetto Cliente in quell'origine dati. I campi di visualizzazione collegati al cliente mostrano i valori per quel cliente, mentre nessun cliente è stato ancora selezionato.

L'unica soluzione per questo che mi sembra evidente è maldestra. In esso, ho due origini di associazione tipizzate dal cliente, una per un cliente selezionato e per popolare i campi di visualizzazione del cliente e un'altra semplicemente per popolare il menu a discesa del cliente. Quindi, devo gestire un evento di selezione e solo se viene selezionato un cliente, quindi trovare quel cliente nell'origine di associazione per i campi di visualizzazione e, se nessuno selezionato, impostare l'origine dati per i campi di visualizzazione su null. Questo sembra terribilmente goffo. C'è un altro modo per ottenere ciò che voglio?

+0

Perché non aggiungere un elemento "please-select-a-customer" alla sorgente di binding? – Bijan

+0

Cosa fare per forzare l'utente a salvare le modifiche correnti in modo che un CustomerID valido sia assegnato a NewRow –

risposta

1

ho trovato questo argomento con esattamente il mio problema ma senza una risposta soddisfacente. So che è un vecchio argomento ma alah ..

Alla fine ho trovato una soluzione funzionante: ho aggiunto un evento [PositionChanged] alla mia bindingsource (sarebbe la tua CustomerBindingSource).

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

Quello che uso per "clear" un BindingSource è quello di impostare semplicemente il suo DataSource in questo modo:

CustomerBindingSource.DataSource = typeof (Cliente);

Spero che questo aiuti.

EDIT:

Per chiarezza, quando si imposta la proprietà BindingSource.DataSource come descritto, non c'è nulla impedisce di riassegnare dati originale in un momento successivo:

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

Non voglio cancellare l'origine di associazione. Voglio che sia noto che nessun record nella sorgente di associazione è selezionato o 'attivo'. – ProfK

+0

Pensavo volessi dire che quando crei un nuovo WorkOrder, vuoi "oscurare" i campi relativi al Cliente. Se è così, allora il mio metodo funzionerà, ma se fraintendessi il tuo caso d'uso, potresti chiarire? –

+1

Voglio escludere i campi relativi al cliente, ma non voglio perdere l'insieme dei record dei clienti in 'CustomerBindingSource.DataSource'. Voglio solo nessuno di quei record selezionati. – ProfK