为什么在未绑定的文本框中失去焦点时,我必须手动设置.text中的.value



我有一个未绑定的文本框,用于接受早于:number of days的删除。它在报告标题中。我把它设置为30天,但我希望用户能够更改它。我绞尽脑汁想弄清楚为什么输入40不被接受,每次都会恢复到30。我最终决定使用lost_focus事件将.value设置为.text。这很有效。

进一步的研究表明,当文本框get的焦点文本和值都相同时,在我的情况下为30。将文本框中的数字更改为40将显示40处的文本值和30处的值。除非我特别将"值"设置为文本的值,否则Access会将文本更改为值的值。这与Access中的其他位置(如表单)的行为不同。

有人能告诉我为什么会这样吗?我找不到任何可以做到这一点的设置。是因为它在报表标题中吗?这个和我用过的其他文本框有什么区别?

从"最佳实践"的角度来看,尽管Access Reports能够操作一些未绑定的控件,但并不打算以交互方式使用。尽管可以很好地实现工作方法,但这样的解决方案通常是不完整的、有缺陷的,并且根据活动视图的不同而不同:报表视图与打印预览。适当的设计模式包括使用Access Forms指定报告选项,然后在静态配置中打开报告。

如果要更深入地回答Microsoft为什么在Access中实施不一致的绑定行为,或者如果报表中的交互控件的行为与表单中的不同,那么这可能无法满足"为什么?"的问题。但Access还有很多其他古怪的行为,没有已知/公开的解释。

关于Value属性更新Text属性的优先级(反之亦然):Value是关键字段,因为它包含控件(绑定或未绑定)的实际数据。虽然显示和输入都有一个单独的控件是很自然的(嗯,几乎所有控件都是这样工作的),但显示数据和解析用户输入的过程是两个不同的功能。Text属性返回的视觉表示可以使用各种格式设置属性进行操作,并且从技术上讲可能会显示底层Value数据的不完整表示。如果存储的Value属性和Text属性之间存在任何冲突,则现有的Value属性具有先例是很自然的。

我的猜测是,报告的自动绑定行为被"放宽"了,以允许更灵活的自定义报告输出。首先考虑数据表视图中的访问窗体:未绑定的窗体控件为所有记录显示相同的值。即使在特定行上编辑控件,也会显示所有行的更新值。对于每一行,相同的控件对象本质上都被重新绘制了,并且没有可以容纳不同值的控件的单个实例的概念。绑定控件有内置的代码,可以用特定行的数据重新绘制控件,但仍然有而不是多个实例,每个实例都"持有"各自的值。视觉输出不同于直观的面向对象范式,在这种范式中,我们考虑如何在内存中为每个视觉行分配自己的控件实例——它的工作方式与Access不同。

与刚才描述的表单行为不同,报表的打印预览(和实际打印输出)允许未绑定的控件使用Detail_Format()事件显示每行不同的数据。在Detail_Format()事件中,可以设置控件的Value属性,此时Text属性将根据各种格式属性自动更新。然后将为当前行输出此更新文本。也许(只是猜测)如果Text属性更新了value属性,则此行为将无法正常运行。我怀疑它会在生成报告期间引发递归事件。因为报告不是交互式的,所以相关的文本输入解析代码被"断开",所以它的行为与表单上的行为不同

所有这些解释并没有让Access变得不那么令人沮丧,也没有消除它的局限性,但至少要学会以"Access式"的方式来适应和设计事物,而不是对抗它

您最好的选择是设计一个带有未绑定组合框的表单,并将您的数据显示在子报表中。我喜欢设计我的报告,以便在更新值时生成报告记录源的查询。这样做需要存在两个查询,一个包含所有可能的数据,另一个作为子报告记录源进行筛选。这将控制要打印的数据,还允许用户关闭或导航离开报告,稍后返回数据。

Private Sub ComboBox1_AfterUpdate()
Dim Query1 as Object
Dim Temp_Name as Variant
Temp_Name = SubReport.SourceObject
SubReport.SourceObject = Empty
Set Query1 = Me.Form.Application.DBEngine.Workspaces(0).Databases(0).QueryDefs ("SubReport_Query")
Query1.SQL = "Select * Unfiltered_Query WHERE Field1 <= " ComboBox1 & ";"
SubReport.SourceObject = Temp_Name
End Sub

最新更新