2009-09-28 10 views
0

J'ai une page aspx qui contient une vue détaillée. cette vue détaillée contient un ou plusieurs champs-modèles. Ce dont j'ai besoin, c'est d'un attribut supplémentaire (ou d'une information de métadonnées) pour déterminer le champ de données lié.Obtenir des attributs de la page aspx

quelque chose comme ça serait bien (simplifié):

<asp:DetailsView> 
    <fields> 
     <TemplateField DataField="DataField1"> 
      ... 
     </TemplateField> 
    </fields> 
</asp:DetailsView> 

est-il possible d'obtenir l'attribut "DataField"? sinon je vais sous-classer TemplateField et ajouter une propriété :)

+1

Que faire tu veux réaliser? Pourquoi avez-vous besoin de données supplémentaires? – Arthur

+0

Avez-vous regardé les événements disponibles sur DetailsView? –

+0

Y a-t-il un événement approprié? pour étendre TemplateField, semble être le moyen le plus propre –

Répondre

0

Je pensais que subclassing de TemplateField fera le travail:

[AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Minimal)] 
[DefaultProperty("DataField")] 
public class DataTemplateField : TemplateField 
{ 
    private String _dataField; 


    public String DataField 
    { 
     get { 
      return _dataField; 
     } 

     set { 
      _dataField = value; 
     } 
    } 
} 

maintenant u peut utiliser ce champ dans detailsview comme celui-ci

<Fields> 
    <dvt:DataTemplateField HeaderText="Feld1" DataField="DIS"> 
     <ItemTemplate> 
      <asp:Button runat="server" Text="Button" /> 
     </ItemTemplate> 
    </dvt:DataTemplateField> 
</Fields> 

et obtenir que les données

protected override void OnPreRender(EventArgs e) 
{ 
    base.OnPreRender(e); 
    foreach(DetailsViewRow row in DetailsView1.Rows) 
    { 
     DataControlFieldCell cell = (DataControlFieldCell)row.Cells[1]; 
     if (cell.ContainingField is DataTemplateField) 
     { 
      var field = (DataTemplateField)cell.ContainingField; 
      cell.Enabled = !field.DataField.Equals(fieldToDisable); 
     } 
    }    
} 
+0

Sous-classement ne fera pas ce travail dans votre cas. Ce que vous avez fait était d'attribuer une valeur de chaîne à la propriété "DataField". Cela ne liera pas une valeur. – Arthur

+0

J'ai besoin de savoir quel champ est représenté par le templatefield. certains champs sont en lecture seule pour des utilisateurs spécifiques, de sorte que les champs doivent être désactivés. –

+0

ce n'est pas bien, mais cela résout mon problème. –

0

Je n'ai pas fait cela depuis un moment, mais je semble me souvenir si vous ajoutez un ensemble public/obtenir la propriété "DataField" à la classe TemplateField, ASP. NET doit automatiquement l'initialiser avec la valeur que vous transmettez dans l'attribut.

Questions connexes