2016-12-06 2 views
-1

StudentViewModel 개체 목록이 있습니다. 이 목록을 DataGridView로 바인딩하고 바인딩 된 모델의 속성에 따라 열 생성을 자동으로 설정합니다. StudentViewModel에서 C# LINQ 사용자 지정 특성이있는 경우 속성 선택

public async Task LoadGridView() 
    { 
     Tuple<List<StudentViewModel>, int> result = await App.StudentService.SearchAsync(studentRequestModel); 
     dataGridView1.DataSource = null; 
     dataGridView1.DataSource = result.Item1; 
    } 

, 나는 정의와 속성 중 일부는 IsViewable 속성 장식했다.

[AttributeUsage(AttributeTargets.Property)] 
public class IsViewable: Attribute 
{ 
    public bool Value { get; set; } 
} 

사용 :

 [IsViewable(Value = true)] 
     public string Name { get; set; } 

아이디어는 단지 UI 컨트롤에 바인딩하기 전에, 나는 목록을 필터링 내 그리드로 채워집니다 있도록 익명 개체의 새 목록을 만들고 싶어한다 선택한 속성 만.

enter image description here

참고 : 나는 그리드와 관련된 별도의 뷰 모델을 만들 싶지 않아요. 성능 문제가 발생하면 리팩터링합니다.

+2

수있는 방법이 없습니다 동적으로 유전자 :

enter image description here

전체 프로젝트는 foyzulkarim/GenericComponents

발신자/사용 여기에서 찾을 수 있습니다 컴파일 타임에 속성을 알아야하기 때문에 익명 형식을 평가합니다. 사전을 사용하여 이름과 값을 매핑하거나 'ExpandoObject'를 채우고 '동적'을 사용하여 속성과 유사한 구문을 얻을 수 있습니다. 그 중 하나를 만들거나 새로운 'o'를 만들고 그 속성을 가진 속성을 동적으로 복사하십시오. –

+0

이 답변은 도움이 될 수 있습니다 : https://stackoverflow.com/a/4938442/1220550 –

+1

만약 내가 올바르게 이해한다면 당신은 이러한 속성들이'DataGridView'에 의해 나타나길 원하지 않을 것입니다. 이것이 원하는 경우, 커스텀'IsViewable' 대신에'[Browsable (false)]'속성을 사용하여 얻을 수 있습니까? –

답변

0

catch는 동적 목록을 serialize 한 다음 deserialize합니다. 그런 다음 동적 목록을 datagridview로 바인딩하면 매력처럼 작동합니다.

 Type type = typeof(StudentViewModel); 
     PropertyInfo[] properties = type.GetProperties(); 
     var infos = properties.Where(x => x.CustomAttributes.Any(y => y.AttributeType == typeof(IsViewable))).ToList(); 
     List<StudentViewModel> models = result.Item1; 
     List<dynamic> list = models.Select(x => GetValue(x, infos)).ToList(); 
     string serializeObject = JsonConvert.SerializeObject(list); 
     var deserializeObject = JsonConvert.DeserializeObject<List<dynamic>>(serializeObject); 
     dataGridView1.DataSource = deserializeObject; 

enter image description here

enter image description here

관련 문제