Access中连续形式的组合框的自定义行源

时间:2020-03-05 18:59:39  来源:igfitidea点击:

我四处搜寻,似乎这是MS Access中的一个限制,所以我想知道其他人对此难题找到了哪些创造性的解决方案。

如果我们使用连续形式,并且希望字段成为该行特定选项的组合框,则Access无法交付;否则,Access不能交付。组合框行源仅在表单开头被查询一次,因此对于其余表单显示错误的选项。

当然,我们所有人都将尝试使用onCurrent事件来重新查询组合框,实际上,该组合框实际上将选项限制为给定的行。但是,此时,Access变得疯狂,并针对每一行重新查询所有组合框,其结果通常是消失并重新出现其他行中的选项,具体取决于它们是否选择了对行有效的选项。当前记录的行源。

我发现的唯一解决方案是始终列出所有可用的选项。有创意吗?

编辑另外,我要注意,组合框的原因是将查询作为查找表,需要隐藏并存储实际值,同时显示人类可读的版本...组合框行中有多列来源。因此,将限制更改为list并没有帮助,因为不在当前行源查询中的id不会具有匹配的人类可读部分。

在这种情况下,连续表格很有意义,所以请不要告诉我这是错误的解决方案。我要求任何有创意的答案。

解决方案

回答

免责声明:我非常讨厌Access。

不要使用连续形式。他们是我们想要完成的任务的红鲱鱼。连续形式是用不同的数据反复重复的相同形式。由于我们无法多次打开同一表格,因此这已经是Access正常操作模式的一大障碍。我们看到的行为是Access中的"按设计"。这些ComboBox控件中的每一个实际上都是相同的控件。我们不能影响一个而不影响另一个。

基本上,我们在这里所做的工作将进入Access不再适合项目的区域(但由于它已经代表了大量工作,因此无法放弃)。

似乎最有可能采取的行动是将其伪造得很好。对数据运行查询,然后根据结果以编程方式创建表单元素。这是一项相当大的工作,因为我们将自己复制大量的Access数据处理功能。

回复编辑:

回答

但实际上,连续形式无法完成我们想要的事情。这就是为什么我建议伪造我们自己的连续表格,因为连续表格在其功能上有实际限制。不要拘泥于特定的实现,以使它在停止工作时不会放任自流。

回答

如果关闭"限制到列表"选项,并在更新前进行一些验证以确认用户输入的内容与我们提供给他们的列表中的内容匹配,该怎么办?

回答

我们还可以将组合框的值设置为不可编辑的文本字段,然后启动弹出/模态窗口以编辑该值。但是,如果这样做的话,我可能倾向于在其中一个窗口中编辑整个记录。

使用连续形式..绝对。实际上,我们可以使用基于连续表单的出色且直观的用户界面来构建整个应用程序。不要听吐司!

列出所有可用选项的解决方案是正确的。实际上,没有其他清洁的解决方案。但是,当我们说Acccess变得疯狂时,我们错了。在连续表单上,我们可以将每一行视为详细信息部分的一个实例,其中组合框是该详细信息部分的所有实例共有的属性。我们可以为所有实例更新此属性,但不能为一个特定实例设置此属性。这就是为什么Access必须在组合框中为所有记录显示相同的数据!

如果我们只需要在此组合框中接受特定于记录的值,请使用beforeUpdate事件添加控制过程。如果无法接受新值,则可以取消数据更新,并在字段中恢复以前的值。

回答

在链接数据(存储在控件中的数据)被隐藏的情况下,不能将limitToList属性设置为"否"。这是合乎逻辑的:当链接字段(不可见)为空时,机器如何接受新数据行的输入?

我认为根本不应该谴责Access连续表格,但我绝对相信,在编辑数据时应避免使用它们。它们非常适合列表,并且比单纯的列表框为我们提供了更多的格式化功能(并且当然更容易使用,尽管它们不允许多选)。

如果要使用连续表单导航到要编辑的记录,请使用显示详细数据以进行编辑的子表单,并将子表单中的PK值用于链接字段。这可以通过连续表格来完成,我们可以将详细信息子表格放在页眉或者页脚中,并链接到连续表格后面表格的PK上。

[MySubForm].[Form]!MyID

或者,如果我们使用连续表单以父表单显示子数据,则可以将详细信息子表单与对连续子表单中PK的引用链接起来,例如:

回答

那将是链接主属性,而MyID将是链接子属性。

我也讨厌Access,但是我们必须使用发给卡。
在Access中,连续表格是一件很了不起的事情,直到我们遇到这种情况下通常遇到的各种复杂性为止。

遇到这种情况时,我会做以下事情(并且我之前已经实现了类似的解决方法):

将取消绑定组合框放在窗体上。然后,为要编辑的字段放置一个BOUND文本框。

确保组合框隐藏在文本框后面(不可见,只是隐藏)。

在OnCurrent事件中,用必要的数据填充listBox。继续并"限制列出"。

在文本框的OnEnter或者OnClick事件中,赋予组合框焦点。这将使组合框走在最前列。当焦点离开组合框时,它将再次隐藏。

在组合框的AfterUpdate事件中,将文本框的值设置为等于组合框的值。

回答

根据情况,可能还有其他一些细节需要解决,但这应该或者多或者少地实现目标而又不会增加太多复杂性。

回答

我们在applicatins中也经常遇到这种情况。我们发现这是一个很好的解决方案:
只需显示组合框中的所有行。
然后,一旦用户在特定行中输入组合框,请调整行源(具有该行的过滤器)。当组合框失去焦点时,我们可以重新设置行源以显示所有内容。

我要比吉利根(Gilligan)更简单。似乎需要做很多工作,但实际上并非如此。我的解决方案需要将我的连续表单作为子表单数据表。在我的子窗体中,除其他字段外,我有两个查找组合框,分别称为"设备"和"制造商"。两者都只是在数据源中持有Long Integer键。需要通过"设备"中选择的内容对制造商进行过滤。我唯一过滤Manufacturer.RowSource的事件是在Manufacturer_GotFocus事件中。

If Nz(Me.Equipment, 0) > 0 Then
    Me.Manufacturer.RowSource = GetMfrSQL()  '- gets filtered query based on Equipment
Else
    Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
End If

私人子制造商_GotFocus()

结束子

在Manufacturer_LostFocus中,我也将Manufacturer.RowSource重置为所有制造商。之所以需要这样做,是因为当我们第一次单击子窗体时,即使实际上没有更新任何字段,GotFocus事件也会触发所有控件,包括制造商。

Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"

私人子制造商_LostFocus()

结束子

在制造商的Enter事件中,我们必须检查是否已选择"设备",如果未将焦点设置为"设备"。

If Nz(Me.EquipmentID, 0) = 0 Then
    '-- Must select Equipment first, before selecting Manufacturer
    Me.Equipment.SetFocus
End If

私人子制造商_Enter()

结束子

我们还需要在Form_Current事件中重新查询Manufacturer组合框(即Me.Manufacturer.Requery),并且应将此子窗体的Cycle属性设置为" Current Record"。

看起来很简单,但是我们还没有完成。我们还必须在父窗体的SubForm_Exit事件中将Manufacturer.RowSource重置为所有制造商,以防用户进入"制造商"组合框,但未进行选择并单击父窗体上的某个位置。代码示例(以父形式):

Me.sFrmEquip.Controls("Manufacturer").RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"

私人Sub sFrmEquip_Exit(取消为整数)

结束子

回答

仍然有一件不干净的东西。当我们单击制造商并在数据表网格中有多行时,在当前行中更改制造商时,制造商字段在其他行中将变为空白(组合框下方的数据仍保持不变)。一旦移开该字段,其他制造商字段中的文本将重新出现。

更好的...

回答

将组合框"控制源"设置为查询中将存储组合框的值的列。

对我来说,最好的方法和最简单的方法是创建一个临时表,该表包含所有绑定的字段以及一个额外字段(是/否)。

那么我们将使用此表作为连续的数据源。我们可以使用onLoad用所需的数据填充临时表。

我认为在那之后很容易循环选择,只需一个小循环就可以从临时表中读取是/否字段。

回答

我希望这个能帮上忙

段落数量不匹配