2011-08-29 4 views
1

사용자가 선택한 리포트 유형에 따라 콜렉션을 GridView에 바인딩해야합니다.콜렉션 생성/디자인 질문

각 보고서는 약간 다르지만 많은 열을 가진 동일한 기본 결과 집합을 사용합니다. 바인딩하기 전에 결과 집합을 반복하고 간단한 컬렉션 ('column1', 'column2', 'column3'이라는 3 개의 문자열 변수)에 복사하려고합니다.

코드 :

namespace etc.etc.etc 
{ 
    public class ReportEntity 
    { 
     public string column1 { get; set; } 

     public string column2 { get; set; } 

     public string column3 { get; set; } 
    } 
} 

List<ReportEntity> a = new List<ReportEntity>(); 
ReportEntity[] b = new ReportEntity[results.Length]; 
for (int i = 0; i < results.Length; i++) 
{ 
    //a[i].column1 = results[i].class.desc; 
    //a[i].column2 = results[i].student.firstname; 
    //a[i].column3 = results[i].timescanned.ToString(); 

    //b[i].column1 = results[i].class.desc; 
    //b[i].column2 = results[i].student.firstname; 
    //b[i].column3 = results[i].timescanned.ToString(); 
} 

의 주석 내가 a의 값을 설정 Index was out of range. Must be non-negative and less than the size of the collection.을 제공합니다. b에 대한 값 설정 위치에서 주석 처리를 해제하면 Object reference not set to an instance of an object.이됩니다.

results에는 많은 레코드가 있습니다. 나는 무엇을 잘못 할 수 있 었는가?

답변

2
  • 당신은 첫번째 경우 IndexOutRangeException를 얻을 수 있지만,이 목록은 모든 요소를 ​​포함하지 않습니다

    는 다른 방법으로, LINQ에서 선택을 사용합니다.

  • results.Length의 배열을 채우었으므로 두 번째 경우는 NullReferenceException이됩니다. nulls입니다.

ReportEntity의 인스턴스를 명시 적으로 작성하고 기본 데이터 구조를 삽입해야합니다.

List<ReportEntity> a = new List<ReportEntity>(); 
ReportEntity[] b = new ReportEntity[results.Length]; 
for (int i = 0; i < results.Length; i++) 
{ 
    a.Add(new ReportEntity() {column1 = results[i].class.desc, 
           column2 = results[i].student.firstname, 
           column3 = results[i].student.firstname } 

    b[i] = new ReportEntity() {column1 = results[i].class.desc, 
           column2 = results[i].student.firstname, 
           column3 = results[i].student.firstname } 
} 

또는 당신이 Select extenssion 방법으로 LINQ 수 그것이 다른 답변에서 언급 한 것처럼합니다.

1

리스트에 값을 추가하려면 Add 메소드를 사용하십시오. 당신은 그냥 목록의 인스턴스를 생성하기 때문에

var a = results.Select(r => new ReportEntity { 
    column1 = r.class.desc, 
    column2 = r.student.firstname, 
    column3 = r.timescanned.ToString() 
}).ToList(); 
+0

오, 예. 하지만 그 엔티티 클래스에 생성자가 필요합니다. – cring

+0

위 구문은 기본값 이외의 다른 생성자를 필요로하지 않습니다. – flq