Медленная прокрутка в ComboBox - PullRequest
2 голосов
/ 20 апреля 2009

У меня есть проблема, когда прокрутка в toolStripComboBox и обычном ComboBox действительно медленная.

Это происходит как с помощью клавиш со стрелками, так и с помощью колеса прокрутки мыши. Тем не менее, если я использую полосу прокрутки, она ведет себя как ожидалось.

Вот список со списком инструментов:

        // 
        // toolStripComboBoxDeild
        // 
        this.toolStripComboBoxDeild.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
        this.toolStripComboBoxDeild.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
        this.toolStripComboBoxDeild.DropDownWidth = 121;
        this.toolStripComboBoxDeild.Items.AddRange(new object[] {
        "Allir"});
        this.toolStripComboBoxDeild.Margin = new System.Windows.Forms.Padding(1, 0, 8, 0);
        this.toolStripComboBoxDeild.MaxDropDownItems = 24;
        this.toolStripComboBoxDeild.Name = "toolStripComboBoxDeild";
        this.toolStripComboBoxDeild.Size = new System.Drawing.Size(200, 52);
        this.toolStripComboBoxDeild.SelectedIndexChanged += new System.EventHandler(this.toolStripComboBoxDeild_SelectedIndexChanged);

Я добавляю остальные данные в выпадающий список с помощью SqlDataReader (не использую набор данных, потому что мне удобно использовать sqlreader).

и обычный комбинированный список:

// 
        // comboBox1
        // 
        this.comboBox1.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
        this.comboBox1.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
        this.comboBox1.FlatStyle = System.Windows.Forms.FlatStyle.System;
        this.comboBox1.FormattingEnabled = true;
        this.comboBox1.Location = new System.Drawing.Point(77, 17);
        this.comboBox1.Name = "comboBox1";
        this.comboBox1.Size = new System.Drawing.Size(221, 21);
        this.comboBox1.TabIndex = 1;
        this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);

Кто-нибудь когда-нибудь сталкивался с этой проблемой? Если так, что вы сделали, чтобы решить это?

EDIT

Изменение обработчика события на SelectionChangeCommitted решило проблему с клавишами со стрелками, но не с мышью.

Режим прокрутки мыши является аберрантным только тогда, когда мышь находится над выпадающим списком. Когда я нажимаю стрелку вниз в поле со списком, не перемещая мышь и применяю колесо прокрутки, список прокручивается, как и ожидалось.

РЕДАКТИРОВАТЬ 2

Выяснил проблему с прокруткой мыши, оказалось, что это программное обеспечение и / или драйвер "Lenovo Mouse Suite". Удалил его и теперь все просто отлично.

Спасибо Джеффу Йейтсу за то, что он показал мне событие SelectionChangeCommitted.

1 Ответ

3 голосов
/ 20 апреля 2009

Когда вы используете клавиатуру, выбранный индекс изменится . При использовании колеса прокрутки элемент под мышью изменяется, что также приведет к событию SelectedIndexChanged . Поэтому, если ваш обработчик событий будет интенсивным при изменении индекса, он будет замедлять прокрутку, поскольку он будет запускаться каждый раз, когда изменяется выбранный индекс (т.е. каждый раз, когда вы прокручиваете мышь или клавиатуру). Вы должны использовать SelectionChangeCommitted , чтобы обрабатывать, когда выбор изменяется вместо этого, поскольку он будет срабатывать только после закрытия комбо.

Обновление
Итак, вы используете колесо мыши, когда комбо НЕ выпадает? Если это так, то это по-прежнему обработка изменения выбора, поскольку каждый поворот колеса будет изменять зафиксированный выбор. Прокрутка при выпадающем списке не делает этого.

Я рекомендую вам добавить какой-нибудь фильтр выбора, используя таймер. Вы запускаете (и перезапускаете) таймер при каждом подтверждении выбора. Только когда срабатывает таймер, вы на самом деле справляетесь с изменением выбора. Таким образом, вы прокручиваете колесо мыши, не подвергаясь штрафу за каждый раз. Обязательно остановите таймер при его срабатывании, конечно.

...