Search code examples
c#winforms.net-2.0

How to show text in combobox when no item selected?


C# & .Net 2.0 question (WinForms)

I have set of items in ComboBox and non of them selected. I would like to show a string on combo "Please select item" in that situation.

Current implementation is just added empty item with such text on index 0 and remove it when user select one of following items. Unfortunately empty item is shown in dropdown list as well. How to avoid this situation or in other way - is there any way to show custom text on ComboBox when no item is selected?

Answers below work when ComboBoxStyle is set to DropDown (ComboBox is editable). Is there possibility to do this when ComboBoxStyle is set to DropDownList?


Solution

  • Here you can find solution created by pavlo_ua: If you have .Net > 2.0 and If you have .Net == 2.0 (search for pavlo_ua answer)

    Cheers, jbk

    edit: So to have clear answer not just link

    You can set Text of combobox when its style is set as DropDown (and it is editable). When you have .Net version < 3.0 there is no IsReadonly property so we need to use win api to set textbox of combobox as readonly:

    private bool m_readOnly = false;
    private const int EM_SETREADONLY = 0x00CF;
    
    internal delegate bool EnumChildWindowsCallBack( IntPtr hwnd, IntPtr lParam );
    
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    internal static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
    
    [ DllImport( "user32.dll" ) ]
    internal static extern int EnumChildWindows( IntPtr hWndParent, EnumChildWindowsCallBack lpEnumFunc, IntPtr lParam );
    
    
    private bool EnumChildWindowsCallBackFunction(IntPtr hWnd, IntPtr lparam)
    {
          if( hWnd != IntPtr.Zero )
           {
                  IntPtr readonlyValue = ( m_readOnly ) ? new IntPtr( 1 ) : IntPtr.Zero;
                 SendMessage( hWnd, EM_SETREADONLY, readonlyValue, IntPtr.Zero );
                 comboBox1.Invalidate();
                 return true;
           }
           return false;
    }
    
    private void MakeComboBoxReadOnly( bool readOnly )
    {
        m_readOnly = readOnly;
        EnumChildWindowsCallBack callBack = new EnumChildWindowsCallBack(this.EnumChildWindowsCallBackFunction );
        EnumChildWindows( comboBox1.Handle, callBack, IntPtr.Zero );
    }