2013-01-01 13 views
8

Mam kontrolę ComboBox (projekt WinForm).Jak zapobiegać wybranemu zdarzeniu zindeksowanym podczas wiązania źródła danych?

Po powiązaniu DataSource z formantem ComboBox zostaje wyzwolone zdarzenie combobox_selectedindexchanged.

Każdy pomysł, jak zapobiec wybranemu zdarzeniu podczas powiązania źródła danych?

+1

można ustawić flagę, ustaw DataSource, i wyłączenie flagę? Następnie w twoim programie obsługi zdarzeń możesz zobaczyć flagę i po prostu nie podejmować na nią żadnych działań. – prprcupofcoffee

+1

WinForms lub WPF? – Paparazzi

+0

Użyj paneli aktualizacji – sajanyamaha

Odpowiedz

28

Usuń program obsługi zdarzenia SelectedIndex_Changed, powiązaj dane, a następnie dodaj program obsługi z powrotem. Poniżej znajduje się prosty przykład jak to może być wykonane w sposób:

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


     // Set your bindings here . . . 


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

Nie myśl, że możesz zatrzymać wydarzenie, ale nie możesz sobie z tym poradzić.

Odłącz program obsługi zdarzeń, połącz, a następnie dołącz moduł obsługi zdarzeń.

9

Wiem, że to stary post i ma ona przyjęta odpowiedź, ale myślę, że możemy użyć SelectionChangeCommitted zdarzenie jako rozwiązanie, aby uniknąć wypalania zdarzeń podczas databind.

SelectionChangeCommitted Zdarzenie uruchamiane jest tylko wtedy, gdy użytkownik zmieni zaznaczenie w combobox.

Istnieje similar question na SO, a ta odpowiedź jest podana przez @arbiter.

+0

Chociaż zaakceptowana odpowiedź działa zgodnie z przeznaczeniem, chciałbym ją najpierw przeczytać. To jest o wiele prostsze w implementacji, a do tego o wiele łatwiejsze do odczytania dla innych ... Więc dziękuję, dwuletni post! – Noceo

+0

To powinna być poprawna odpowiedź w mojej opinii.Powyższa odpowiedź działa, ale w aplikacji, w której masz wiele skrzynek złożonych i źródeł danych, możesz wyobrazić sobie konieczność wypisywania się i ponownego subskrybowania za każdym razem, gdy chcesz zepsuć źródło danych? Dzięki @shreesha –

0

Oto prosty sposób. Możesz użyć właściwości Tag w combobox. Może być pusta lub 0 wartością całkowitą, gdy jest pusta lub jeszcze się nie wypełniła. Musisz ustawić znacznik combobox jako liczbę jego elementów po obwiedni. W zdarzeniu SelectedValueChanged, jeśli właściwość Tag ma wartość null lub 0, musisz powrócić z pustki.

Oto kilka przykładów z mojego projektu.

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); 
1

Zastosowanie SelectionChangeCommitted Event zamiast 'SelectedIndexChanged'

SelectionChangeCommitted jest podnoszona tylko wtedy, gdy użytkownik zmienia wybór skrzynki kombi. Nie używaj funkcji SelectedIndexChanged lub SelectedValueChanged do przechwytywania zmian użytkownika, ponieważ te zdarzenia są również zgłaszane, gdy wybór zmienia się programowo.

OD https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.selectionchangecommitted.aspx

Powiązane problemy