在ASP.NET中使用DisplayNameAttribute

时间:2009-04-02 22:49:27

标签: asp.net

我想将List绑定到网页上的GridView,但是覆盖属性名称通过注释显示的方式。我认为System.ComponentModel可以工作,但这似乎不起作用。这仅适用于Windows Forms吗?:

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”作为列标题而不是“我的列”。这不应该起作用吗?

5 个答案:

答案 0 :(得分:3)

使用.net 4或更高版本时,您可以使用gridview1.enabledynamicdata(typeof(mytype))。我没有看过你可以在那里使用的所有类型,但我知道[displayname(“somename”)]工作正常但是[browsable(false)]没有省略网格中的列。它看起来像一个来自MS的针织一个滑。至少你可以轻松地重命名列名并省略列我只是声明一个变量而不是使用属性。它有同样的效果......

顺便说一下,使用设计器创建列是一种简单的方法,但只是显示不同的列名,需要花费很多时间,特别是对于包含许多字段的类。

答案 1 :(得分:2)

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

如果你想要一个GridView,它考虑了你在绑定类的属性上放置的一些属性,我相信你需要创建自己的GridView。

我可能错了,但我没有看到来自控制供应商的任何ASP.NET网格(至少Telerik,Janus Systems和Infragistics)这样做。如果你这样做,可能会把想法卖给他们。

答案 2 :(得分:2)

SirDemon说的是什么......

答案似乎是否定,你不能。至少没有开箱即用。

System.Web.UI.WebControls.GridView使用反射属性的名称:

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(尽管您可以创建CreateColumns)。

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

答案 3 :(得分:1)

您使用的是.net4,您需要做的是将网格视图上的启用动态数据设置为true。

答案 4 :(得分:0)

你现在可以在asp.net mvc2上做到这一点。它就像那样