代码之家  ›  专栏  ›  技术社区  ›  jlembke

在ASP.NET中使用DisplayNameAttribute

  •  7
  • jlembke  · 技术社区  · 16 年前

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

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

    这将以“MyFirstProperty”作为列标题而不是“My column”进行呈现。这不应该工作吗?

    5 回复  |  直到 16 年前
        1
  •  3
  •   Stanley Gillmer    9 年前

    使用.net 4或更高版本时,可以使用gridview1.enabledynamicdata(typeof(mytype))。我还没有查看您可以在那里使用的所有类型,但是我知道[displayname(“somename”)]工作得很好,但是[browsable(false)]并没有从网格中忽略列。这看起来像是一个从女士编织一滑一,至少你可以很容易地重命名列名和省略列我只是声明一个变量,而不是使用属性。它有同样的效果。。。

        2
  •  2
  •   SirDemon    16 年前

    如果您只关心GridView中的标题文本,那么只需使用绑定的每个字段的HeaderText属性即可。如果要自动生成列,只需在绑定GridView后设置HeaderText。

    如果希望GridView考虑绑定类属性上的某些属性,我相信您需要创建自己的GridView。

        3
  •  2
  •   Ruslan    16 年前

    SirDemon说的话。。。

    答案似乎是不,你不能。至少不是现成的。

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

    System.Windows.Forms.DataGridView使用DisplayName(如果可用):

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

    不幸的是,虽然您可以覆盖CreateAutoGeneratedColumn,但缺少的DisplayName和基础属性描述符都不会被传递,并且您不能覆盖CreateAutoGeneratedColumns(尽管您可以创建Columns)。

    这意味着您必须自己和在其他地方迭代反射属性。

        4
  •  1
  •   cjensen    15 年前

    如果您使用的是.net4,您需要做的是将网格视图上的enabledynamicdata设置为true。

        5
  •  0
  •   thitemple    15 年前

    现在可以在asp.net mvc2上执行此操作。它就是这样工作的