调整大小时ComboBox的行为异常

5

当ComboBox控件被重新调整大小时,我的问题在于它的文本值会改变。以下是我编写的一些示例代码:


Option Explicit On  
Option Strict On

Public Class FMain  
    Private Sub FMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load  
        uxComboBox.DropDownStyle = ComboBoxStyle.DropDown  
        uxComboBox.AutoCompleteSource = AutoCompleteSource.ListItems  
        uxComboBox.AutoCompleteMode = AutoCompleteMode.Suggest  

        ComboTest()  
    End Sub  

    Private Sub ComboTest()  
        Dim value As String = "6"  

        uxComboBox.Text = String.Empty  
        uxComboBox.Items.Clear()  

        uxComboBox.Items.AddRange(New String() {"4 9/16", "6 9/16", "7 9/16", "8 9/16"})  

        Dim index As Integer = uxComboBox.FindStringExact(value)  
        If uxComboBox.SelectedIndex  index Then  
            uxComboBox.SelectedIndex = index  
        End If  

        If uxComboBox.SelectedIndex = -1 AndAlso _
           Not String.Equals(uxComboBox.Text, value, StringComparison.OrdinalIgnoreCase) Then  
            uxComboBox.Text = value  
        End If  

        ' unselect the text in the combobox  
        '  
        uxComboBox.Select(0, 0)  
    End Sub  
End Class  

请注意,这个表单(FMain)上只有一个下拉框(uxComboBox),并且已经停靠在顶部。当我运行代码时,我看到下拉框的值为“6”,这是我所期望的。但是,当我调整窗体大小后,下拉框的值变成了“6 9/16”,这不是我所期望的。
有人知道为什么会发生这种情况吗?有什么解决方法吗?
谢谢!
Stephen
3个回答

4

是的,这是ComboBox本地Windows实现中已知的一个错误。 这个bug还有另一个方面。 在您的表单上放置一个按钮,并将其TabIndex设置为0,将CB的TabIndex更改为1。 运行它,按钮将获得焦点。 调整大小。 请注意,ComboBox的文本与以前一样更改,但现在也会被突出显示,就像它已经拥有焦点一样。 即使它没有。

我认为这个错误从Vista开始存在,它在Win7中没有得到修复。 目前没有已知的解决方法。


谢谢提供的信息。我们刚刚完成了从VB6迁移到.NET,而在VB6应用程序中并没有出现这个问题。有什么想法吗? - StephenM
这可能是一个主题错误。大多数UI错误都是如此。VB6不启用视觉样式,并使用大量无窗口控件。 - Hans Passant
我通过在自定义控件通过SetBounds()调整大小之前存储文本值,然后在文本更改时恢复该值来解决了这个问题。当调整大小时,它仍会短暂地闪烁“6 9/16”,但最终结果是保留当前值。感觉这是一个笨拙的修复方法,但无论如何只要能让它工作就好了,对吧? - StephenM

0

我正在使用Windows 10和Visual Studio 2017。看起来这个bug仍然存在。根据Hans Passant上面的答案,我以以下方式解决了这个问题。

我有一个组合框作为控件,左右都锚定,所以当窗体扩展时它会拉伸。当屏幕扩展时,即使没有焦点,组合框文本也会被突出显示。

作为一种解决方法,我取消了其中一个锚定,并将其添加到旁边的文本框中。现在我的组合框不会随着屏幕扩展而扩展,而是文本框会扩展。我知道这不是一个完美的解决方案,但它可能会帮助类似情况下的其他人解决问题。


0
当表单加载时,会执行ComboTest,你会看到一个'6',但是当你调整大小时,它不会显示新的数据,这意味着你需要刷新组合框,无论是否进行调整。
uxComboBox.Items.AddRange行之后立即尝试uxComboBox.Refresh()
在'ComboTest'行之后,也将选定索引设置为0 uxComboBox.Index = 0
希望能帮到你, 此致 敬礼, 汤姆。

将所选索引设置为0只会选择列表中的第一项,这不是我想要的。它需要保留我设定的“6”的值。我尝试了你建议的uxComboBox.Refresh(),但没有成功。当我调整窗体大小时,行为是相同的。我甚至在窗体的Resize事件中尝试过它,但是行为仍然没有改变。 - StephenM
@StephenM:你能展示一下表单设计器的代码吗?我觉得因为组合框停靠在顶部并且可以调整大小,所以组合框没有被刷新。或许可以为表单的调整大小添加一个事件处理程序,在事件处理程序中调用uxComboBox.Refresh。 - t0mm13b

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