2012-03-15 6 views
0

Excelシートからデータを読み込んでDatatableの行を追加するVB.NET関数を使用しました。データテーブル内の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) 

だからあなたのコードは、次のようなものになるだろう(私はそれがあなたの混乱の一部を引き起こしていると思うので、私は新しい行変数の名前を変更した注意してください)

 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という整数を定義します。私はまた、 "ValueToLoad" varが正しいことをデバッグによって見ることができます。しかし、データはデータローに追加されませんでした。空の行しか見ることができません。 – Jotric

+0

名前とインデックスの両方がうまくいきます - 私の主張は、** TableName ** .NewRow(indice)= ValueToLoad'を実行するべきではなく、 'NewRow(indice)= ValueToLoad'に代わるものです。次に、コードをステップ実行すると、行がローカルに追加され、その行が停止しているByVal/ByRefの変更が行われます。 – kaj

+0

オブジェクトの新しいインスタンスを作成しない場合、オブジェクトByRefを渡す必要はありませんオブジェクトとしてのメソッド(例えば、 'TableName = new DataTable')は、ReferenceTypesです。 – Nicholas

関連する問題