Passaggio di parametri ad un dynamic data control tramite l'attributo UIHint

datesabato 15 novembre 2008 alle 21.44  - posted by Manuel Scapolan in ASP.NET

Nei Dynamic Data possiamo, attraverso l'attributo UIHint, impostare il FieldTemplate da utilizzare per un determinato campo dati, e non solo, tramite la proprietà ControlParameters possiamo passare delle informazioni ai controlli, per esempio per impostarne delle proprietà. Vediamo come:

public IDictionary ControlParameters { get; private set; }

La proprietà ControlParameters è un insieme di coppie chiave/valore che possiamo popolare direttamente nella decorazione del campo nella classe dei metadati intervallando chiavi e valori separati da una virgola:

// ControlParameters populating: key1, value1, key2, value2 ...
[UIHint("Text", null, "Columns", 75 )
public string ContactName { ge; set; }

Nell'esempio sopra utilizziamo per il campo ContactName il template Text al quale passiamo una coppia chiave/valore con la quale vogliamo impostare la lunghezza della TextBox a 75 colonne.

Nel FieldTemplate andiamo ad intercettare l'evento PreRender e ciclando sulla collezione dei parametri utilizziamo la chiave per ottenere la proprietà corrispondente per il controllo TextBox esposto dalla proprietà DataControl. A questo punto assegnamo alla proprietà il valore utilizzando l'opportuno convertitore ottenuto dal tipo attraverso la classe TypeDescriptor.

public partial class Text_EditField 
     : System.Web.DynamicData.FieldTemplateUserControl
{
  ...
  protected void OnPreRender(EventArgs e)
  {
    UIHintAttribute hint = null;
    hint=(UIHintAttribute)this.Column.Attributes[typeof(UIHintAttribute)];
    if (hint != null)
    {
      foreach (KeyValuePair kvp in hint.ControlParameters)
      {
        PropertyInfo prop = DataControl.GetType().GetProperty(kvp.Key);
        String value = kvp.Value.ToString();
        var converter = TypeDescriptor.GetConverter(prop.PropertyType);
        if (prop != null)
        {
          prop.SetValue(DataControl, 
             converter.ConvertFromInvariantString(value), null);
        }
      }
    }
  }
  protected override void ExtractValues(IOrderedDictionary dictionary)
  {
    dictionary[Column.Name] = ConvertEditedValue(TextBox1.Text);
  }
  public override Control DataControl
  {
    get
    {
      return TextBox1;
    }
  }
}

In questo esempio ho utilizzato il FieldTemplate Text_Edit.ascx, ma se vogliamo estendere tale funzionalità a tutti i controlli possiamo pensare di creare una nostra classe che erediti direttamente da FieldTemplateUserControl ed inserire questo codice nell'override del metodo OnPreRender. Ovviamente questo implica (per questa soluzione) che le proprietà impostate nella ControlParameters vengano propagate per tutti i controlli utilizzati per renderizzare i dati del campo così decorato (ad esempio Text.ascx, Text_Edit.ascx e se esiste Text_Insert.ascx).

tagsTags:

Commenti chiusi

About me

manuel scapolanSono un consulente informatico. Nel 2004 terminati gli studi in Ingegneria Informatica (1° livello), ho iniziato come freelance collaborando con una ditta di consulenza informatica ed una agenzia di marketing e comunicazione nello sviluppo di applicazioni web. Attualmente divido il lavoro di sviluppatore e progettista web con attività di formazione nel settore della programmazione.
View Manuel Scapolan's profile on LinkedIn

Follow me on Follow manuelscapolan on Twitter

Calendario


<<  settembre 2010  >>
lumamegivesado
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

Disclaimer

Eccetto dove diversamente specificato, i contenuti di questo sito sono rilasciati mediante:
creative commons
Attribuzione: Non commerciale
Condividi allo stesso modo. R.2.5

Books (a bit more about my library)

Domain Driven Design - Eric Evans Applying Domain-Driven Design and Patterns - Jimmy Nilsson Refactoring to Patterns - Joshua Kerievsky Design Patterns -  Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides Code Complete Second Edition - Steve McConnell Patterns of Enterprise Application Architecture - Martin Fowler Agile Principles, Patterns, and Practices in C# - Robert C. Martin xUnit Test Patterns - Gerard Meszaros Refactoring - Martin Fowler CLR via C# Second Edition - Jeffrey Richter Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries - Krzysztof Cwalina, Brad Abrams Don't make me think! - Steve Krug Bulletproof Ajax - Jeremy Keith

Manuel Scapolan Copyright © 2007 - 2010 - Tutti i diritti riservati - Powered by BlogEngine.NET 1.5.0.7 - silk icons by famfamfam - Time CET