2012-12-26 3 views
1

1.) *** 좋습니다. 그래서 Excel 스프레드 시트에서 가져온 DataTable을 채 웁니다. DataTable을 살펴보고 각 행을 합치고 싶습니다. 레이블이 있기 때문에 첫번째 열 &을 건너 뛰어야합니다. 나는 테이블의 각 행에 도달하려고 노력하고 그것을 총 "행 총"열에 출력하려고합니다. "숫자가"변수를 할당하려고 시도 할 때 "잘못된 캐스트가 지정되었습니다. 각 셀을 시도하고 합계합니다. 값.DataTable의 행 합계 - 유효하지 않은 캐스팅?

예 :
행 (0) -------------------- ItemA ...... ItemB ....... ItemC .. ............ RowTotal

란 (1) 회사 A ..... 12 .......... 12 .......... ... 10 .................... 34

2.) 또한 아직 도달하지 못했습니다. 내 문제가 될 수 있습니다. 그것을 DataTable의 마지막 열로 출력하려고합니다.

: dr [dt.Columns.Count - 1] = Convert.ToInt32 (sum);

의견이나 제안이 있으십니까?

  DataRow dr = dt.NewRow(); 

      int sum = 0; 
      dt.Columns.Add("Row Totals", typeof(int)); 

     for (int i = 0; i < dt.Columns.Count; i++) 
      { 
       if (dt.Columns[i].ColumnName == "Client") 
       { 
        dt.Columns.Cast<DataColumn>().Skip(1); 
       } 
       else 
       { 
        for (int j = 0; j < dt.Rows.Count - 1; j++) 
        { 
         dt.Rows.Cast<DataRow>().Skip(1); 

         int number =0; 

         number = (dt.Rows[j].Field<int>(i)); 

         sum += number; 

         dr[dt.Columns.Count - 1] = Convert.ToInt32(sum); 


       Console.WriteLine("Row : {0} , Column : {1} , Value : {2}", i,j, dt.Rows[i][j].ToString()); 
         Console.WriteLine(sum); 
        } 
        Console.ReadLine(); 
       } 
      } 

업데이트 : *는, 내가 노력하고있어 해결책이 * ** * ** * 그래서 **

입니다 ** 12/27/12 내가 알고있는 행과 열을 건너 뛰는 것은 텍스트입니다. 각 셀을 필터링하여 합계를 계산할 때 여전히 "지정된 캐스트가 유효하지 않습니다."라는 메시지가 나타납니다. 더 이상의 제안?

미리 감사드립니다.

DataRow dr = dt.NewRow(); 

      int sum = 0; 
      int number = 0; 

      for (int i = 0; i < dt.Columns.Count-1; i++) 
      { 
       if (dt.Columns[i].ColumnName == "column1") 
       { 
        dt.Columns.Cast<DataColumn>().Skip(0); 

       } 
       if (dt.Columns[i].ColumnName == "column2") 
       { 
        dt.Columns.Cast<DataColumn>().Skip(1); 
       } 
       else 
       { 

        for (int j = 0; j < dt.Rows.Count; j++) 
        { 
         dt.Rows.Cast<DataRow>().Skip(0); 
         dt.Rows.Cast<DataRow>().Skip(1); 


         //if (number != -1 && number != 0) 
         //{ 

          number = (dt.Rows[j].Field<int>(i)); 
          sum += number; 
          dr[dt.Rows.Count] = Convert.ToInt32(sum); 
         //} 
         //else 
         //{ 
         // number = 0; 
         //} 


         Console.WriteLine("Row : {0} , Column : {1} , Value : {2}", i, j, dt.Rows[i][j].ToString()); 
         Console.WriteLine(sum); 


        } 
        Console.ReadLine(); 

        dataGridView1.DataSource = dt; 
       } 


*


* 나는 모든 이전 코드를 긁어하고 테스트 시트 및 출력을 시도하고 12/27 오후 1시 반 UPDATE. 지금은 내가 마지막 행에 추가 할 때 항목을 모두 가져올 수없는 것 외에는 작동하는 것 같습니다. 당신은 정수로 null 객체를 캐스팅 수 없기 때문에 -. 나는

for (int i = 0; i < dt.Columns.Count - 2; i++) 
     { 

      for (int j = 0; j < dt.Rows.Count - 1; j++) 
      { 
       string value = dt.Rows[i][j].ToString(); 
       int num = 0; 
       bool res = int.TryParse(value, out num); 
       if (res == false) 
       { 
        num = 0; 
       } 
       else 
       { 
        int sum = 0; 

        sum += num; 
        DataRow dr; 
        dr["Totals"] = sum; 
        dt.Rows.Add(dr); 
       } 
      } 


      dataGridView1.DataSource = dt; 
     } 
    } 

답변

1

하나의 가능성은 데이터 테이블에 빈 값이 있다는 것입니다 코드의 "다른" "절에 붙어 필드 확장 방법이 실패했을 수 있습니다.

+0

오, 내가 "IsNull"을 추가 할 수 있다고 생각하지 않았습니다 - 정확합니까? – scottO

+0

@scottO null이 아닌 경우 합계를 수행하십시오. – JonH

+0

체크를했습니다. '-1'은 IsNull을 int로 사용할 수 없다고 말했기 때문에 통과 중이고 18 번째 열을 찾지 못했습니다. – scottO