Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何基于另一个表';s数据_Sql_Vb.net_Datagridview - Fatal编程技术网

Sql 如何基于另一个表';s数据

Sql 如何基于另一个表';s数据,sql,vb.net,datagridview,Sql,Vb.net,Datagridview,我有一个DataGridView,其中填充了来自DataTable(设置为其数据源)的账单。这些账单会显示给我的工程师,以便他们可以建立一个物料清单 这是获取所有我的账单的SQL查询: SELECT * FROM Bills ORDER BY Case IsNumeric(JobNumber) WHEN 1 THEN Replicate('0', 50 - Len(JobNumber)) + JobNumber ELSE JobNumber END 这将按作业编号对账单进行排序(有些是数字

我有一个DataGridView,其中填充了来自DataTable(设置为其数据源)的账单。这些账单会显示给我的工程师,以便他们可以建立一个物料清单

这是获取所有我的账单的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
事件。简而言之,我验证当前添加的账单是否在我的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
Private子dgvBills_CellFormatting(发件人作为对象,e作为System.Windows.Forms.DataGridViewCellFormattingEventArgs)处理dgvBills.CellFormatting
将drv设置为数据行视图
如果e.RowIndex>=0,则

如果e.RowIndex,则可以遍历datatable并删除已选择的数据表,然后重新绘制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
Dim dtTemp As DataTable=dtOpenBills.Clone()
对于dtOpenBills.Rows中的每个dr As数据行
如果Cint(dr(“OpenBillID”))1287,则
Dim drTemp As DataRow=dtTemp.NewRow()
drTemp=dr
dtTemp.行添加(drTemp)
如果结束
下一个
DataGridViewName.DataSource=dtTemp
可能不需要DataGridViewName.Refresh()

您尚未触及原始数据表

我曾想过这样做,但为了提高效率,我不想通过DataTable(超过10k条记录)重复。无论如何,我星期一会试试你的解决办法。我想到了另一种只改变行颜色的解决方案,例如,红色意味着它已经在编辑模式下打开了。使用现有数据表的好处是它已经在内存中了,不应该让你太慢。让我知道进展如何,祝你周末愉快。