两个列表合并为1个下拉框

时间:2014-04-02 03:48:24

标签: sql list vb6

亲爱的,并提前感谢你。

问题:

而不是列表A和列表B有两个下拉框。我想组合两个列表(它们确实相关)并将它们显示给用户作为1列表。然后将其拆分为两个,以便我可以存储相关信息。

清单1

Machines
1. Machine x
2. Machine y

列出2个测试类型

1. Test Type ab
2. Test Type ac
3. Text Type ad.

所以机器1可以测试类型ab和ac。机器2可以进行测试类型ac和ad。

它将存储在3个不同的表中(不是真的,只是认为它会)。 2个表将包含列表,第三个表将包含两个列表之间的关系。即列表1中的哪些项目与列表2中的哪些项目配对等。

对于用户,它将显示如下

Machine X - ab
Machine x - ac
Machine y - ac
Machine y - ad

然后,用户将从列表中选择1,然后我将解码所选的两个项目。

到目前为止,我的想法是根据需要使用位(和/或)。

将有三个功能

public function joinAB(a as long, b as long) as long

end function

Public function getA(ab as long) as long

end function

public function getB(ab as long)as long 
end function

所以,只是为了澄清这不是将文本连接在一起,而是加入/拆分这两个列表中各个项目的ID。

其他人有任何其他想法。这将在我继承的遗留系统(VB6)中完成。我的VB6编码技能高于平均水平。

感谢您提供的任何帮助/代码段或一般建议。

如果您需要更多信息,请告诉我们。

3 个答案:

答案 0 :(得分:1)

使用映射关系的第3个表,如果关系具有唯一ID,则可以使用它来加入/拆分列表....

或向我们提供表格结构和数据......

答案 1 :(得分:1)

可能有一些解决方案。

最简单的方法是在连接表上创建唯一的32位整数字段。然后可以将其嵌入VB6 ListBox的ItemData属性中。

为此提供了几个辅助函数:

Private Sub AddListBoxItem(ByRef lst as ListBox, ByVal in_nKey As Long, ByRef in_sDisplay As String)
    With lst
        .AddItem in_sDisplay
        .ItemData(.NewIndex) = in_nKey
    End With
End Sub

Private Function GetSelectedListBoxKey(ByRef in_lst As ListBox) As Long
    With in_lst
        GetSelectedListBoxKey = .ItemData(.ListIndex)
    End With
End Function

至于实现你的功能,我只想使用两个集合。

m_col_A_B_to_AB将由A& A键入“_”& B返回AB。 m_col_AB_to_A_B将键入AB以返回A和B.

辅助函数将是:

Private Sub AddRow(ByVal in_nA As Long, ByVal in_nB As Long, ByVal in_nAB As Long)
    Dim an(0 To 1) As Long
    an(0) = in_nA
    an(1) = in_nB
    m_col_A_B_to_AB.Add an(), CStr(in_nAB)
    m_col_AB_to_A_B.Add in_nAB, CStr(in_nA) & "_" & CStr(in_nB)
End Sub

Private Sub Get_A_B(ByVal in_nAB As Long, ByRef out_nA As Long, ByRef out_nB As Long)

    Dim vTmp As Variant
    vTmp = m_col_A_B_to_AB.Item(CStr(in_nAB))

    out_nA = vTmp(0)
    out_nB = vTmp(1)

End Sub

Private Function GetA(ByVal in_nAB As Long) As Long
    Get_A_B in_nAB, GetA, 0&
End Function

Private Function GetB(ByVal in_nAB As Long) As Long
    Get_A_B in_nAB, 0&, GetB
End Function

Private Function JoinAB(ByVal in_nA As Long, ByVal in_nB As Long) As Long

    JoinAB = m_col_AB_to_A_B.Item(CStr(in_nA) & "_" & CStr(in_nB))

End Function

答案 2 :(得分:1)

假设a和b是数字变量,因为你的3个函数建议我将使用组合列表中项目的.ItemData()属性,就像标记和使用除法一样,并保留以获得单独的部分:

Public Function joinAB(a As Long, b As Long) As Long
  joinAB = a * 100 + b
End Function

Public Function getA(ab As Long) As Long
  getA = ab \ 100
End Function

Public Function getB(ab As Long) As Long
  getB = ab Mod 100
End Function

这假设b永远不会高于100,并且a或b都不会为负

如果a和b是字符串变量,那么我会将连接的字符串显示为组合框中的文本并拆分所选文本以获得单独的部分

Public Function joinAB(a As String, b As String) As String
  joinAB = a & " - " & b
End Function

Public Function getA(ab As String) As String
  getA = Left$(ab, InStr(ab, " - ") - 1)
End Function

Public Function getB(ab As String) As String
  getB = Mid$(ab, InStr(ab, " - ") + 3)
End Function