如何停止 ComboBox 中选定项的颜色高亮显示?

9
我在WinForm中使用了组合框,但当我选择组合框中的任何项时,选定项的背景颜色会变成蓝色。 我想删除这个蓝色背景颜色(特别是在窗体加载时),但仍应该选中该项。 有人可以帮忙解决吗?

很确定你可以将选定的索引设置为-1,但已经有一段时间了。 - asawyer
1
但是必须选择项目... - Dhanapal
你在Windows上使用特殊的颜色主题吗?这在常见的组合中不应该发生。尝试删除该组合并添加一个新的组合。@asawyer 这将清除组合,但这不是OP所问的 ;) - gbianchi
@Dhana 我明白了,很抱歉我错过了那个。我想你可以覆盖渲染并自己绘制它。这样它就可以是任何颜色了。 - asawyer
7个回答

4
为了解决这个问题,我几乎做了所有事情:
  • DropdownStyle属性设置为DropdownList
  • this.BeginInvoke(new Action(() => { comboBox1.Select(0, 0); }));
  • combobox1.SelectionLength = 0;
  • 改变comboBox.TabIndex
  • 没有尝试SendKeys.Send("{ESC}");,因为它不是一个可靠的解决方案

什么都没有帮助。可能是因为我的组合框项中没有文本,只有图片。 唯一稳定和有效的解决方案是将焦点移到另一个标签控件上:

    label.Focus();

你可以隐藏那个标签。

3

1
给定的链接解释了如何在鼠标悬停在组合框项目上时显示工具提示。这不是问题的答案。 - Dialecticus

2
我在这个网站上找到了一些内容。
在你的SelectedIndexChanged事件中创建一个计时器并启用它,在计时器中添加ComboBox1.Select(0,0),这将删除选择部分,然后禁用计时器。识别其他可以再次Enable计时器的入口点。
代码片段:
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
    //Get the item selected in the combobox
    ComboBox cbx = (ComboBox)sender;
    int idx = cbx.SelectedIndex;    
    string s1 = cbx.SelectedItem.ToString();
    // Enable the time so that the Highlight can be removed
    timer1.Enabled = true;
}

private void timer1_Tick(object sender, EventArgs e)
{
    // Remove the Highlight
    comboBox1.Select(0, 0);
    // Disable timer
    timer1.Enabled = false;
}

comboBox1.Select(0, 0) -- 不起作用,因为combobox是“dropdownlist”,不允许编辑文本。 - Dhanapal
1
@Dhana,那么设置 comboBox1.SelectionLength=0 可行吗? - V4Vendetta

2

我并不是一个熟练的VB用户,只是在Excel中偶尔使用它,但当我在ComboBox中进行选择时也遇到了这个问题。最后我找到了一种方法来消除蓝色文本的高亮。

我有一个UserForm上的ComboBox。通过选择ComboBox并查看属性,将'HideSelection'更改为True对我有用。你也可以编写代码来实现它: ComboBox1.HideSelection = True


这是正确的解决方案。尽管您的答案涉及VBA,但对于使用C#和VB.NET的WinForms也适用。您需要将“HideSelection”属性设置为“true”。不过,奇怪的是,这应该是默认设置。 - Cody Gray
@Cody Gray - 在Windows Forms中,我找不到ComboBox的HideSelection属性。它存在于TextBoxBase和继承自它的控件中,但ComboBox没有。这很遗憾,因为我真的很想要一个!(我正在使用带有.NET 4.5的Visual Studio 2013) - JonP
@jonp 嗯,我不知道几年前写那个评论时我在想什么。当时它可能对我有用。我认为ComboBox只是隐藏了基类方法,但快速查看参考源代码表明它甚至没有与TextBox相同的层次结构。它实际上继承自ListControl,后者又继承自Control。因此,没有隐藏的属性可设置。也许你可以访问底层的TextBox控件,尽管.NET没有提供任何托管方式来这样做。你将不得不使用P/Invoke来获取句柄。... - Cody Gray
如果您需要完整的解决方案,请提出一个新问题或在此问题上设置赏金。虽然我不得不想知道为什么有人真的需要这个。在我看到的所有组合框中,隐藏选择是默认的。任何已经进行的选择都会在焦点离开组合框控件时消失。这就是HideSelection属性所做的全部。正如我之前所说,这是文本框和组合框控件的默认值。如果您确实提出了一个新问题,请确保详细说明您的情况有何不同。@jonp - Cody Gray
@Cody 我没说我需要将它设置为true;我需要将它设置为false!我的查找/替换功能选择了找到的文本以突出显示它,然后显示一个对话框询问是否要替换此出现,这会使ComboBox失去焦点并且突出显示消失。如果我无法通过其他方式解决它,我会提出一个新问题(我觉得人们在这个论坛上提问太快了,他们需要更加努力地尝试!) - JonP

1

对于您来说,有一个简单的解决方案

private void myComboBox_Paint(object sender, PaintEventArgs e)
{
     myComboBoxComboBox.SelectionLength = 0;
}

希望能有所帮助 :)


这不会导致选择被删除吗? - elyashiv

1

简单的方法就是禁用下拉框,然后再启用它。

combobox.Enabled = false;
combobox.Enabled = true;

即使您在其中选择一个项目,该项目仍将被选中,但高亮显示将消失


^^^这正是人们正在寻找的解决方案。在我看来,这是最佳答案。谢谢你^^^ - MattyS

0

我遇到了同样的问题,在找不到有效解决方案后,我也像@Vadim K.一样想到了同样的方法。

这里是一个简短的示例。

第一步是在UI_Load事件中改变焦点。

Private Sub UI_Load(sender As System.Object, e As System.EventArgs) Handles Me.Load    
    Me.lblTitle.Focus()
End Sub

下一步是处理当有人选择新值的情况。
Private Sub comboExportDates_SelectedIndexChanged(sender As Object, e As EventArgs) Handles comboExportDates.SelectedIndexChanged
        Me.lblTitle.Focus()
End Sub

对我来说运行良好


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