Зупинити спрацювання події selectedIndexChanged comboBox під час завантаження форми


75

У мене є форма з, ComboBoxяка містить випадаючий список. На comboBox SelectedIndexChanged eventя запускаю деякий код, але я не хочу, щоб цей код запускався, коли форма завантажується. На жаль, коли я завантажую форму (перед тим як зробити вибір у списку), SelectedIndexChangedспалах спрацьовує (я думаю, коли це поле databinding). Чи є спосіб уникнути такої поведінки?


Не впевнений, що на робочому столі, але в .NET Compact ця подія насправді запускається до події Form_Load, що насправді проблематично - у формі ще нічого не налаштовано, коли цей код потрапляє. На CF рішення, на жаль, є змінною форми, яка встановлюється в кінці завантаження, а потім обробник подій перевіряє наявність цієї змінної до її запуску.
SqlRyan

Відповіді:


147

Якщо ви хочете реагувати лише тоді, коли користувач змінює обраний елемент у списку, тоді краще підписатися на SelectionChangeCommitted .


6
Але що робити у випадку автоконкуренції?
Arijit Mukherjee

@Arijit Mukherjee право. При введенні значення в текстове поле замість прямого вибору. Це не спричинить подію SelectionChangeCommitted
thoitbk

Блін, я досить довго шукав в Інтернеті, щоб знайти таке просте рішення. Я використовував подію SelectionChanged, і вона працювала у VB.Net - WPF, а тепер використовую її на C # - WinForms, і вона не працює, або, можливо, це лише я. Дякую!
Stephan

Бритва Akams - найбільш просте рішення є найбільш вірогідним (і найкращим у цьому випадку).
Destek

13

Ви можете просто відв’язати SelectedIndexChangedподію, викликати свою fillфункцію та прив’язати SelectedIndexChangedподію знову. На жаль, це не працює з сіткою.

Наприклад:

this.cmb.SelectionChanged -= new System.EventHandler(this.cmb_SelectionChanged);
cmb.fill(); //Your function
this.cmb.SelectionChanged += new System.EventHandler(this.cmb_SelectionChanged);

6

Обов’язково встановіть DataSourceвластивість у своїй onload()функції після призначення параметрів ValueMemberі Datamember.

Це допоможе вам вирішити вашу проблему!


1
Будь ласка, додайте більше інформації, яка детально пояснює ваше мислення.
Ленін

@Ranjith: ти можеш пояснити?
Пітер Мортенсен

Вирішує проблему. Дякую, але, будь ласка, детальніше.
hubert17,

Призначення нового DataSource запускає подію "selectedIndexChanged".
Джон

5

Чому б не мати booleanпрапорець, який вказує, коли Formзавантаження завершено?

У вашому SelectionChangedвипадку перевірте, чи є booleanпрапор true. Якщо це trueтоді, обробляйте подію, інакше ігноруйте її.


2
booooooolean .. SelectionChangeЗдійснено набагато приємніше
Piotr Kula

3
Уже існує логічний прапор `Control.Created`, який повідомляє, що форма завершила завантаження, що також діє для форм.
user1734987

ToolStripComboBoxваріація не має SelectionChangeCommittedподії. Отже, цей метод доведеться зробити. Або, щоб запобігти перегоновим умовам, використовуйте lockта Monitor.TryEnter.
spoulson

@ user1734987: Це не одне і те ж. Може бути код ініціалізації, який потрібно заповнити, і Control.Created не запускає це.

1

В.Б.

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

0

Ось просте рішення, яке залишає ваш код майже недоторканим:

У події SelectedIndexChanged перевірте, чи створено дескриптор myComboBox за допомогою методу ( IsHandleCreated ). Ще однією додатковою перевіркою є перевірка того, чи користувач фактично фокусує ваш комбобокс для зміни обраного індексу.

 private void myComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (myComboBox.IsHandleCreated &&  myComboBox.Focused)
        {
           // Do something here
        }
    }

-1

У мене це працювало таким чином, з таким кодом:

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

SelectionChangeCommitted зупиниться, щоб викликати елементи зміни індексу, як тільки всі елементи завантажаться в буфер, тоді ви можете вибрати лише один за одним, це також збільшить вашу швидкість завантаження.
Anjan Kant
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.