2009-04-02 8 views
6

Quiero vincular una Lista a un GridView en una página web, pero anulo la forma en que los nombres de propiedad se muestran mediante anotación. Pensé que System.ComponentModel funcionaría, pero parece que no funciona. Esto sólo está destinado a Windows Forms ?:Usar DisplayNameAttribute en ASP.NET

using System.ComponentModel; 

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

    public MyCustomClass() {} 
} 

A continuación, en la página:

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

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

}

Esto hace que con "MyFirstProperty" como encabezado de columna en lugar de "mi columna." ¿No se supone que esto funcione?

Respuesta

2

Lo dijo SirDemon ...

La respuesta parece ser que no, no se puede. Al menos no fuera de la caja. El nombre de la propiedad

El System.Web.UI.WebControls.GridView usos reflejados:

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; 
} 

Mientras System.Windows.Forms.DataGridView utiliza DisplayName si está disponible:

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; 
} 

Desafortunadamente, mientras puede anular CreateAutoGeneratedColumn, ni el DisplayName faltante ni el descriptor de propiedad subyacente se pasa, y no puede anular CreateAutoGeneratedColumns (aunque podría CreateColumns).

Esto significa que tendría que iterar sobre las propiedades reflejadas usted mismo y en otro lugar.

2

Si todo lo que le interesa es el texto del encabezado en GridView, solo use la propiedad HeaderText de cada campo que vincule. Si está autogenerando las columnas, simplemente configure HeaderText después de haber enlazado GridView.

Si desea un GridView que tenga en cuenta algún atributo que haya colocado en las propiedades de su clase encuadernada, creo que deberá crear su propio GridView.

Puedo estar equivocado, pero no he visto ninguna red ASP.NET de proveedores de control (al menos Telerik, Janus Systems e Infragistics). Si lo haces, tal vez les vendas la idea.

0

Puede hacerlo ahora en asp.net mvc2. Funciona así

+0

no funciona para mí – darcyq

1

¿Está utilizando .net4, lo que necesita hacer es establecer enabledynamicdata en la vista de cuadrícula a verdadero.

+0

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

2

Al utilizar .net 4 o posterior, puede usar gridview1.enabledynamicdata (typeof (mytype)). No he analizado todos los tipos que puede usar allí, pero sé que [displayname ("somename")] funciona bien, pero [browsable (false)] no omite la columna de la grilla. Se ve como uno de punto de deslizamiento de MS. al menos puede cambiar fácilmente el nombre de las columnas y omitir una columna. Solo declaro una variable en lugar de usar una propiedad. Tiene el mismo efecto ...

Solo por el camino, usar el diseñador para crear columnas es la salida más fácil, pero mostrar un nombre de columna diferente lleva mucho tiempo, especialmente con clases con muchos campos.

+0

Esto funcionó para mí, solo un comentario para cualquier otra persona que tenga problemas con esto, asegúrese de usar esto en un GridView ya que parece que no está funcionando en un DataGrid. Pero esto solucionó mi problema :) –

Cuestiones relacionadas