2012-03-15 3 views
0

Excel 시트에서 데이터를 읽고 Datatable에 행을 추가하는 VB.NET 함수가 있습니다.Datatable의 Addin Datarow

Private Function LoadDataToRows(ByVal TableName As DataTable, ByVal Header As System.Collections.Specialized.StringCollection) As Boolean 
     Dim HeaderDataExcel As String = String.Empty 'Data Header 
     For r As Integer = 1 To RangeDataArray.Rows.Count 
      Dim NewRow As DataRow = TableName.NewRow 
      For c As Integer = 1 To RangeDataArray.Columns.Count 
       If Not (IsNothing(DirectCast(ActiveSheetToManipulate.Cells.Item(r + DataStartRow, c), Excel.Range).Value)) Then 
        Dim ValueToLoad As String = TryCast(ActiveSheetToManipulate.Cells.Item(r + DataStartRow, c), Excel.Range).Value.ToString 

        HeaderDataExcel = TryCast(ActiveSheetToManipulate.Cells.Item(DataStartRow, c), Excel.Range).Value.ToString 
        Dim indice As Integer = Header.IndexOf(HeaderDataExcel) 
        TableName.NewRow(indice) = ValueToLoad 
       Else 
        'Todo 
       End If 
      Next 
      TableName.Rows.Add(NewRow) 
     Next 
     Return True 
    End Function 

그러나 데이터가 테이블에 추가되지 않았습니다. 어떤 제안?

답변

1

나는 VB.NET 프로그래머 모르겠지만 아마 당신은 오히려

ByVal의

보다하는 ByRef 전달 될 DataTable의 매개 변수를 변경해야 할뿐만 아니라입니다 정확히 이루어 NewRow 열을 채우기위한 구문? TableName.NewRow를 사용하는 대신 생성 된 새 데이터 행 인스턴스를 사용해야합니다?

내가 더 좋아라고 생각 :

Dim newRow As DataRow = TableName.NewRow() 

newRow ("ColumnName") = "MyNewValue" ' Add specifying column name 
newRow (2) = "AnotherValue" ' Add specifying column index 

TableName.Rows.Add(newRow) 

그래서 코드가 같은 것을 할 것 (I가 당신의 혼란의 일부 원인이 있다고 생각하기 때문에 나는 새 행 변수의 이름을 변경 한주의) 다음

 Dim rowToAdd As DataRow = TableName.NewRow() 
     For c As Integer = 1 To RangeDataArray.Columns.Count 
      If Not (IsNothing(DirectCast(ActiveSheetToManipulate.Cells.Item(r + DataStartRow, c), Excel.Range).Value)) Then 
       Dim ValueToLoad As String = TryCast(ActiveSheetToManipulate.Cells.Item(r + DataStartRow, c), Excel.Range).Value.ToString 

       HeaderDataExcel = TryCast(ActiveSheetToManipulate.Cells.Item(DataStartRow, c), Excel.Range).Value.ToString 
       Dim indice As Integer = Header.IndexOf(HeaderDataExcel) 
       rowToAdd(indice) = ValueToLoad 
      Else 
       'Todo 
      End If 
     Next 
     TableName.Rows.Add(rowToAdd) 
+0

나는 인덱스와 함께 sintax를 사용한다. VB 코드를 읽는다면, 나는 indice라는 컬럼의 인덱스를 정의한다. 또한 디버그를 통해 var "ValueToLoad"가 올바른지 확인할 수 있습니다. 그러나 datarow에 데이터가 추가되지 않았습니다. 빈 행만 볼 수 있습니다. – Jotric

+0

이름과 색인이 모두 작동합니다. * ** ** TableName **. NewRow (indice) = ValueToLoad' 및 대신'NewRow (indice) = ValueToLoad'를 수행해서는 안되는 것이 더 중요합니다. 그런 다음 코드를 단계별로 실행하면 행이 로컬에 추가되어 작동을 멈추는 ByVal/ByRef 변경이 발생합니다. – kaj

+0

개체의 새 인스턴스를 만들지 않으면 ByRef를 전달할 필요가 없습니다. 객체로서의 메소드 (예 :'TableName = new DataTable')는 ReferenceTypes입니다. – Nicholas