Ms access 如何将日期字段绑定到";“价值清单”;有两列的组合框?

Ms access 如何将日期字段绑定到";“价值清单”;有两列的组合框?,ms-access,data-binding,combobox,date,Ms Access,Data Binding,Combobox,Date,如何将日期字段绑定到组合框(行源类型=值列表) 我们在VBA中的Load表单中按如下方式设置组合框: For i = 0 To 6 Dim strValueMember As String Dim strDisplayMember As String strValueMember = format(DateAdd("d", 0 + i, anchorDate), "dd-MMM-yy") & ";" strDisplayMember = format(Da

如何将日期字段绑定到组合框(行源类型=值列表)

我们在VBA中的Load表单中按如下方式设置组合框:

For i = 0 To 6
    Dim strValueMember As String
    Dim strDisplayMember As String
    strValueMember = format(DateAdd("d", 0 + i, anchorDate), "dd-MMM-yy") & ";"
    strDisplayMember = format(DateAdd("d", 0 + i, anchorDate), "ddd dd-MMM-yy") & ";"
    strItems = strItems & strValueMember & strDisplayMember

Next i
strItems = Left(strItems, Len(strItems) - 1)

Me.cboDeliveryDate.RowSource = strItems
这为我们提供了一个简洁的小组合框,用户可以从7天的列表中进行选择。作为奖励,他可以看到一周中的哪一天(实际上,对于这个终端用户来说,日期名称非常重要)

组合框有两列,一个值列(表示真实日期)和一个显示列(表示日期名称)


但无论我们设置了哪个绑定列,都存在问题:

如果我们将绑定列设置为Column0,它显然可以工作,但存储的值是31/12/1899、1/1/1900、2/1/1900等。因此,它只是读取组合的列表索引并将其转换为日期

如果我们将绑定列设置为Column1,它实际上会将所选值写回数据库。但是它从来不会显示在表单上,因此用户显然不会感觉到他的编辑已经完成了

如果将绑定列设置为Column2,则会得到一个Not-In-List错误


无论我们是否对strValueMember使用
dd-MMM-yy
,或者(正如@HansUp-answer所建议的,
yyy-m-d
)。

在我看来,cboDeliveryDate有两列,其中strValueMember是第一列,它也是绑定列,绑定到日期/时间字段。通过将strValueMember格式化为yyyy-m-d日期格式,这对我来说很有效

Private Sub Form_Load()
    Dim i As Long
    Dim anchorDate As Date
    Dim strValueMember As String
    Dim strDisplayMember As String
    Dim strItems As String

    anchorDate = Date

    For i = 0 To 6
        strValueMember = Format(DateAdd("d", i, anchorDate), _
            "yyyy-m-d") & ";"
        strDisplayMember = Format(DateAdd("d", i, anchorDate), _
            "ddd dd-MMM-yy") & ";"
        strItems = strItems & strValueMember & strDisplayMember
    Next i
    strItems = Left(strItems, Len(strItems) - 1)
    Me.cboDeliveryDate.RowSource = strItems
End Sub
我不知道anchorDate来自何处,所以我只替换了今天的日期。

在我看来,cboDeliveryDate有两列,第一列是strValueMember,它也是绑定列,绑定到日期/时间字段。通过将strValueMember格式化为yyyy-m-d日期格式,这对我来说很有效

Private Sub Form_Load()
    Dim i As Long
    Dim anchorDate As Date
    Dim strValueMember As String
    Dim strDisplayMember As String
    Dim strItems As String

    anchorDate = Date

    For i = 0 To 6
        strValueMember = Format(DateAdd("d", i, anchorDate), _
            "yyyy-m-d") & ";"
        strDisplayMember = Format(DateAdd("d", i, anchorDate), _
            "ddd dd-MMM-yy") & ";"
        strItems = strItems & strValueMember & strDisplayMember
    Next i
    strItems = Left(strItems, Len(strItems) - 1)
    Me.cboDeliveryDate.RowSource = strItems
End Sub

我不知道anchorDate从哪里来,所以我只替换了今天的日期。

虽然有点复杂,但您也可以创建一个函数,返回所需的值列表。
参见示例。

虽然有点复杂,但也可以创建一个函数,返回所需的值列表。
参见示例。

下一个intI是否为您抛出错误?@HansUp抱歉,这是写文章时的一个输入错误。下一个intI是否为您抛出错误?@HansUp抱歉,这是写文章时的一个输入错误。我已将您的表单加载复制到测试表单1中,它正在将正确的日期写回数据库,但是,所选值永远不会显示回useranchorDate,是的,今天很好。如果我使用0;1“作为组合的列宽属性,我会看到与您相同的行为——当我移动行时,存储的值不会显示在组合中。但是,如果第一列的任何宽度大于零(甚至0.1“;1”),则会显示存储的值。我不知道你是否能接受。如果没有,请查看@iDevlop建议的回调函数是否允许组合按您所需操作。您似乎在注释中提供了解决方案-允许显示非常少量的ValueMember列。这并不完全令人满意,但已经足够好了。非常感谢。将dayname单独格式化为一列是一个很好的主意。。。但是你知道吗?在仅仅10分钟的测试中,我甚至没有注意到表示第一列宽度为0.1厘米的垂直线。因此,我认为客户不会再三考虑我已经将您的表单加载复制到测试表单1中,并且它正在将正确的日期写回数据库,但是所选的值永远不会显示回useranchorDate,是的,如果我使用0;1“作为组合的列宽属性,我看到了与您相同的行为——当我移动行时,存储的值不会显示在组合框中。但是,如果第一列的任何宽度大于零(甚至0.1“;1”),则会显示存储的值。我不知道你是否能接受。如果没有,请查看@iDevlop建议的回调函数是否允许组合按您所需操作。您似乎在注释中提供了解决方案-允许显示非常少量的ValueMember列。这并不完全令人满意,但已经足够好了。非常感谢。将dayname单独格式化为一列是一个很好的主意。。。但是你知道吗?在仅仅10分钟的测试中,我甚至没有注意到表示第一列宽度为0.1厘米的垂直线。所以我认为客户不会再三考虑