2

我有一个 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。任何帮助或建议表示赞赏。

4

1 回答 1

1

您可以遍历数据表并删除您选择的数据表并重新绘制数据网格视图。不是仅使用您已经拥有的数据表的另一个 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

您还没有触及原始数据表。

于 2013-08-30T19:34:23.183 回答