\


 Thursday, 06 May 2004
Windows forms combobox jen pro čtení

Nedávno jsem potřeboval zakázat v detailu uživateli výběr z comboboxu, ale zjistil jsem, že první nabízející se cesta přes vlastnost Enabled není vhodná. Když nastavíte vlastnost Enabled na false, tak sice uživatel žádnou položku nevybere, ale combobox působí na formuláři jako grafický "umrlec",  protože dříve vybraná položka je "zašeděná". Potřeboval jsem vlastnost, která by ponechala vizuální vzhled comboboxu beze změny, ale nedovolila provést nový výběr.
Žádnou takovou vlastnost jsem nenašel, a proto jsem vytvořil potomka comboboxu, kterému jsem přidal vlastnost DisableDropDown. Když je vlastnost DisableDropDown true, tak combobox v přepsané metodě OnWndProc ignoruje zprávy o stisku tlačítka myši (WM_LBUTTONDOWN a WM_LBUTTONDBLCLK) a zprávy z klávesnice (WM_KEYDOWN, WM_KEYUP) . V další přepsané metodě OnKeyPress combobox zamezí zadání nové položky do textového pole nastavením vlastnosti Handled argumentu e na true. To je celý trik, snad se bude odvozený combobox hodit i Vám.

using

System;

using

System.Windows.Forms;

namespace

RStein.UI

{

  /// <summary>

  /// Combobox, u nějž je možné zakázat rozbalení seznamu položek a editaci textového pole

  /// </summary>

  public class ComboBoxEx : ComboBox

  {

    private const int WM_KEYDOWN = 0x0100;

    private const int WM_KEYUP = 0x0101;

    private const int WM_LBUTTONDOWN = 0x0201;

    private const int WM_LBUTTONDBLCLK = 0x0203;

 

   #region

private fields

   private bool m_disableDropDown = false ;

   #endregion

private fields

   /// <summary>

   /// Konstruktor

   /// </summary>

   public ComboBoxEx()

   {

     m_disableDropDown =

false ;

   }

  #region

public properties

  /// <summary>

  /// Zakázat zobrazení položek?

  /// </summary>

  public bool DisableDropDown

  {

    get

    {

      return m_disableDropDown;

    }

   set

   {

      m_disableDropDown =

value ;

   }

  }

  #endregion

public properties

 

  #region

protected methods

  protected override void OnKeyPress(KeyPressEventArgs e)

  {

    if (!DisableDropDown)

     base .OnKeyPress(e);

    else

     e.Handled = true;

   }

  protected override void WndProc(ref Message m)

  {

    if (!DisableDropDown)

      base.WndProc (ref m);

    else if ((m.Msg != WM_KEYDOWN) &&

                (m.Msg != WM_LBUTTONDOWN ) &&

               (m.Msg != WM_LBUTTONDBLCLK) &&

             (m.Msg != WM_KEYUP))

              base.WndProc (ref m);

  }

  #endregion

protected methods

  }

}



Thursday, 06 May 2004 21:15:00 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  Windows Forms