\

Školení Návrhové vzory, OOP a UML


 Sunday, April 25, 2004
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, April 25, 2004 6:44:00 PM (Central Europe Standard Time, UTC+01:00)       
Comments [2]  ASP.NET | .NET Framework


Tuesday, July 19, 2005 11:02:12 AM (Central Europe Standard Time, UTC+01:00)
Je to super, ako vsetko co publikujete. Mal by som len otazocku pretoze som sa nejaky vecer v tom snazil zorientovat a spravit vlastny TypeDescriptor na vyber buttonu pripadne aj lubovolneho WebControlu ale ako vravim neviem ako na to. Neviete ma ...
Tuesday, July 19, 2005 11:02:13 AM (Central Europe Standard Time, UTC+01:00)
Zdrsvim Vas a dekuju.

Nevim, jestli jsem presne pochopil, cim se zabyvate, ale napadaji me 2 reseni.

1) Kdyz budete iterovat pres Controly, tak se muzete dotazat na nazev typu.

foundControl.GetType().ToString();

2) Muzete se dotazat, zda ...
Comments are closed.