2009-03-03 13 views
7

Ho un controllo personalizzato (Windows Form) che è una casella di testo di ricerca. Una proprietà sul controllo è Selezione corrente, che è un oggetto personalizzato contenente "Identificatore", "Codice" e "Descrizione". Questa proprietà è Databound utilizzando una BindingSource.Associazione di un controllo personalizzato

Visualizzazione delle informazioni funziona alla grande. D'altra parte, indipendentemente dal fatto che imposto l'aggiornamento su OnValidate o OnValueChange, non aggiorna mai BindingSource. C'è qualcosa che mi manca per ottenere questo per l'aggiornamento automatico?

private System.Windows.Forms.BindingSource buildPlanComponentDataBindingSource; 

    public void LoadBuildPlan(string itemNumber) 
    { 
     var buildPlanComponents = BuildPlan.LoadBuildPlanComponents(itemNumber, AutomaticPrice); 
     buildPlanComponentDataBindingSource.DataSource = buildPlanComponents; 
     AssemblyNumber = itemNumber; 
    } 




[Bindable(true)] 
[DefaultValue(null)] 
public ILookupSelection CurrentSelection 
{ 
    get 
    { 
     if (currentSelection == null) 
      currentSelection = new LookupSelection {Code = txtLookup.Text}; 

     return currentSelection; 
    } 

    set 
    { 
     if (value == null) return; 

     currentSelection = value; 

     SetText(currentSelection, DisplayText); 
     SetDescription(currentSelection, DisplayDescription); 
    } 
} 
+0

Potrebbe mostrarci il codice in cui si crea l'associazione dati? – overslacked

+0

Grazie, la tua domanda è stata molto utile. Per qualche motivo, il tutorial MSDN ha omesso l'attributo [Bindable (true)] dal suo tutorial. Questo è un dettaglio importante! –

risposta

2

L'implementazione di InotifyPropertyChanged sembra essere la soluzione!

#region IPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
    } 

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (null != PropertyChanged) 
     { 
      PropertyChanged(this, e); 
     } 
    } 

    #endregion 
+0

IPropertyChanged dovrebbe leggere INotifyPropertyChanged. Ho copiato il codice e mi sono lasciato ingannare da questo dettaglio durante la definizione dell'ereditarietà. Altrimenti è fantastico, +1 – Marcel

0

Visualizzazione delle informazioni funziona grande. D'altra parte indipendentemente da se imposto l'aggiornamento su OnValidate o OnValueChange, non aggiorna mai l'origine Binding .

Guardando il tuo codice in realtà non ne sono sicuro. Nel tuo set, esegui il test per null e abbandona; se i dati contengono effettivamente null (che è ciò che stai descrivendo) il tuo controllo sarà fuori sincrono. Mi chiedo se forse quel controllo stia mascherando il problema sottostante.

+0

L'unica volta che è realmente NULL è quando il controllo viene inizialmente creato. Altrimenti questo verrà impostato solo quando viene effettuata una selezione che contiene un valore. – ejmack

+0

In questo caso, si consiglia di utilizzare un flag diverso per testare, diverso dal valore == null. Databinding per le proprietà è un processo avanti e indietro ... in ogni caso, vorrei pulire questo bit, ma non sono nemmeno positivo, ma alla fine aiuterà il tuo problema. – overslacked

0

Forse è necessario provocare il DataBinding per scrivere il suo valore per ogni controllo il cui valore si sta impostando in questo modo?

Supponendo vincolante per una casella di testo di nome txtMySetValue uno dei dati:

txtMySetValue.DataBindings [0] .WriteValue();

Problemi correlati