2009-06-29 1 views
5

Uso l'associazione dati per visualizzare i valori nelle caselle di testo in un client Windows Form C#. Quando l'utente fa clic su Salva, mantengo le mie modifiche al database. Tuttavia, il nuovo valore nell'editor attivo viene ignorato (il valore precedente viene salvato). Se esco dall'editor attivo, quindi Salva, il nuovo valore viene mantenuto come previsto.Il controllo Windows Form di Databound non riconosce il cambiamento fino a perdere lo stato attivo

C'è un modo per forzare il controllo attivo ad accettarne il valore prima di persistere?

risposta

5

Se è possibile ottenere l'istanza Binding corrispondente all'ingresso (TextBox), è possibile chiamare WriteValue method per forzare il valore dal controllo all'oggetto a cui è associato.

Inoltre, è possibile chiamare il EndCurrentEdit method sul BindingManagerBase class (di solito un esempio CurrencyManager class) per terminare la modifica, ma che richiede l'attuazione della ICancelAddNew o IEditableObject interfaccia per l'oggetto che è destinato a (e non si richiederebbe a pesce per il legame).

+0

Brillante, questo ha risolto il mio problema, grazie. –

2

Questo è un po 'un trucco, ma prova a mettere a fuoco l'oggetto dall'editor attivo (impostando lo stato attivo su qualcos'altro, come ad esempio il pulsante di salvataggio) nell'evento button prima di chiamare save.

3

La soluzione che ho utilizzato è chiamare ValidateChildren sul modulo dall'evento Salva (chiamata), prima di salvare effettivamente i record del database. Ciò impone la convalida di tutti i campi e quindi l'associazione si verifica senza perdere il focus del controllo attualmente modificato nel modulo. È molto utile se il pulsante Salva si trova nel sistema di menu di Windows e non si forma da solo, in più restituisce False se i dati in qualsiasi controllo del modulo non sono validi e quindi possono essere utilizzati per impedire il salvataggio di dati errati.

Ciò comporta anche l'aggiornamento incoerente del campo associato che si verifica quando OnPropertyChanged viene utilizzato come metodo di associazione anziché OnValidation. Inoltre, è fondamentale se il metodo di associazione è impostato su Mai con chiamate WriteValue separate eseguite per ogni evento convalidato intrappolato per controllo.