'System.Data.DataRowView'형식의 개체를 'System.Data.DataRow'형식으로 캐스팅 할 수 없습니다.

2011-01-12 3 views
2

해결 방법을 찾은 이후의 오류에 대한 답변을 게시합니다. 유형 'System.Data.DataRowView'의 개체를 캐스팅 할 수 없습니다 'System.Data.DataRow''System.Data.DataRowView'형식의 개체를 'System.Data.DataRow'형식으로 캐스팅 할 수 없습니다.

// Old line 
// rpOutils.DataSource = ds.Tables[0].Select("rnco_lang = '" + ddlLang.SelectedValue + "'"); 
// rpOutils.DataSource = ds; // New line that caused the error. I just wanted to pass a DataSet 
rpOutils.DataSource = ds.Tables[0].Select(); // New line with the solution. 
rpOutils.DataBind(); 

protected void rpOutils_ItemDataBound(object sender, RepeaterItemEventArgs e) 
     { 
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
      { 
       DataRow row = (DataRow)e.Item.DataItem; // I received the System.InvalidCastException 

...

을 입력 할 :

나는 asp.net에서 오류가 발생했습니다 데이터 집합에서 DataRowView를 반환하고 문제의 원인이되는 선이 DataRow를 예상했습니다.

해결책을 찾았지만 찾을 수 없어서 해결책을 찾았습니다. 감사.

+0

오류가 명시된대로 : DataRowView row = (DataRowView) e.Item.DataItem; – Win

답변

6

DataTable에 데이터 바인딩 할 때 데이터 바인딩 엔진은 DataTable의 IListSource 구현을 호출하고 DataView에 바인딩합니다.

DataView는 DataRowView 개체를 보유하고 DataRow는 보유하지 않으므로 바인딩 된 개체를 DataRow로 직접 캐스팅 할 수 없습니다.
대신에 DataRowView으로 전송 한 다음 속성을 가져와야합니다.

왜 이런 현상이 발생하는지에 대한 자세한 설명은 my blog을 참조하십시오.

0

동적 데이터를 사용하십시오. 채워진 속성을 채 웁니다.

private void GvRowDataBound(object sender, GridViewRowEventArgs e) 
    { 

     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      dynamic data = e.Row.DataItem; 
      TextBox txtType = (TextBox)e.Row.FindControl("txtbox"); 
      if (data.IsCheked) 
      { 
       txtType.Enabled = false; 
      } 
     } 
    } 
관련 문제