vb.net-如何更改DataTable可以存储的值的类型?

vb.net-如何更改DataTable可以存储的值的类型?,vb.net,visual-studio-2010,datatable,Vb.net,Visual Studio 2010,Datatable,我想在数据表中存储的值中添加字符(如%和pp),但收到一条错误消息: 输入字符串的格式不正确。无法存储在实际列中。所需类型为Decimal 如何更改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

我想在
数据表
中存储的值中添加字符(如
%
pp
),但收到一条错误消息:

输入字符串的格式不正确。无法存储在实际列中。所需类型为Decimal

如何更改
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"

填充数据表列后,无法更改其类型


解决方法之一是添加一个字符串类型的新列,然后用所需的字符串值填充该列,然后删除不需要的列。

如果这对某人有帮助,我就是这样解决问题的:

    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

谢谢你的快速回答。您知道是否可以预先定义数据类型吗?我尝试执行以下操作(在dt=dv.totable()之前),但没有成功:对于I=1到7,colString=newdatacolumn(I)colString.DataType=System.Type.GetType(“System.String”)dt.Columns.Add(colString)Next