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)
Windows Forms