C# 在 WinForms 组合框中突出显示文本

5
有没有办法在设置Winforms组合框的选项(无论是通过组合框属性SelectedIndex还是SelectedItem)时停止自动高亮显示所选项目?
我们将一组项目填充到组合框中,然后设置要在组合框中显示的项目的索引,但这会导致文本被突出显示。当组合框被禁用时,这意味着很难阅读文本,因为突出显示的颜色是蓝色,而文本颜色是白色。看起来这种行为是按设计而来的,但非常恼人!
我在网上找到并尝试了唯一一个解决方案,即对组合框控件进行子类化,但这太过深入,意味着我们需要替换应用程序中的所有组合框才能解决此问题。我还尝试在父控件加载后将组合框的SelectionLength属性设置为0,并尝试在组合框上调用Select(0,0),但两者都没有预期的效果。
有什么想法吗?
谢谢!

1
类似的问题在这里:https://dev59.com/CHRA5IYBdhLWcg3w6SRH - CJBS
3个回答

4

这似乎是原生Windows实现的ComboBox与DropDownStyle为DropDown的一个错误。

我认为最好的解决方案是处理ComboBox的Resize事件,将SelectionLength属性设置为0(零)。该解决方案在以下问题的答案中详细说明:

ComboBox的Editbox部分会自动选择

然而,我发现即使是通过这种hackish修复来解决这个错误,有时也不起作用。如果ComboBox位于TableLayoutPanel中,并且该TableLayoutPanel具有多个列和Percent Size Type,则该修复通常不起作用。

一张图片胜过千言万语。请参见我制作的演示问题的窗体的以下屏幕截图。

enter image description here


1
我已经苦苦挣扎了几个月,而你的解决方案是第一个奏效的。我在继承类中扩展了ComboBox,重写了OnResize(e As EventArgs)子程序,并在MyBase.OnResize(e)之后立即设置了SelectionLength = 0。非常感谢! - VBobCat

0

这将有效

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
   // Draw the background.
   e.DrawBackground();
  // Determine the forecolor based on whether or not
  // the item is selected.
  Brush brush;
  // Get the item text.
  string text = ((ComboBox)sender).Items[e.Index].ToString();
  if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
  {
    brush = Brushes.White;
  }
     // Draw the text.
    e.Graphics.DrawString(text, ((Control)sender).Font, brush, e.Bounds.X, e.Bounds.Y);
}

谢谢你。我会尝试一下并告诉你是否解决了问题。 - user3359423

0

将文本从零索引高亮到最后一个索引:

comboBox1.Select(0, comboBox1.Text.Length);

从特定索引到最后一个索引高亮文本(在组合框中输入字符时搜索文本非常有用):

comboBox1.Select(text.Length, comboBox1.Text.Length);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接