DevAdmin Blog

Blog di Ermanno Goletto (Microsoft MVP Directory Services - MCITP - MCTS - MCSA - MCP)
posts - 858, comments - 421, trackbacks - 13

My Links

News

Avatar

Curriculum Vitae

Visualizza il profilo di Ermanno Goletto su LinkedIn


Il contenuto di questo blog e di ciascun post viene fornito “così come é”, senza garanzie, e non conferisce alcun diritto. Questo blog riporta il mio personale pensiero che non riflette necessariamente il pensiero del mio datore di lavoro.

Logo Creative Commons Deed


Logo SysAdmin.it SysAdmin.it Staff


Logo TechNet Forum TechNet Italia @ForumTechNetIt Follow TechNet Forum on Twitter


Logo MVP


Ermanno Goletto Follow ermannog on Twitter

Article Categories

Archives

Post Categories

Blogs

Friends

Knowledge Base

MVP Sites

Resources

ComboBox Readonly

Talvolta sarebbe utile rendere ReadOnly un ComboBox in modo che visualizzi solo il suo contenuto senza permettere modifiche.

Nativamente questo è possibile impostando la proprietà ReadOnly, ma in questo modo la leggibilità non è il massimo:

image image

Quello che servirebbe avere la possibilità di poter impostare il ComboBox in modalità ReadOnly come avviene per il TextBox, purtroppo questa modalità non è prevista in modo nativo mentre pare che in VB6 esistesse una proprietà Locked che non più stata implementata. Il suggerimento che viene dato su MSDN per implementare la funzionalità di Locked del VB6 è quello di impostare la proprietà DropDownStyle al valore DropDownList e impedire la selezione nell’evento MouseDown (a riguardo si veda Controllo ComboBox per gli utenti di Visual Basic 6.0).

Io invece ho preferito un altro approccio e cioè quello di creare un’estensione per il controllo ComboBox con un metodo SetReadOnly che va a creare a runtime un controllo TextBox impostato a ReadOnly e lo sovrappone al ComboBox.

image

Di seguito il codice per implementare tale funzionalità che potrà essere semplicemente utilizzata invocando il metodo SetReadOnly: cmbPorto.SetReadOnly(True)

Public Module ComboBoxExtensions


    Private Const ReadOnlyTextBoxName As String = "txtReadOnly"

    <System.Runtime.CompilerServices.Extension()> _
    Public Sub SetReadOnly(ByVal combobox As System.Windows.Forms.ComboBox, _
                             ByVal value As Boolean)
        Dim readOnlyTextBox As TextBox = GetReadOnlyTextBox(combobox)

        If value AndAlso readOnlyTextBox Is Nothing Then
            'Creazione ReadOnly TextBox
            readOnlyTextBox = New TextBox()
            readOnlyTextBox.Name = ReadOnlyTextBoxName
            readOnlyTextBox.ReadOnly = True
            readOnlyTextBox.Multiline = True
            readOnlyTextBox.Width = combobox.Width
            readOnlyTextBox.Height = combobox.Height
            readOnlyTextBox.Text = combobox.Text
            readOnlyTextBox.Font = combobox.Font
            combobox.Controls.Add(readOnlyTextBox)
            AddHandler combobox.TextChanged, AddressOf ComboBox_TextChanged
        ElseIf Not value AndAlso readOnlyTextBox IsNot Nothing Then
            'Rimozione ReadOnly TextBox
            RemoveHandler readOnlyTextBox.TextChanged, AddressOf ComboBox_TextChanged
            combobox.Controls.Remove(readOnlyTextBox)
            readOnlyTextBox.Dispose()
            readOnlyTextBox = Nothing
        End If
    End Sub

    <System.Runtime.CompilerServices.Extension()> _
    Public Function GetReadOnly(ByVal combobox As System.Windows.Forms.ComboBox) As Boolean
        Return GetReadOnlyTextBox(combobox) IsNot Nothing
    End Function

    Private Function GetReadOnlyTextBox(ByVal comboBox As ComboBox) As TextBox
        GetReadOnlyTextBox = Nothing

        'Ricerca ReaOnlyTextBox
        For Each c As Control In comboBox.Controls
            If TypeOf c Is TextBox AndAlso c.Name = ReadOnlyTextBoxName Then
                GetReadOnlyTextBox = DirectCast(c, TextBox)
                Exit For
            End If
        Next
    End Function

    Private Sub ComboBox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim readOnlyTextBox = GetReadOnlyTextBox(DirectCast(sender, ComboBox))

        If readOnlyTextBox IsNot Nothing Then
            readOnlyTextBox.Text = DirectCast(sender, ComboBox).Text
        End If
    End Sub

End Module

Print | posted on Monday, August 09, 2010 3:13 PM | Filed Under [ Links Code, Snippets & Scripts ]

Feedback

Gravatar

# re: ComboBox Readonly

Sicuramente un'ottima soluzione
Non essendo molto pratico nello sviluppo delle classi e dei metodi ho dato un'occhiata
a visual studio 2010 e se si fa un progetto wpf la combobox risulta già di default non editabile con il flag isEditable False di default per ogni singola combobox.

Ancora complimenti per il blog per gli argomenti trattati veramente in modo esaustivo

Ciao
8/18/2010 10:44 AM | Pierluigi

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 8 and 6 and type the answer here:

Powered by:
Powered By Subtext Powered By ASP.NET