2013-01-01 5 views
8

Ho il controllo ComboBox (progetto WinForm).Come impedire l'evento selezionatoindexchanged quando DataSource è associato?

Quando collego DataSource al controllo ComboBox viene attivato l'evento combobox_selectedindexchanged.

Qualche idea su come impedire l'evento selezionatoindexchange quando DataSource è associato?

+1

Potresti impostare un flag, impostare il DataSource, e disinserire la bandiera? Quindi nel gestore di eventi è possibile vedere che la bandiera è impostata e semplicemente non agire su di essa. – prprcupofcoffee

+1

WinForms o WPF? – Paparazzi

+0

ho utilizzato i pannelli di aggiornamento – sajanyamaha

risposta

28

Rimuovere il gestore per l'evento SelectedIndex_Changed, associare i dati, quindi aggiungere il gestore indietro. Di seguito è riportato un semplice esempio di come questo potrebbe essere fatto all'interno di un metodo:

private void LoadYourComboBox() 
{ 
    this.comboBox1.SelectedIndexChanged -= new EventHandler(comboBox1_SelectedIndexChanged); 


     // Set your bindings here . . . 


    this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged); 
} 
2

Non pensare di poter fermare l'evento ma non puoi gestirlo.

Scollegare il gestore (i) di eventi, eseguire il binding e quindi collegare il gestore o i gestori di eventi.

9

So che questo è un vecchio post e ha una risposta accettata, ma penso che possiamo usare SelectionChangeCommitted evento come una soluzione per evitare di tiro evento durante il database.

L'evento SelectionChangeCommitted si attiva solo quando gli utenti modificano la selezione nella casella combinata.

c'è un similar question su SO e questa risposta è fornita da @arbiter.

+0

Mentre la risposta accettata ha funzionato come previsto, vorrei leggere prima questo. È molto più semplice da implementare, e molto più semplice da leggere per gli altri in seguito ... Quindi grazie, un post di due anni! – Noceo

+0

Questa dovrebbe essere la risposta corretta secondo me.La risposta di cui sopra funziona ma in un'applicazione in cui si hanno più caselle combinate e origini dati, si può immaginare di dover annullare l'iscrizione e la riscrittura ogni volta che si desidera interferire con l'origine dati? Grazie @shreesha –

0

Ecco un modo semplice. Puoi usare la proprietà Tag di combobox. Può essere vuoto o 0 valore intero quando è vuoto o non è ancora stato soddisfatto. Devi impostare il tag di combobox come conteggio degli oggetti dopo il limite. Nell'evento SelectedValueChanged se la proprietà Tag è nullo o 0, è necessario tornare da void.

Ecco alcuni esempi del mio progetto.

private void cb_SelectedValueChanged(object sender, EventArgs e) 
{ 
    if (!(sender is ComboBox)) return; 
    ComboBox cb = sender as ComboBox; 
    if (DataUtils.ToInt(cb.Tag, 0) == 0) return; 
    if (cbSmk.SelectedValue == null) return; 
    /* Continue working; */ 
} 

public static void ComboboxFill(ComboBox cb, string keyfld, string displayfld, string sql) 
{   
    try 
    { 
     cb.Tag = 0; 
     cb.DataSource = null; 
     cb.Items.Clear(); 

     DataSet ds = DataMgr.GetDsBySql(sql); 
     if (!DataUtils.HasDtWithRecNoErr(ds)) 
     {      
      cb.Text = "No data"; 
     } 
     else 
     { 
      cb.DataSource = ds.Tables[0]; 
      cb.DisplayMember = displayfld; 
      cb.ValueMember = keyfld; 
     } 
     cb.Tag = cb.Items.Count; 
    } 
    catch (Exception ex) 
    { 
     Int32 len = ex.Message.Length > 200 ? 200 : ex.Message.Length; 
     cb.Text = ex.Message.Substring(0, len); 
    }     
} 

CmpHelper.ComboboxFill(cbUser, "USER_ID", "USER_NAME", "SELECT * FROM SP_USER WHERE 1=1 ORDER by 1",-1); 
Problemi correlati