在禁用时使组合框可见

时间:2012-02-06 05:07:45

标签: vb.net combobox

我在VB.net中禁用了combobox。 但在禁用模式下,它无法正常显示。 我尝试更改BackColor和ForeColor,但它无法正常工作。

代码:

cmbbox.BackColor = Color.FromName("Window")
or
cmbbox.ForeColor = Color.FromName("Window")

请帮忙

亲爱的亚当: 我正在使我的组件启用false。但我想让它可见。你可以提供链接。这是我想要的,但在VB.Net中:A combobox that looks decent when it is disabled

3 个答案:

答案 0 :(得分:0)

要实现禁用组合框而不淡化它,首先将组合框的下拉样式更改为DropDownList,然后调整事件以实现目标。

以下是一段代码,您可以通过它实现相同的目标:

Public Class Form1
Dim selectindex As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ComboBox1.Items.Add("1")
    ComboBox1.Items.Add("2")
    ComboBox1.Items.Add("3")
    ComboBox1.Items.Add("4")
    selectindex = 3
    ComboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
    ComboBox1.SelectedIndex = selectindex
End Sub

Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted
    ComboBox1.SelectedIndex = selectindex
End Sub
End Class

创建一个新表单Form1并向表单添加一个组合框,然后添加上面的代码以获得一个只读组合框。

答案 1 :(得分:0)

看看this thread哪个有一个只读组合框的解决方案,代码都是VB.NET。

他们的代码版本如下。你需要在你自己的一个类中继承System.Windows.Forms.ComboBox

    Private _ReadOnly As Boolean = False

    Public Property [ReadOnly]() As Boolean    
        Get
            Return _ReadOnly
        End Get
        Set(ByVal Value As Boolean)
            _ReadOnly = Value
        End Set
    End Property

    Public Overrides Function PreProcessMessage(ByRef msg As Message) As Boolean
        'Prevent keyboard entry if control is ReadOnly  
        If _ReadOnly = True Then
            'Check if its a keydown message
            If msg.Msg = &H100 Then
                'Get the key that was pressed 
                Dim key As Int32 = msg.WParam.ToInt32
                'Ignore navigation keys 
                If key = Keys.Tab Or key = Keys.Left Or key = Keys.Right Then
                    'Do nothing    
                Else
                    Return True
                End If
            End If
        End If
        'Call base method so delegates receive event 
        Return MyBase.PreProcessMessage(msg)
    End Function

    Protected Overrides Sub WndProc(ByRef m As Message)
        'Prevent list displaying if ReadOnly
        If _ReadOnly = True Then
            If m.Msg = &H201 OrElse m.Msg = &H203 Then
                Return
            End If
        End If
        'Call base method so delegates receive event 
        MyBase.WndProc(m)
    End Sub

答案 2 :(得分:0)

我不久前一直在寻找同样的东西,最后做了以下事情。你可能不喜欢它,但我会分享它以防万一。我正在使用TableLayoutPanel来安排表单上的控件,然后我交换所需控件的位置。

例如,我创建了以下项目:

Form1 Design

  1. TableLayoutPanel1(两列,三行)
  2. TextBox1只读= True,BackColor = White
  3. ComboBox1 Visible = False,DropDownStyle = DropDownList,FlatStyle = Popup
  4. Button1(将其命名为Change)
  5. Button2(将其命名为Done) - >可见=错误
  6. Runtime - Screenshots

    这是我的代码:

    Public Class Form1
        Private Sub SwapControls(tlp As TableLayoutPanel, ctr1 As Control, ctr2 As Control)
            Dim ctl1pos As TableLayoutPanelCellPosition = tlp.GetPositionFromControl(ctr1)
            ctr1.Visible = False
            tlp.SetCellPosition(ctr1, tlp.GetPositionFromControl(ctr2))
            ctr2.Visible = True
            tlp.SetCellPosition(ctr2, ctl1pos)
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            SwapControls(TableLayoutPanel1, TextBox1, ComboBox1)
            SwapControls(TableLayoutPanel1, Button1, Button2)
            Label1.Select()
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            SwapControls(TableLayoutPanel1, ComboBox1, TextBox1)
            SwapControls(TableLayoutPanel1, Button2, Button1)
            Label1.Select()
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Label1.Select()
            ComboBox1.SelectedIndex = 0
    
            TextBox1.Text = ComboBox1.SelectedItem
        End Sub
    
        Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
            TextBox1.Text = ComboBox1.SelectedItem
        End Sub
    End Class