我有一个问题,在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解决了箭头键的问题,但没有解决鼠标部分的问题。
当鼠标位于下拉列表上时,鼠标滚动行为仅为异常。当我单击组合框向下箭头而不移动鼠标并应用滚轮时,列表会按预期滚动。
弄清楚鼠标滚动的问题,结果证明它是“Lenovo Mouse Suite”软件和/或驱动程序。卸载它,现在每个人都很好。
感谢Jeff Yates向我展示了SelectionChangeCommitted事件。
答案 0 :(得分:3)
使用键盘时,selected index changes。使用滚轮时,鼠标下的项目会更改,这也会导致SelectedIndexChanged事件。 因此,如果索引更改时事件处理程序是密集的,它将减慢滚动速度,因为每次所选索引更改时(即每次使用鼠标或键盘滚动时)它都会运行。您应该使用SelectionChangeCommitted来处理选择更改的时间,因为这只会在组合关闭后触发。
<强>更新强>
那么,当组合没有掉下来时,你使用鼠标滚轮?如果是这种情况,那么它仍然是选择更改处理,因为每个滚轮将改变提交的选择。下拉组合时滚动不会这样做。
我建议您使用计时器添加某种选择过滤器。每次提交选择时,您都会启动(并重新启动)计时器。只有在计时器触发时才会实际处理选择更改。这样,您可以使用鼠标滚轮滚动,而不会每次都产生选择惩罚。当然,确保在计时器发生时停止计时器。