2010-07-16 3 views
64

Ho un modulo con un ComboBox che fornisce un elenco a discesa. Su comboBox SelectedIndexChanged event, sto eseguendo del codice, ma non voglio che quel codice venga eseguito quando il modulo viene caricato. Sfortunatamente, quando carico il modulo (prima di effettuare una selezione nella casella combinata), viene attivato SelectedIndexChanged della combobox (penso che quando la casella combinata sia databinding). C'è un modo per evitare questo comportamento?Interrompe l'evento selezionatoIndexChanged di comboBox dall'attivazione quando il modulo carica

+0

Non sono sicuro circa sul desktop, ma in .NET Compact, questo evento in realtà sembra al fuoco prima di l'evento Form_Load, che è davvero problematico - nulla sul modulo è ancora impostato quando questo codice viene colpito. Su CF, la soluzione è sfortunatamente una variabile di modulo che viene impostata alla fine di Load, e quindi il gestore di eventi controlla questa variabile prima che si attivi. – SqlRyan

risposta

120

Se si vuole reagire solo quando l'utente cambia l'elemento selezionato nella casella combinata, allora è meglio sottoscrivere SelectionChangeCommitted.

+6

Ma cosa fare in caso di completamento automatico? –

+0

@ Arijit Mukherjee a destra. Quando si digita un valore nella casella di testo anziché selezionare direttamente. Non attiverà l'evento SelectionChangeCommitted – thoitbk

+0

Dannazione, ho cercato sul Web per un po 'di tempo per trovare una soluzione semplice come questa. Ho usato l'evento SelectionChanged e ha funzionato in VB.Net - WPF e ora lo utilizzo su C# - WinForms e non funziona o forse sono solo io. Grazie! – Stephan

10

È possibile semplicemente annullare l'evento SelectedIndexChanged, chiamare la funzione fill e associare nuovamente l'evento SelectedIndexChanged. Sfortunatamente, questo non funziona con una griglia.

Ad esempio:

5

Perché non si dispone di un contrassegno boolean che indica quando il proprio Form ha terminato il caricamento?

Nel tuo evento SelectionChanged, verificare se il flag boolean è true. Se è true, gestisci l'evento, altrimenti ignoralo.

+2

booooooolean .. SelectionChangeCommitted molto più bello – ppumkin

+2

C'è già un flag booleano 'Control.Created' che ti dice che il modulo ha completato il caricamento, che è valido anche per i moduli. – user1734987

+0

La variazione 'ToolStripComboBox' non ha un evento' SelectionChangeCommitted'. Quindi, questo metodo dovrà fare. Oppure, per prevenire condizioni di gara, usa 'lock' e' Monitor.TryEnter'. – spoulson

5

assicurarsi di impostare la proprietà DataSource nella funzione onload() dopo aver assegnato le proprietà ValueMember e Datamember.

Questo ti aiuterà a risolvere il tuo problema!

+1

Si prega di aggiungere ulteriori informazioni che elabora il tuo pensiero. – Lenin

+0

@Ranjith: puoi elaborare? –

1

VB

RemoveHandler lbxNomes.SelectedIndexChanged, AddressOf lbxNomes_SelectedIndexChanged 
lbxNomes.DataSource = dst 
Label1.Text = String.Format("Encontrados {0} Sócios nesta pesquisa", dst.Rows.Count) 
Label1.Visible = True 
AddHandler lbxNomes.SelectedIndexChanged, AddressOf lbxNomes_SelectedIndexChanged 
-1

Ha funzionato per me in un modo con il seguente codice:

private void ddlChapter_SelectionChangeCommitted(object sender, EventArgs e) 
    { 
     if (ddlChapter.SelectedValue != null) 
     { 
      // Do something here 
     } 
    } 
+0

SelectionChangeCommitted si interromperà per chiamare gli elementi di cambio indice, una volta che tutti gli elementi caricati in una casella personale possono essere selezionati solo uno per uno, aumenterà anche la velocità di caricamento. –