2009-04-02 5 views
6

웹 페이지에서 List를 GridView에 바인딩하려고하지만 속성 이름이 주석을 통해 표시되는 방식보다 우선합니다. System.ComponentModel이 작동 할 것이라고 생각했지만 작동하지 않는 것 같습니다. 이 Windows에서만 의미하는 것은 페이지에?ASP.NET에서 DisplayNameAttribute 사용

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"로 렌더링 이게 효과가 있지 않니?

답변

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가 표시 이름을 사용하는 동안 사용할 수있는 경우 :

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를 사용할 수도 있음).

이것은 반사 된 속성을 직접 또는 다른 장소에서 반복해야한다는 것을 의미합니다.

2

GridView의 머리글 텍스트 만 신경 쓰는 경우 바인딩 한 각 필드의 HeaderText 속성을 사용하면됩니다. 열을 자동 생성하는 경우 GridView를 바인딩 한 후에 HeaderText를 설정하면됩니다.

바인딩 된 클래스의 속성에 배치 한 일부 특성을 고려한 GridView를 원한다면 자신 만의 GridView를 만들어야한다고 생각합니다.

내가 틀릴 수도 있지만 컨트롤 공급 업체 (적어도 Telerik, Janus Systems 및 Infragistics)의 ASP.NET Grid를 보지 못했습니다. 네가 그렇게한다면, 그 아이디어를 그들에게 팔아라.

0

이제 asp.net mvc2에서 할 수 있습니다.

+0

나를 위해 – darcyq

1

.net4를 사용하고 있습니까? 그리드 뷰의 enabledynamicdata를 true로 설정해야합니다.

+0

http://msdn.microsoft.com/en-us/library/system.web.ui.datacontrolextensions.enabledynamicdata(v=vs.110).aspx GRID1 작동하지 않습니다.EnableDynamicData (typeof (TypeX)) – jmw

2

.net 4 이상을 사용하는 경우 gridview1.enabledynamicdata (typeof (mytype))를 사용할 수 있습니다. 거기에 사용할 수있는 모든 유형을 보지 못했지만 [displayname ("somename")]은 잘 작동하지만 [browsable (false)]는 그리드에서 열을 생략하지 않는다는 것을 알고 있습니다. MS에서 미끄러지 듯 뜨다. 최소한 열 이름의 이름을 쉽게 바꿀 수 있고 속성을 사용하는 대신 변수를 선언 한 열을 생략 할 수 있습니다. 그것은 같은 효과가 있습니다 ...

다만 디자이너를 사용하여 열을 만드는 것은 쉬운 방법이지만 다른 열 이름이 여러 필드가있는 클래스의 경우 특히 많은 시간이 걸립니다.

+0

이것은 저에게 효과적입니다. 다른 사람이이 문제를 겪고있는 경우, DataGrid에서 작동하지 않는 것처럼 보이기 때문에 GridView에서이 문제를 사용해야합니다. 그러나 이것은 내 문제를 해결 :) –

관련 문제