C#ComboBox禁用突出显示

Con*_*lty 5 c# combobox highlighting

我有自定义的ComboBox,其中DropDownStyle = ComboBoxStyle.DropDown;设置了.DropDown样式,因为我想将ComboBox的Text属性设置为值列表之外的东西.一切都很好,除了ComboBox在它离开时突出显示文本,当我点击组合框编辑时可以使用.我怎么能应付这个?为了显示:

在此输入图像描述

First Picture是一切看起来不错的地方,第二个是亮点情况,第三个编辑是打开的.

Lar*_*ech 8

在DropDown关闭尝试取消选择文本:

void comboBox1_DropDownClosed(object sender, EventArgs e) {
  this.BeginInvoke(new Action(() => { comboBox1.Select(0, 0); }));
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*eau 5

棘手的问题需要解决。看来是从Resize事件中得来的。有很多解决方案可以做与此类似的事情,但在我尝试这个之前,我没有见过对我有用的解决方案。(这是一个不需要继承的解决方案ComboBox;继承可能是一个更直接的解决方案,但要求您始终使用继承的类而不是实际的ComboBox类。)

comboBox.Resize += (s, e) => {
   if (!comboBox.IsHandleCreated)
      return;  // avoid possible exception

   comboBox.BeginInvoke(new Action(() => comboBox.SelectionLength = 0));
};
Run Code Online (Sandbox Code Playgroud)

将选择长度设置为零以消除突出显示,但是什么时候呢?其他示例在其他地方执行此操作,但问题似乎是由 引起的Resize,因此在一致修复后执行Resize此操作,至少对我而言。(尽管调整窗口大小时仍然可以看到它闪烁,但最终结果总是好的。)

BeginInvoke确保它在Resize工作后充分发生,并且检查IsHandleCreated防止在创建句柄之前调用它,在这种情况下BeginInvoke将引发异常。

这个稍微复杂的版本包括一些检查,以防止焦点控件失去突出显示,因为它实际上应该有它。如果父级尚不存在,或者父级还没有活动控件,它也不会触发,这两种情况都表明事情还为时过早。

comboBox.Resize += (s, e) => {
   if (!comboBox.IsHandleCreated)
      return;

   comboBox.BeginInvoke(new Action(() => {
      var parent = comboBox.FindForm();
      if (parent == null)
         return;

      if (parent.ActiveControl == null)
         return;

      if (parent.ActiveControl == comboBox)
         return;

      comboBox.SelectionLength = 0;
   }));
};
Run Code Online (Sandbox Code Playgroud)

我尝试制作一个可以“保留”选择长度而不是始终将其设置为零的版本,但我无法使其正确同步。许多Resize事件可以在BeginInvoke委托开始触发之前触发,因此保留的值总是会被​​损坏的值覆盖。我尝试将它们全部保存在 aQueue或中Stack,但在这两种情况下,我无法反转顺序(不太确定为什么,因为这没有意义)。


NoS*_*ler 4

如果您指的是禁用突出显示和编辑,那么您可能需要考虑将该DropdownStyle属性设置为DropdownList

yourComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
Run Code Online (Sandbox Code Playgroud)