2013-03-20 63 views
0

我要添加存儲在一個DataTable值的字符(如%pp),但我收到一條錯誤消息:vb.net - 如何更改DataTable可以存儲的值的類型?

輸入字符串的不正確的format.Couldn't店< 97.0 %>在實際列中。預期的類型是十進制。

如何更改DataTable可存儲的值的類型?

Dim dv As New System.Data.DataView 
Dim dt As New System.Data.DataTable 
dv = SQL_Customer.Select(DataSourceSelectArguments.Empty) 
dt = dv.ToTable() 

dt.Rows(1)(1) = CStr(dt.Rows(1)(1)) & "%" 
dt.Rows(1)(2) = CStr(dt.Rows(1)(2)) & "%" 
dt.Rows(1)(3) = CStr(dt.Rows(1)(3)) & "%" 
dt.Rows(1)(4) = CStr(dt.Rows(1)(4)) & "pp" 

回答

0

一旦數據表格列填充完畢,您就無法更改其類型。

解決辦法之一是添加一個字符串類型的新列,然後用您需要的字符串值填充該列,然後刪除不需要的類型的列。

+0

感謝您的快速答覆。你知道是否可以預先定義數據類型?我嘗試了以下操作(在dt = dv.totable()之前),但它不起作用:對於i = 1至7 colString = New DataColumn(i) colString.DataType = System.Type.GetType(「System .String「) dt.Columns.Add(colString) Next – Selrac 2013-03-20 20:32:49

0

如果這可以幫助別人,這是我解決了這個問題:

Dim dv As New System.Data.DataView 
    Dim dt As New System.Data.DataTable 
    Dim dt2 As New System.Data.DataTable 
    Dim SelectedIndex As Object 

    If datagrid.SelectedIndex = "-1" Then SelectedIndex = 0 Else SelectedIndex = GV_Cust.SelectedIndex 

    'Populate Dataview with data in SQL Query for Customer KPIs 
    dv = SQL_Customer.Select(DataSourceSelectArguments.Empty) 
    'Populate table with data from dataview. Note that the data is formated as per data loaded. So if number is loaded, then format for the cell is number. This creates a problem when adding percentages 
    dt = dv.ToTable() 

    'New colums are added as string format in the dataTable so that % and pp can be added 
    Dim column As DataColumn 
    For i = 1 To 6 
     ' Create second column. 
     column = New DataColumn() 
     column.DataType = System.Type.GetType("System.String") 
     column.ColumnName = i 
     column.AutoIncrement = False 
     column.Caption = i 
     column.ReadOnly = False 
     column.Unique = False 
     ' Add the Column to the DataColumnCollection. 
     dt.Columns.Add(column) 
    Next 

    'New columns are populated and calculations for variances are calculated 
    For j = 0 To 2 
     For i = 0 To 4 
      dt.Rows(i)(7 + j) = dt.Rows(i)(1 + j) & "%" 
      dt.Rows(i)(10) = (dt.Rows(i)(1) - dt.Rows(i)(2)) & "pp" 
      dt.Rows(i)(11) = (dt.Rows(i)(1) - dt.Rows(i)(3)) & "pp" 
      dt.Rows(i)(12) = (dt.Rows(i)(2) - dt.Rows(i)(3)) & "pp" 
     Next 
     For i = 5 To 6 
      dt.Rows(i)(7 + j) = dt.Rows(i)(1 + j) 
      If dt.Rows(i)(2) = 0 Then dt.Rows(i)(10) = 0 & "%" Else dt.Rows(i)(10) = Math.Round((((dt.Rows(i)(1)/dt.Rows(i)(2))) - 1) * 100, 1) & "%" 
      If dt.Rows(i)(3) = 0 Then dt.Rows(i)(11) = 0 & "%" Else dt.Rows(i)(11) = Math.Round((((dt.Rows(i)(1)/dt.Rows(i)(3))) - 1) * 100, 1) & "%" 
      If dt.Rows(i)(3) = 0 Then dt.Rows(i)(12) = 0 & "%" Else dt.Rows(i)(12) = Math.Round((((dt.Rows(i)(2)/dt.Rows(i)(2))) - 1) * 100, 1) & "%" 
     Next 
    Next 

    'Old columns are deleted and new wones are renamed 
    dt.Columns.Remove("A") 
    dt.Columns("1").ColumnName = "A" 
    dt.Columns.Remove("B") 
    dt.Columns("2").ColumnName = "B 
    dt.Columns.Remove("C") 
    dt.Columns("3").ColumnName = "C" 
    dt.Columns.Remove("D") 
    dt.Columns("4").ColumnName = "D" 
    dt.Columns.Remove("D") 
    dt.Columns("5").ColumnName = "E" 
    dt.Columns.Remove("F") 
    dt.Columns("6").ColumnName = "F" 

    'Customer grid is populated, a selection button is added and the first row is selected 
    datagrid.DataSource = dt 
    datagrid.AutoGenerateSelectButton = True 
    datagrid.DataBind() 
    datagrid.SelectedIndex = SelectedIndex