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

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

Custom row source for combo box in continuous form in Access

我进行了搜索,似乎这是MS Access中的一个限制,所以我想知道其他什么创造性的解决方案可以解决此难题。

如果您具有连续形式,并且希望将字段作为该行特定选项的组合框,则Access无法传递;组合框行源仅在表单开头被查询一次,因此对于其余表单显示错误的选项。

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

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

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

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


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

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

在表单上放置一个UNBOUND组合框。然后,为要编辑的字段放置一个BOUND文本框。

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

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

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

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

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


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

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

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

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


这似乎运作良好。
CBOsfrmTouchpoint8是一个组合框,简称为下拉框。
CBOsfrmTouchpoint14是组成其余空间的文本框。
永不说永不:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  Private Sub CBOsfrmTouchpoint8_Enter()  

  If Me.CBOsfrmTouchpoint8.Tag ="Yes" Then  
  CBOsfrmTouchpoint14.SetFocus  
  Me.CBOsfrmTouchpoint8.Tag ="No"  
  Exit Sub  
  End If  

  Me.CBOsfrmTouchpoint8.Tag ="No"  
  Me.CBOsfrmTouchpoint8.RowSource ="XXX"  
  Me.CBOsfrmTouchpoint8.Requery  
  Me.CBOsfrmTouchpoint8.SetFocus  
  End Sub

  Private Sub CBOsfrmTouchpoint8_GotFocus()  
  Me.CBOsfrmTouchpoint14.Width = 0  
  Me.CBOsfrmTouchpoint8.Width = 3420  
  Me.CBOsfrmTouchpoint8.Left = 8580  
  Me.CBOsfrmTouchpoint8.Dropdown  
  End Sub

  Private Sub CBOsfrmTouchpoint8_LostFocus()  
  Me.CBOsfrmTouchpoint8.RowSource ="XXX"  
  Me.CBOsfrmTouchpoint8.Requery  
  End Sub

  Private Sub CBOsfrmTouchpoint8_Exit(Cancel As Integer)  
  Me.CBOsfrmTouchpoint14.Width = 3180  
  Me.CBOsfrmTouchpoint8.Width = 240  
  Me.CBOsfrmTouchpoint8.Left = 11760  
  Me.CBOsfrmTouchpoint8.Tag ="Yes"  
  End Sub

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

私人子制造商_GotFocus()

1
2
3
4
5
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

结束子

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

私人子制造商_LostFocus()

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

结束子

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

私人子制造商_Enter()

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

结束子

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

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

私人子sFrmEquip_Exit(取消为整数)

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

结束子

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


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


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

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

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

1
[MySubForm].[Form]!MyID

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


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


我刚刚做了类似的事情。我的解决方案是使用绑定到查询的固定行源。查询的WHERE子句引用表单的控件,即Client=Forms!frmMain!ClientTextBox。仅此一项将用第一行的数据填充组合框。然后,诀窍是设置一个'On Enter'事件,该事件仅对组合框进行重新查询,例如ComboBox1.Requery,这将单独重新查询该组合框,并且只会拖入与该记录行相关的数据。

希望也对您有用!


使用OnEnter事件填充组合框,请勿使用固定的rowsource


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

然后,您将使用此表作为连续的数据源。您可以使用onLoad用所需的数据填充临时表。

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

我希望这会有所帮助


更好...

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


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


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

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

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

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

回复编辑:
但实际上,连续形式无法完成您想要的。这就是为什么我建议伪造您自己的连续表格,因为连续表格在其功能上有实际限制。不要拘泥于特定的实现,以免它停止工作时就放手。


推荐阅读