2

我将如何创建具有以下列的数据网格视图:

  • [部件序列号]
  • [零件号]
  • [约会时间]
  • [描述]
  • [边]
  • 【活动成果】
  • [活动结果信息]

我试图创建一个这样的 dgv,但我的问题在于排序。所有字段都以字符串形式出现,我根本无法对 [Date Time] 进行排序。是否可以有一个包含日期时间数据类型或字符串值的列的 dgv?


有关我的场景的更多信息:我有一个带有列表框的表单,由最终用户手动填写。此列表框包含我们的 SQL 数据库中可能存在/可能不存在的序列号。我调用的第一个函数是检查 s/n 是否存在并根据它的存在返回 true 或 false。如果它存在,那么我将它存储在一个字符串数组中;如果不是,它存储在 List(Of String) 中。存储它们后,我使用它们返回 tsql 代码(SQLstrIn 和 SQLstrNotIn)。这段代码很好地做到了这一点:

Dim IsIn As String = ""
        Dim IsNotIn As New List(Of String)


        For Each line As String In SNList.Items
            If SQLData.CheckIfInDb("'" & line & "'") = True Then
                IsIn += "'" & line & "',"
            Else : IsNotIn.Add("('" & line & "')")
            End If
        Next

        If IsIn.Count > 0 Then
            IsIn = "(" & IsIn.Remove(IsIn.Length - 1) & ")"
            SQLstrIn = SQLData.SQLtoReturn(IsIn)
        Else : SQLstrIn = ""
        End If

        If IsNotIn.Count > 0 Then
            SQLstrNotIn = SQLData.SQLtoReturn(IsNotIn)
        Else : SQLstrNotIn = ""
        End If

如果 as/n 存在,那么我使用这个函数来生成 tsql 代码:

 Public Shared Function SQLtoReturn(ByVal InStr As String) As String
    Dim SQLstr As New StringBuilder

    SQLstr.Append("SELECT DISTINCT")
    SQLstr.Append("     RTRIM(LTrim(ce.PartSerialNumber)) [Part Serial Number], ")
    SQLstr.Append("     RTRIM(LTrim(p.PartNumber)) [Part Number], ")
    SQLstr.Append("     CONVERT(varchar(10), DateTime, 101) + STUFF(RIGHT(CONVERT(varchar(26), DateTime, 109), 15), 7, 7, ' ') [Date Time], ")
    'SQLstr.Append("     ce.DateTime [Date Time], ")
    SQLstr.Append("     RTRIM(LTrim(cp.Description)) [Description], ")
    SQLstr.Append("     RTRIM(LTrim(cp.Side)) [Side], ")
    SQLstr.Append("     RTRIM(LTrim(ce.EventOutcome)) [Event Outcome], ")
    SQLstr.Append("     RTRIM(LTrim(ce.EventOutcomeInfo)) [Event Outcome Info] ")
    SQLstr.Append("FROM ")
    SQLstr.Append("     CollectionEvents AS ce INNER JOIN ")
    SQLstr.Append("       CollectionPoints AS cp ON ce.CollectionPointId = cp.CollectionPointId INNER JOIN ")
    SQLstr.Append("       Products AS p ON cp.ProductIdValue = p.ProductId ")
    SQLstr.Append("WHERE ")
    SQLstr.Append("     (ce.PartSerialNumber IN " & InStr & ") ")

    Return SQLstr.ToString

End Function

如果 as/n 不存在,那么我使用这个函数:

Public Shared Function SQLtoReturn(ByVal NotInStr As List(Of String)) As String
    Dim SQLstr As New StringBuilder
    Dim rtrnString As String = ""

    For i As Integer = 0 To NotInStr.Count - 1
        SQLstr.Append("SELECT ")
        SQLstr.Append(NotInStr.Item(i).ToString & " [Part Serial Number], ")    '1  
        SQLstr.Append("'No Data Found' [Part Number], ")                        '2
        SQLstr.Append("'No Data Found' [Date Time], ")                          '3
        SQLstr.Append("'No Data Found' Description, ")                          '4
        SQLstr.Append("'No Data Found' Side, ")                                 '5
        SQLstr.Append("'No Data Found' [Event Outcome], ")                      '6
        SQLstr.Append("'No Data Found' [Event Outcome Info] ")                  '7
        If (i < NotInStr.Count - 1) Then SQLstr.Append("UNION")
        SQLstr.Append(vbCrLf)
        rtrnString += SQLstr.ToString
    Next

    Return SQLstr.ToString

End Function

如果两个函数都返回 tsql 数据,那么它们将被联合在一起;如果不返回 tsql 代码,则不包括在内。这段代码本质上是最后一步:

If SQLstrIn.Length > 0 And SQLstrNotIn.Length > 0 Then
            SQLstr = SQLstrIn & vbNewLine & "UNION" & vbNewLine & SQLstrNotIn
        ElseIf SQLstrIn.Length > 0 And SQLstrNotIn.Length = 0 Then
            SQLstr = SQLstrIn
        ElseIf SQLstrIn.Length = 0 And SQLstrNotIn.Length > 0 Then
            SQLstr = SQLstrNotIn
        End If

        Dim dt As DataTable = New DataTable
        dt.Columns.Add("Part Serial Number", GetType(String))
        dt.Columns.Add("Part Number", GetType(String))
        dt.Columns.Add("DateTime", GetType(Object))
        dt.Columns.Add("Description", GetType(String))
        dt.Columns.Add("Side", GetType(String))
        dt.Columns.Add("Event Outcome", GetType(String))
        dt.Columns.Add("Event Outcome Info", GetType(String))

        Dim objConn As New SqlConnection(DatabaseConnection.FISSQLConnectionString)
        objConn.Open()
        Dim objCommand As SqlCommand = objConn.CreateCommand
        objCommand.CommandText = SQLstr
        Dim objReader As SqlDataReader = objCommand.ExecuteReader
        If objReader.HasRows Then
            While objReader.Read
                With objReader
                    dt.Rows.Add(.GetString(0), .GetString(1), .GetValue(2), .GetString(3), .GetString(4), .GetString(5), .GetString(6))
                End With
            End While
        End If

        Dim dataview As DataView = dt.DefaultView
        dataview.Sort = "DateTime ASC"
        dgvSNEvents.DataSource = dataview.ToTable

我为 DateTime 字段使用了 GetType(Object),希望它存储日期/时间值或字符串值。最终,我仍然无法按序列号和日期排序。仍在学习最好的方法,所以如果有人有更好的方法,我很乐意看到它们。


日期时间列仍然有点偏离。

在此处输入图像描述

4

1 回答 1

2

的默认行为DataGridView是可以对列进行排序(即,通过单击标题);SortMode在任何情况下,您都可以通过影响属性来强制执行此行为。关于日期,您可以将Date type列添加到给定的DataSource. 示例代码DataGridView1

Dim dt As DataTable = New DataTable

dt.Columns.Add("col", GetType(Date))

dt.Rows.Add(New Date(2000, 2, 1, 10, 10, 0))
dt.Rows.Add(New Date(2002, 5, 10, 10, 10, 0))
dt.Rows.Add(New Date(1995, 5, 10, 10, 11, 10))

DataGridView1.DataSource = dt
DataGridView1.Columns(0).SortMode = DataGridViewColumnSortMode.Automatic 'Just to make sure

DataGridView1通过单击第一列的标题,将对中的行进行排序。如果要让所有记录从头开始排序,可以使用DataSource( dt) 进行排序;示例代码:

Dim dataView As DataView = dt.DefaultView
dataView.Sort = "col asc"

DataGridView1.DataSource = dataView.ToTable() 'DGV sorted ascendently
于 2013-10-22T16:42:10.607 回答