我将如何创建具有以下列的数据网格视图:
- [部件序列号]
- [零件号]
- [约会时间]
- [描述]
- [边]
- 【活动成果】
- [活动结果信息]
我试图创建一个这样的 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),希望它存储日期/时间值或字符串值。最终,我仍然无法按序列号和日期排序。仍在学习最好的方法,所以如果有人有更好的方法,我很乐意看到它们。
日期时间列仍然有点偏离。