3

我有一个问题,即在 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);

有没有人遇到过这个问题?如果是这样,你做了什么来解决它?

编辑

将事件处理程序更改为 SelectionChangeCommitted 解决了有关箭头键的问题,但没有解决鼠标部分的问题。

鼠标滚动行为仅在鼠标悬停在下拉列表上时才会出现异常。当我在不移动鼠标的情况下单击组合框向下箭头并应用滚轮时,列表会按预期滚动。

编辑 2

找出鼠标滚动的问题,原来是“联想鼠标套件”软件和/或驱动程序。卸载它,现在一切都很好。

感谢 Jeff Yates 向我展示了 SelectionChangeCommitted 事件。

4

1 回答 1

3

当您使用键盘时,所选索引会发生变化。使用滚轮时,鼠标下的项目会发生变化,这也会导致SelectedIndexChanged事件。因此,如果您的事件处理程序在索引更改时很密集,它将减慢滚动速度,因为每次选定索引更改时(即每次使用鼠标或键盘滚动时)它都会运行。You should use SelectionChangeCommitted to handle when the selection changes instead as this will only fire once the combo is closed.

更新
所以,当组合没有被下拉时,你使用鼠标滚轮吗?如果是这种情况,那么它仍然是选择更改处理,因为轮子的每次滚动都会更改提交的选择。下拉组合时滚动不会执行此操作。

我建议您使用计时器添加某种选择过滤器。每次提交选择时,您都会启动(并重新启动)计时器。只有当计时器触发时,您才会真正处理选择更改。这样,您可以使用鼠标滚轮滚动,而不会每次都产生选择惩罚。当然,请确保在计时器触发时停止计时器。

于 2009-04-20T14:36:59.813 回答