我们如何将日期字段绑定到具有 2 列的“值列表”组合框?

Posted

技术标签:

【中文标题】我们如何将日期字段绑定到具有 2 列的“值列表”组合框?【英文标题】:How do we bind a date field to a "Value List" combobox with 2 columns? 【发布时间】:2011-08-04 13:25:02 【问题描述】:

我们如何将日期字段绑定到组合框(Row Source Type = Value List)?

我们在 VBA 的表单加载中设置了这样的组合框:

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 天的列表中进行选择。作为奖励,他可以看到星期几(实际上,对于这个最终用户来说,日期名称非常重要)。

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


但是无论我们设置哪个Bound Column都有问题:

如果我们将 Bound Column 设置为列 0,它显然可以工作,但存储的值是 31/12/1899、1/1/1900、2/1/1900 等。所以它是只需读取组合的 listindex 并将其转换为日期。

如果我们将 Bound Column 设置为列 1,它确实可以将所选值写回数据库。但它永远不会显示在表单上,​​因此用户显然不会觉得他的编辑已经完成

如果我们将 Bound Column 设置为列 2,我们会收到 Not In List 错误。


无论我们是否将dd-MMM-yy 用于strValueMember 或(如@HansUp 回答建议的那样,yyyy-m-d),上述所有内容都适用。

【问题讨论】:

Next intI 不会给你报错吗? @HansUp 抱歉,这里是写错字了 【参考方案1】:

在我看来,cboDeliveryDate 有 2 列,其中 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 来自哪里,所以我只是替换了今天的日期。

【讨论】:

我已经将您的 Form_Load 复制到了一个测试 Form1 中,它正在将正确的日期写回数据库,但是选择的值永远不会显示给用户 anchorDate,是的,今天很好 如果我使用 0";1" 作为组合的 Column Widths 属性,我会看到与您相同的行为 --- 当我在行中移动时,存储的值不会显示在组合中。但是,如果第一列的宽度大于零(甚至是 0.1";1"),则会显示存储的值。我不知道你是否可以接受。如果没有,请查看@iDevlop 建议的回调函数是否允许组合按您的意愿运行。 您似乎在评论中提供了解决方案 - 允许显示非常少量的 ValueMember 列。它并不完全令人满意,但已经足够好了。非常感谢。 将日期名称格式化为一列本身是个好主意……但是您知道吗?在短短 10 分钟的测试中,我什至不再注意到表示第一列宽度为 0.1 厘米的垂直线。所以我认为客户不会再三考虑【参考方案2】:

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

【讨论】:

以上是关于我们如何将日期字段绑定到具有 2 列的“值列表”组合框?的主要内容,如果未能解决你的问题,请参考以下文章

如何将当前日期和时间插入到具有 DateTime 类型列的 SQL Server 表中?

Kendo UI MVC 从 MultiSelect 小部件将 Grid 绑定到 DataSource

将具有两个日期列的一个数据框与另一个具有两个日期列的数据框合并

如何使用聚合 MongoDB 查找具有两列的不同字段

WPF DataGrid 将单元格绑定到具有动态列的数据模型

SQL Server 2012 如何将列的数据类型从位更改为日期字段?