如何根据另一个表的数据从DataSource中删除DataGridViewRow

时间:2013-08-30 14:43:41

标签: sql vb.net datagridview

我有一个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吗?

只读结果

Read only

编辑模式

Edit mode

有没有人有任何解决方案?也许我的查询得到我的所有账单都不合适......我在两种情况下使用相同的表格(只读和编辑模式)。我只是使用枚举enum_EntryPoint来区分它们。任何帮助或建议表示赞赏。

1 个答案:

答案 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

您尚未触及原始数据表。