2009-04-02 11 views
6

Desidero associare un elenco a un GridView su una pagina Web, ma sovrascrivere il modo in cui i nomi delle proprietà vengono visualizzati tramite annotazione. Ho pensato che System.ComponentModel avrebbe funzionato, ma questo non sembra funzionare. È questo significava solo per Windows Form ?:Usa DisplayNameAttribute in ASP.NET

using System.ComponentModel; 

namespace MyWebApp 
{ 
    public class MyCustomClass 
    { 
     [DisplayName("My Column")] 
     public string MyFirstProperty 
     { 
      get { return "value"; } 
     } 

    public MyCustomClass() {} 
} 

Poi sulla pagina: "La mia colonna"

protected void Page_Load(object sender, EventArgs e) 
{ 
    IList<MyCustomClass> myCustomClasses = new List<MyCustomClass> 
    { 
     new MyCustomClass(), 
     new MyCustomClass() 
    }; 

TestGrid.DataSource = myCustomClasses; 
TestGrid.DataBind(); 

}

Ciò rende con "MyFirstProperty", come l'intestazione di colonna piuttosto che Non dovrebbe funzionare?

risposta

2

Cosa SirDemon detto ...

La risposta sembra essere no, non si può. Almeno non fuori dalla scatola. Il nome di proprietà

Lo System.Web.UI.WebControls.GridView utilizza riflessa:

protected virtual AutoGeneratedField CreateAutoGeneratedColumn(AutoGeneratedFieldProperties fieldProperties) 
{ 
    AutoGeneratedField field = new AutoGeneratedField(fieldProperties.DataField); 
    string name = fieldProperties.Name; //the name comes from a PropertyDescriptor 
    ((IStateManager) field).TrackViewState(); 
    field.HeaderText = name; //<- here's reflected property name 
    field.SortExpression = name; 
    field.ReadOnly = fieldProperties.IsReadOnly; 
    field.DataType = fieldProperties.Type; 
    return field; 
} 

Mentre System.Windows.Forms.DataGridView utilizza DisplayName se disponibile:

public DataGridViewColumn[] GetCollectionOfBoundDataGridViewColumns() 
{ 
    ... 
    ArrayList list = new ArrayList(); 
    //props is a collection of PropertyDescriptors 
    for (int i = 0; i < this.props.Count; i++) 
    { 
     if (...) 
     { 
      DataGridViewColumn dataGridViewColumnFromType = GetDataGridViewColumnFromType(this.props[i].PropertyType); 
      ... 
      dataGridViewColumnFromType.Name = this.props[i].Name; 
      dataGridViewColumnFromType.HeaderText = !string.IsNullOrEmpty(this.props[i].DisplayName) ? this.props[i].DisplayName : this.props[i].Name; 
     } 
    } 
    DataGridViewColumn[] array = new DataGridViewColumn[list.Count]; 
    list.CopyTo(array); 
    return array; 
} 

Purtroppo, mentre si può sovrascrivere CreateAutoGeneratedColumn, né il DisplayName mancante né il descrittore di proprietà sottostante vengono passati e non è possibile sovrascrivere CreateAutoGeneratedColumns (sebbene sia possibile creare CreateColumns).

Ciò significa che dovresti eseguire iterazioni su proprietà riflesse da te stesso e in qualche altro luogo.

2

Se tutto ciò che interessa è il testo dell'intestazione in GridView, basta usare la proprietà HeaderText di ogni campo che si lega. Se stai autogenerando le colonne, devi semplicemente impostare l'HeaderText dopo aver associato il GridView.

Se si desidera un GridView che tenga conto di alcuni attributi inseriti nelle proprietà della classe associata, credo che sarà necessario creare il proprio GridView.

Potrei sbagliarmi, ma non ho visto nessuna griglia ASP.NET dai fornitori di controlli (almeno Telerik, Janus Systems e Infragistics). Se lo fai, forse vendi l'idea a loro.

0

Puoi farlo ora su asp.net mvc2. Funziona proprio così

+0

non funziona per me – darcyq

1

Stai usando .net4, quello che devi fare è impostare enabledynamicdata sulla griglia su true.

+0

http://msdn.microsoft.com/en-us/library/system.web.ui.datacontrolextensions.enabledynamicdata(v=vs.110).aspx Grid1.EnableDynamicData (typeof (TypeX)) – jmw

2

Quando si utilizza .net 4 o successivo, è possibile utilizzare gridview1.enabledynamicdata (typeof (mytype)). Non ho guardato tutti i tipi che puoi usare lì, ma so che [displayname ("somename")] funziona bene ma il [browsable (false)] non omette la colonna dalla griglia. Sembra una maglia che si infila dalla MS. almeno puoi facilmente rinominare i nomi delle colonne e per omettere una colonna dichiaro semplicemente una variabile invece di usare una proprietà. Ha lo stesso effetto ...

A proposito, usare il designer per creare colonne è la via più facile, ma mostrare semplicemente un nome di colonna diverso richiede molto tempo, specialmente con classi con molti campi.

+0

Questo ha funzionato per me, solo un commento per qualsiasi altra persona che ha problemi con questo, assicurati di usarlo su GridView poiché sembra che non funzioni su un DataGrid. Ma questo ha risolto il mio problema :) –