2009-06-09 4 views
1

임의적으로 예외가 발생합니다. 나는 테이블에 바코드를 입력하는 바코드 스캐너를 가지고 있습니다. 이 코드는 C#으로 작성되었습니다. 처음에는 예외를 두 번 얻을 수있었습니다. 그러나 더 이상 생성 할 수 없습니다. 예외는 System.InvalidCastException : 형식 'System.Data.DataViewManagerListItemTypeDescriptor'의 형식을 'System.Data.DataRowView'형식으로 캐스팅 할 수 없습니다. 나는 처음에 2 개의 다른 물병을 스캐닝하여 각각 2 ~ 3 번씩 생성했습니다. 그런 다음 저장 버튼을 누르면 예외가 발생합니다. 나는 다른 누군가가 이전에이 오류가 발생 했었지만 같은 맥락에서 비슷한 문제가있는 사람을 찾을 수없는 경우 Google에 조사를 시도했습니다. 예외는 다음 코드 세그먼트에서 발생합니다 :System.InvalidCastException : System.Data.DataViewManagerListItemTypeDescriptor

 
foreach (object o in this.theBindingSource.List) 
{ 
    System.Data.DataRowView dataRowView1 = (System.Data.DataRowView)o; 
} 

는 외관상으로는, 때때로, O 형의 System.Data.DataViewManagerListItemTypeDescriptor이며 형태가 아닌 System.Data.DataRowView의. 이 예외가 throw 된 이유는 무엇입니까?

BindingSource에 데이터베이스로 채워지 :

 
    XYZDataAccess.TypedDataSets.ABCTag tags 
       = XYZDataAccess.DAL.ABCTagDAL.GetABCTags(
        DeliverySession.DeliverySessionId); 
      if (tags != null && tags.Tables[0] != null) 
      { 
       theBindingSource.Sort = ""; 
       theBindingSource.DataSource = tags; 
      } 

I 바인딩 소스을 반복했던 이유는 다른 DataGridView에가 bindindg 소스의 내용이 채워 져야 할 필요가 있다는 점이다; 또한 DataGridView는 컨트롤 또는 뷰의 데이터에 대한 사용자 지정 정렬을 구현했습니다. List의 직접 액세스를 제거하는 것 외에 DisplayMember 속성을 지정해야합니까?

+0

BindingSource는 어떻게 채우고 있습니까? – HVS

+0

데이터베이스에서 BindingSource를 채우는 중입니다.

 XYZDataAccess.TypedDataSets.ABCTag tags = XYZDataAccess.DAL.ABCTagDAL.GetABCTags( DeliverySession.DeliverySessionId); if (tags != null && tags.Tables[0] != null) { theBindingSource.Sort = ""; theBindingSource.DataSource = tags; } 

+0

DataGridView.CellFormatting 이벤트에서 동일한 오류가 발생합니다. 행의 DataBoundItem이 DataRowView가 될 것으로 예상되지만 대신 DataViewManagerListItemTypeDescriptor입니다. 왜 이런 일이 발생하는지 전혀 알지 못하지만 트리거는 BindingSource.DataSource를 형식화 된 DataSet에서 null로 변경 한 다음 유효한 형식화 된 DataSet으로 다시 설정하는 것으로 보입니다. DataSource를 형식화 된 DataSet으로 다시 변경하면 오류가 발생했습니다. 오류를 피하기 위해 DataSource를 null로 설정하지 마십시오. – Qwertie

답변

2

System.Data.DataViewManagerListItemTypeDescriptor은 BindingSource의 유효한 결과입니다. 특히 바인딩 대상 항목이 .DisplayMember를 제대로 지정하지 않은 경우에 유효합니다. 바인딩 소스를 수동으로 반복하는 특별한 이유가 있습니까? 바인딩 소스의 목적은 특정 컨트롤에 바인드하여 데이터베이스에서 자동으로 채우게 할 수 있다는 것입니다.

어쨌든, 나는 다음과 같은 코드를 테스트하지 않은,하지만 당신과 함께 더 나은 행운을 가질 수있다 :

foreach (object o in this.theBindingSource) 
{ 
    System.Data.DataRowView dataRowView1 = (System.Data.DataRowView)o; 
} 

BindingSource에 이미 IEnumerable을, 그래서 당신이 직접 목록에 액세스 할 필요가 없습니다.

UPDATE

대신 통해 반복, 당신은처럼 DataGridView를 채울 같은 것을 할 수있다 : 나는 .DisplayMember가의 ListView 같은 것들에만 필요하다 생각

theBindingSource.DataSource = tags; 
yourDataGridView.DataSource = theBindingSource; 

,하지만 난 ' 그것에 대해 긍정적이지 않습니다.

+0

바인딩 소스를 반복해야하는 이유는 bindindg 소스의 내용으로 다른 DataGridView를 채워야하기 때문입니다. 또한 DataGridView는 컨트롤 또는 뷰의 데이터에 대한 사용자 지정 정렬을 구현했습니다. List의 직접 액세스를 제거하는 것 외에 DisplayMember 속성을 지정해야합니까? –

+0

BindingSource에 DataRowViews 대신 DataViewManagerListItemTypeDescriptor가 포함되어있는 이유는 무엇입니까? – Qwertie

관련 문제