我有一个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中提供。
另一方面,当工程师搜索要以只读方式打开的帐单时,应显示所有帐户(即使是当前打开的帐户)。不同之处在于我只是将浅蓝色作为行的背景来通知用户当前打开它。
我当前的'解决方案'
我目前在DataGridview上使用CellFormatting
事件。简而言之,我验证当前添加的Bill是否在我的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_EntryPoint
来区分它们。任何帮助或建议表示赞赏。
答案 0 :(得分:1)
您可以遍历数据表并删除您选择的数据并重绘datagridview。不是只使用您已有的数据表的另一个SQL调用。如果需要,可以在完成后重新插入行,或者只使用相同的起始数据表来刷新DGV。 例如,如果未结账单是id 1287:
Dim dtTemp As DataTable = dtOpenBills.Clone()
For Each dr As DataRow in dtOpenBills.Rows
If Cint(dr("OpenBillID")) <> 1287 Then
Dim drTemp As DataRow = dtTemp.NewRow()
drTemp = dr
dtTemp.Rows.Add(drTemp)
End If
Next
DataGridViewName.DataSource = dtTemp
DataGridViewName.Refresh() 'Might not be needed
您尚未触及原始数据表。