2017-01-25 1 views
1

리플렉션을 사용하여 datagridview에서 연결된 목록을 업데이트하려고하므로 각 속성에 대해 코드 줄을 작성할 필요가 없습니다.클래스 속성 가져 오기 및 사용

클래스 :

속성 당 코드의
public class clsUnderlying 
{ 
    public int UnderlyingID { get; set; } 
    public string Symbol { get; set; } 
    public double RiskFreeRate { get; set; } 
    public double DividendYield { get; set; } 
    public DateTime? Expiry { get; set; } 
} 

한 줄 작동 :

UdlyNode.Symbol = (string)GenericTable.Rows[IDX].Cells["Symbol"].Value; 
UdlyNode.Expiry = (DateTime)GenericTable.Rows[IDX].Cells["Expiry"].Value; 
etc. 

을하지만 많은 클래스와 클래스 속성이있다, 그래서 루프와 반사를 사용하는 것을 선호 것, 그러나 나는 어떻게, 그리고 나의 시도 아래에 오류가 있는지 잘 모르겠습니다.

PropertyInfo[] classProps = typeof(GlobalVars.clsUnderlying).GetProperties(); 
foreach (var Prop in classProps) 
{ 
    Type T = GetType(Prop); // no overload for method GetType 
    UdlyNode.Prop.Name = Convert.T(GenericTable.Rows[IDX].Cells[Prop.Name].Value); // error on "Prop.Name" and "T.(" 
} 

내 이해를위한 제안이나 링크를 제공해 주셔서 감사합니다.

+0

'DataSource'로 바인딩 된 목록을 'DataGridView'에 설정 했습니까? –

+0

dgv 데이터 소스는 연결 목록에서 오는 바인딩 목록입니다. 연결된 목록은 dgv – Zeus

답변

1

BindingSource을 사용하는 것이 좋습니다. 그리드에서 변경된 값이 자동으로 목록에 변경됩니다이 방법 :

BindingSource bs = new BindingSource(); 
bs.DataSource = yourList; 

dataGridView1.DataSource = bs; 

이 수동으로 그리드에 변경된 값을 업데이트 할 사건을 해결한다.

+0

에 직접 바인딩되어 있지 않습니다. 덕분에 코드 – Zeus

+0

을 사용해 주셔서 감사합니다. 그 작업 - 저는 그렇게 쉬운 해결책이 없다고 생각했습니다. – Zeus

+0

@ 제우스 환영합니다. 내가 넘어 질 때까지 나는 그 어느 것도하지 않았다. 그 전에 수동으로 루핑하고 값을 검색했습니다. –

2

반영 기반 루프는 다른 구문 사용해야 :

  • 속성 유형 PropertyInfo의 속성이다
  • ConvertSystem.Type 걸리는 ChangeType 방법을 가지고, 그리고
  • 속성이 할당 요구
  • 가 될 호출하여 완료 SetValue

그러므로 루프는 li 이 경우 :

foreach (var p in classProps) { 
    p.SetValue(
     UdlyNode 
    , Convert.ChangeType(
      GenericTable.Rows[IDX].Cells[p.Name].Value 
     , p.PropertyType 
     ) 
    ); 
} 
+0

정말 감사합니다. 죄송합니다 - 나는 오직 하나의 답을 수락 할 수 있으며 몽의 대답은 더 간단합니다. 그러나 나는 답장을 upvoted하고 다른 곳에서 코드를 사용할 것입니다. – Zeus

관련 문제