Как правильно определить шаблон оператора Like (VisualBasic) в рамках «DataColumn.Expression» и использование лямбда-выражения? - PullRequest
0 голосов
/ 23 мая 2019

это мой первый вопрос по SO.Пожалуйста, прости меня, если я делаю ошибки так, как я прошу, и, пожалуйста, позволь мне не делать этого, если да.

В настоящее время я пытаюсь программно отсортировать элементы из ComboBox.

Данные, которые я получаюзаполнение CB теперь обрабатывается следующим образом: - запрос из базы данных (sqllite) - заполнение таблицы данных результатом - заполнение диапазона элементов из выпадающего списка

Поскольку данные имеют как строки, содержащие цифры, так и не содержащие цифрыобычные функции сортировки (SQL, DataTable, ComboBox) не выполняют эту работу.(Изображение)

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

Код:

(Пожалуйста, сосредоточьтесь на первом блоке «Попробуйте». Я также скопировал остальную часть кода, потому что я думаю, что это объясняет мои намерения).

' This function adds items to the referred ComboBox "cb" based on the data from the given DataTable "tbl". 
' "tbl" in every case consists of one column named "value":
' -The number of rows varies.
' -The column type is undefined (varies too).
' -Data can be like: "Sicherungsscheibe", "156.4", "780", "M10" (Examples!) 
'  These are values which are describing attributes like "length", "material", "thread", "diameter", "type".
Sub AddItemsOfTableToComboBox(ByRef cb As ComboBox, tbl As DataTable)


    ' Use temporary DataTable and copy each value from within the source column to "tempTB", 
    ' beacause a type conversion on already source bound columns is not possible. 
    Dim tempDT As New DataTable("tempDT")
    Dim DataSet1 As New DataSet
    DataSet1.Tables.Add(tempDT)
    tempDT = tbl.Clone()
    tempDT.Columns("value").DataType = GetType(String)
    For Each row As DataRow In tbl.Rows
        tempDT.ImportRow(row)
    Next
    ' Fill first temporary column "Scol1". Check first char (only) for a letter. This approach should be sufficient for values like "M12". 
    Try
        ' This one works, and gives the desired feedback: It copies every string from the column "value" to "Scol1" which are beginning with "B".
        tempDT.Columns.Add(New DataColumn("Scol1", GetType(String)) With {.Expression = "iif (substring(value,1,1) like 'B',substring(value,1,len(value)),'else')"})
        ' Same as above, beacuse case insensitive.
        tempDT.Columns.Add(New DataColumn("Scol1", GetType(String)) With {.Expression = "iif (substring(value,1,1) like 'B',substring(value,1,len(value)),'else')"})

        ' This one works. Here I want to copy every non digit char. But however, the feedback is always 'else'.
        tempDT.Columns.Add(New DataColumn("Scol1", GetType(String)) With {.Expression = "iif (substring(value,1,1) like '\D',substring(value,1,len(value)),'else')"})

        ' Doenst work: '[A-Z]' is invalid.  
        tempDT.Columns.Add(New DataColumn("Scol1", GetType(String)) With {.Expression = "iif (substring(value,1,1) like '[A-Z]',substring(value,1,len(value)),'else')"})

        ' This one works. But feedback is always 'else'.
        tempDT.Columns.Add(New DataColumn("Scol1", GetType(String)) With {.Expression = "iif (substring(value,1,1) like '[[]A-Z[]]',substring(value,1,len(value)),'else')"})
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
    ' Fill second temp column "Scol2"
    Try
        tempDT.Columns.Add(New DataColumn("Scol2", GetType(Integer)) With {.Expression = "Convert(iif (substring(value,2,len(value)) like '\d',substring(value,2,len(value)),'0'),  'System.Int32')"})
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

    'Dim View As New DataView(tbl)
    'View.Sort = "Scol1,Scol2"
    'View.Table = DataSet1.Tables("tempDT")

    ' Here I would had convert "tempDT" into "tbl" again somehow.

    With cb
        .Items.Clear()
        Dim items = tbl.AsEnumerable().Select(Function(d) DirectCast(d(0).ToString(), Object)).ToArray()
        If items.Length > 0 Then
            .Parent.Enabled = True
            .Items.AddRange(items)
            .Sorted = True
        Else
            ' Disable corresponding Panel(parent) if for some reason there are no items to fill the ComboBox with.
            ' (f.e. if there's a recorded class but no corresponding subclass, or
            ' there's a recorded class/category without any parts referred to it.)
            .Parent.Enabled = False
        End If
    End With
End Sub

Я ожидаю, что шаблон для определения группы символов будет работать.К настоящему времени я не очень знаком / опыт работы с использованием лямбда-выражений, обработкой DataTables / Views или использованием регулярных выражений.

... Есть идеи, где я делаю ошибки?

1 Ответ

0 голосов
/ 23 мая 2019

Это так

"ColumnName LIKE '*value*'"
...