Ms access 如何将日期字段绑定到";“价值清单”;有两列的组合框?
如何将日期字段绑定到组合框(行源类型=值列表) 我们在VBA中的Load表单中按如下方式设置组合框: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
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厘米的垂直线。所以我认为客户不会再三考虑