2012-09-22 7 views
1

I DataGridView를 채울 수있는 다음 코드가Linq에있는 DataGridView에 다시 KeyValuePair (또는 유사)에

 var results = from loc in dtLocations.AsEnumerable() 
         join con in dtContacts.AsEnumerable() on (int)loc["contactid"] equals (int)con["id"] 
         select new 
         { 
          id = con["id"], 
          mpoc = loc["mpoc"], 
          directno = loc["directno"], 
          extension = loc["extension"], 
          faxno = loc["faxno"], 
          billing = con["billing"], 
          fullname = con["fullname"], 
          mobno = con["mobno"], 
          email = con["email"] 
         }; 

     dgv.AutoGenerateColumns = false; 
     dgv.DataSource = results.ToList<object>(); 

하지만 내가 셀을

private void dgvLocations_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 
     DataGridView dgv = sender as DataGridView; 
     ????? vals = ((List<object>)dgv.DataSource)[e.RowIndex]; 
     object id = vals.id; //errors of course 
    } 

I을 클릭하면 다시 읽어 질수 Visual Studio의 감시자 패널에서 목록에있는 요소를 확인할 수 있음을 알 수 있지만 다시 읽으려면 값을 설정해야하는 유형을 파악할 수 없습니다. (

enter image description here

+0

익명 형식입니다. * 정적 유형 (소개되었을 때를 제외하고)으로 표현 될 수 없습니다. 명명 된 (익명이 아닌) 유형이나'동적'또는 (더 칙칙한,'객체'와 명시 적 리플렉션)을 사용하십시오. –

답변

1

(new { .. })은 anonymous type을 소개합니다. 익명 형식 을 정적으로 알려진 ("컴파일 타임") 이름으로 지정할 수 없습니다.

입력 명명 된 (비 익명)를 사용 (MyRow 필요한 특성을 가진 이미 정의 된 클래스이다).

// Put data in non-anonymous type 
select new MyRow { 
    id = .., 
} 

// Now can use a name statically 
MyRow row = (MyRow)data[rowIndex]; 

또한 dynamic 유형이 C#을/NET4 +와 함께 사용할 수는. 또는 심지어 더 칙칙한, object 및 명시 적 리플렉션 dynamic 형식화 된 식은 효과적으로 킥 반사를 효과적으로 처리하지만, object과 마찬가지로 정적 입력 정보는 여전히 손실됩니다.

+0

안녕 Pst. '역동적 인 것'에 대해 자세히 설명해 주시고 좀 더 자세한 정보를 알려주시겠습니까? 매우 감사! – Christian

+0

@Christian 참조를 추가했습니다 (그리고 난센스 덮어 쓰기를 수정했습니다 : - /). –

관련 문제