Výběr ze seznamu Id serverových ovládacích prvků na stránce
V konferenci EMWAC se objevil příspěvek http://konference.vyvojar.cz/post.aspx?id=53046, jehož autor chce do vlastnosti ve svém serverovém ovládacím prvku uložit Id jiného ovládacího prvku na stránce. Vývojář by neměl zapisovat Id přímo, ale vybírat ze seznamu na stránce vlastností. První myšlenkou autora příspěvku bylo nadeklarovat vlastnost jako WebControl - to je samozřejmě nesmysl. Když zkusíme perzistovat vlastnost na stránce (atribut PersistenceMode), tak dosáhneme pouze toho, že validátor ASPX stránky nás bude upozorňovat, že máme na stránce 2 prvky se stejným Id.
To, o co se autor snaží, umí všichni validátoři. Jejich vlastnost ControlToValidate nabídne Id všech prvků na stránce, kteří obsahují vlastnost dekorovanou atributem ValidationProperty. Vlastnost ControlToValidate je samozřejmě typu string. Seznam Id naplní speciální TypeConverter s názvem ValidatedControlConverter.
ValidatedControlConverter nelze použít pro načtení seznamu Id všech prvků na stránce, protože, jak jsem již napsal, ta bere v úvahu jen prvky s vlastností označenou atributem ValidationProperty. Proto jsem napsal ControlConverter, který nalezne Id všech prvků na stránce.
public
class
ControlConverter : StringConverter
{
public
ControlConverter() :
base
()
{
}
public
override
StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
if
((context ==
null
) || (context.Container ==
null
))
return
null
;
object
[] foundControls = enumerateControls(context.Container);
if
(foundControls ==
null
)
return
null
;
return
new
StandardValuesCollection(foundControls);
}
public
override
bool
GetStandardValuesSupported(ITypeDescriptorContext context)
{
return
true
;
}
public
override
bool
GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return
false
;
}
private
object
[] enumerateControls(IContainer container)
{
ArrayList retList = new ArrayList();
foreach
(IComponent component
in
container.Components)
{
Control foundControl = component as Control;
if
(foundControl ==
null
)
continue
;
if
((foundControl.ID ==
null
) ||
(foundControl.ID == String.Empty))
continue
;
retList.Add(foundControl.ID);
}
return
retList.ToArray();
}
}
Converter se u vlastnosti použije takto:
[Browsable(
true
)]
[TypeConverter(
typeof
(ControlConverter))]
public
string
MyControl
{
get
{
string
myControl = (
string
) ViewState["MyControl"];
return
(myControl ==
null
? String.Empty : myControl);
}
set
{
ViewState["myControl"] =
value
;
}
}
Sunday, 25 April 2004 18:44:00 (Central Europe Standard Time, UTC+01:00)
ASP.NET | .NET Framework