我有一个 DataGridView,里面装满了来自 DataTable 的 Bills(设置为 DataSource)。这些账单显示给我的工程师,以便他们可以构建物料清单。
这是获取我所有账单的 SQL 查询:
SELECT *
FROM Bills
ORDER BY Case IsNumeric(JobNumber)
WHEN 1 THEN Replicate('0', 50 - Len(JobNumber)) + JobNumber ELSE JobNumber END
这按工作编号对账单进行排序(有些是数字,有些是字符串,有些是整数和字符的混合)。
特征
他们可以打开账单来查看它(只读)或编辑它。
进一步说明
如果工程师打开账单进行编辑,它将被放置在名为“OpenBills”的表中。我这样做是为了让其他工程师在处理时无法打开相同的账单并对其进行编辑。OpenBills 表的要点是确定打开哪个帐单。一旦我知道打开了哪个账单,我不想在他们去编辑账单时在他们的 DataGridView 中提供它。
另一方面,当工程师搜索以只读方式打开的账单时,它们应该全部显示(即使是当前打开的)。不同之处在于我只是简单地将浅蓝色作为行的背景来通知用户它当前已打开。
我目前的“解决方案”
我目前正在CellFormatting
我的 DataGridview 上使用一个事件。简而言之,我验证当前添加的账单是否在我的 OpenBills 表中lst_OpenBills
。如果是,那么我验证我是否将 DataGridView 视为只读或编辑模式。如果它处于编辑模式,我将隐藏该行。如果它是只读的,我会改变它的背景颜色。
Private Sub dgvBills_CellFormatting(sender As Object, e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dgvBills.CellFormatting
Dim drv As DataRowView
If e.RowIndex >= 0 Then
If e.RowIndex <= dsBOM.Tables("dtBills").Rows.Count - 1 Then
drv = dsBOM.Tables("dtBills").DefaultView.Item(e.RowIndex)
Dim c As Color
If lst_OpenBills.ContainsKey(drv.Item("PK_Bill").ToString) Then
If int_EntryPoint = 0 Then
'Read Only
c = Color.LightBlue
e.CellStyle.BackColor = c
Else
'Edit mode
dgvBills.Rows(e.RowIndex).Visible = False
End If
End If
End If
End If
End Sub
当前解决方案的问题
我使用 AlternatingRowStyles 使其更易于阅读。正如您在以下比较中看到的那样,编辑模式图片不应显示这样的交替行样式。我怎么能从 DataTable 中省略 DataGridViewRow ?我应该重新应用 AlternatingRowStyles 吗?
只读结果
编辑模式
有没有人有任何解决方案?也许我查询我的所有账单不合适......我在两种情况下都使用相同的表格(只读和编辑模式)。我只是使用 Enum 来区分它们enum_EntryPoint
。任何帮助或建议表示赞赏。