Arhn - архитектура программирования

vb.net - Как я могу изменить тип значений, которые может хранить DataTable?

Я хочу добавить символы (например, % и pp) в значения, хранящиеся в DataTable, но получаю сообщение об ошибке:

Входная строка имела неправильный формат. Не удалось сохранить ‹97,0%> в фактическом столбце. Ожидаемый тип — 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"

Ответы:


1

Вы не можете изменить тип столбца таблицы данных после его заполнения.

Один из обходных путей состоит в том, чтобы добавить новый столбец строкового типа, а затем заполнить этот столбец строковыми значениями, которые вам нужны, а затем удалить столбец того типа, который вам не нужен.

20.03.2013
  • Спасибо за ваш быстрый ответ. Знаете ли вы, можно ли заранее определить тип данных? Я пытался сделать следующее (до dt=dv.totable()), но это не сработало: For i = 1 To 7 colString = New DataColumn(i) colString.DataType = System.Type.GetType(System.String) dt.Columns.Add(colString) Далее 21.03.2013

  • 2

    Если это кому-то поможет, вот как я решил проблему:

        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
    
    22.03.2013
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..