0

我对使用组合框有一些疑问。

1)我需要像这样从类中引用组合框:

If Me.ActiveControl.GetType Is GetType(ComboBox) And combodroppeddown = False) Then
   something...
End If

从这里我需要直接从 AND 来检查这个组合框是否被下拉,但我不知道如何。

2)我的实际组合框类型是“DropDownList”类型。
问题是,如果我将其下拉并使用向上/向下键键入,则值会根据所选行进行更改。如果我然后按 ESC,那么最后一个值将保持为不需要的值。

如果我在删除列表时按 ESC,是否可以从删除的那一刻起返回原始值?
怎么做?

这是对我的 xCombo 子类的仔细研究,以在第二个问题中获得帮助...

Public Class xAutoCombo
Inherits ComboBox

Private entertext As String

Protected Overrides Sub OnKeyDown(ByVal e As KeyEventArgs)

    If e.Control Then ' this dropped a list with keyboard
        If e.KeyCode = Keys.Down Then
            Me.DroppedDown = True
        End If
    End If

    '' this should return value back if ESC was pressed
    '' but don't work!
    If Me.DroppedDown And e.KeyCode = Keys.Escape Then 
        Me.Text = entertext
    End If

    MyBase.OnKeyDown(e)
End Sub

Protected Overrides Sub OnDropDown(ByVal e As System.EventArgs)

    entertext = Me.Text '' this remember text in moment of droping
    MyBase.OnDropDown(e)
End Sub

编辑:
在这里,我发现了一个我想解决的功能问题。
当组合被删除并且我通过键盘浏览列表然后用鼠标按下以形成(或组合之外)时,它会关闭一个列表并设置最后一次选择的值。

相反,我希望该组合仅在单击鼠标以列出列表或使用键盘按 Enter 键时设置他的新值。

4

1 回答 1

1

检查DroppedDown房产,但似乎您在下车时还有其他想做的事情。

Dim cbo As ComboBox
If Me.ActiveControl.GetType Is GetType(ComboBox) then
    cbo=Ctype(Me.ActiveControl, ComboBox)

    ' make it easier to refernece

    if cbo.DroppedDOwn then
        ....
    End iF
End if

' Note:
Ctype(Me.ActiveControl, ComboBox).DroppedDown
' should work, but the above is easier to read and use since you apparently 
' will have other things to do/override with it

另请注意,我认为三种组合框下拉类型之一不使用/支持该DroppedDown属性。

对于我不完全遵循的其余问题,您还可以存储最后选择的项目并以类似方式恢复它。但是,覆盖 windows 默认行为并不是一个好主意,因为您正在创建用户以前从未遇到过的东西。

编辑

要将 Escape 功能从 CLOSE DROPDOWN 更改为 ABORT CHOICE:注意:我刚刚使用了 std cbo,需要将 refs 更改为MyBase, events 更改为On...

Private selectedindex As Integer = -1
Private bEsc As Boolean = False

Private Sub cbo_Enter(....
   ' reset tracking vars...might not be needed
    selectedindex = -1
    bEsc  = False
End Sub

Private Sub cbo_DropDown(...
    ' capture starting state
    selectedindex = cbo.SelectedIndex
    bEsc = False
End Sub

按键:

    If cbo.DroppedDown AndAlso e.KeyCode = Keys.Escape Then
        bEsc = True
        e.Handled = True
        ' this MUST be last!
        cbo.DroppedDown = False
    End If


 Private Sub cbo_DropDownClosed(...
    ' rest cbo.selectedindex if escape was pressed
    If bEsc Then
       ' note: SelectedIndexChanged event will fire and any code there will run
       ' may need to qualify with If Esc = False...
        cbo.SelectedIndex = selectedindex
    End If
End Sub
于 2013-10-20T16:28:52.083 回答