Office中国论坛/Access中国论坛

标题: 如何打开一个窗体,所有的单元格都非活动状态 [打印本页]

作者: jun_er    时间: 2009-2-20 18:53
标题: 如何打开一个窗体,所有的单元格都非活动状态
大家好,我是新来的

我想打开一个窗体,但是只编辑里面3个单元体以及子窗体。其他的单元格和别的都是非激活状态。

如何用VBA实现呢?
作者: 红尘如烟    时间: 2009-2-20 19:00
不需要用VBA,你只要将想设为非激活状态的对象的“可用”属性设为否就行了
作者: jun_er    时间: 2009-2-20 19:36
不好意思,我没有表达清楚哈。

是这样的,
我设置了两个按钮打开这个窗体,一个是打开后全部编辑,而另一个只能修改其中3个单元格及子窗体。我现在在第二个按钮中连接了个宏,通过宏把其他所有的不需要编辑的单元格全部设定为非活动状态。但是这样非常繁索,并且以后每次在窗体中添加单元格,都需要更新宏。因此我想请教一下,是否能够首先将所有单元全部设置为非活动状态,然后再将我需要编辑的单元改为活动状态。

请问要如何实现呢?谢谢
作者: Henry D. Sy    时间: 2009-2-20 20:24
AllowEdits 属性
请参阅 应用于 示例 特性
使用 AllowEdits 属性可以指定用户是否可在使用窗体时编辑已保存的记录。Boolean 型,可读写。

expression.AllowEdits

expression   必需。返回“Applies To”列表中的一个对象的表达式。

设置
AllowEdits 属性使用以下设置:

设置 Visual Basic 说明
是 True   (默认值)用户可以编辑已保存记录。
否 False 用户不能编辑已保存记录。


可以使用窗体属性表、宏或 Visual Basic 来设置 AllowEdits 属性。

说明
如果要防止更改窗体中显示的现有数据,可以使用 AllowEdits 属性。如果要防止更改特定控件中的数据,可以使用 Enabled 或 Locked 属性。

如果要防止更改已有记录(使窗体只读),可以将 AllowAdditions、AllowDeletions 和 AllowEdits 属性设为“否”。也可以将 RecordsetType 属性设置为“快照”,使记录成为只读。

将 AllowEdits 属性设置为“否”时,“删除记录”或“数据输入”菜单命令对现有记录将不可用。(如果将 AllowAdditions 属性设为“是”,则其对新记录将仍然可用。)

无论 AllowEdits 属性的设置如何,通过编程对字段值进行的更改都会使当前记录可被编辑。如果要防止用户对需要通过编程才能编辑的记录(AllowEdits 为“否”)进行更改,请在所有程序化更改后保存记录;保存完针对当前记录未保存的所有更改后,AllowEdits 属性设置将再次发挥作用。

注意  当使用 OpenForm 操作的“数据模式”参数时,Microsoft Access 可能忽略某些窗体的属性设置。如果 OpenForm 操作的“参数模式”参数设置为“编辑”,Microsoft Access 将按以下属性设置打开窗体:

AllowEdits:是
AllowDeletions:是
AllowAdditions:是
DataEntry:否
要防止 OpenForm 操作覆盖任何现有的属性设置,可以省略“数据模式”参数,使 Microsoft Access 使用窗体定义的属性设置。

示例
下面的示例检查窗体上所有控件的 ControlType 属性,并切换每个标签控件和文本框控件的 SpecialEffect 属性。当标签控件的 SpecialEffect 属性设置为“阴影”,文本框控件的 SpecialEffect 属性设置为“普通”,AllowAdditions、AllowDeletions 和 AllowEdits 属性设置为 True 时,intCanEdit 变量将切换到允许编辑基础数据的状态。

Sub ToggleControl(frm As Form)
    Dim ctl As Control
    Dim intI As Integer, intCanEdit As Integer
    Const conTransparent = 0
    Const conWhite = 16777215
    For Each ctl in frm.Controls
        With ctl
            Select Case .ControlType
                Case acLabel
                    If .SpecialEffect = acEffectShadow Then
                        .SpecialEffect = acEffectNormal
                        .BorderStyle = conTransparent
                        intCanEdit = True
                    Else
                        .SpecialEffect = acEffectShadow
                        intCanEdit = False
                    End If
                Case acTextBox
                    If .SpecialEffect = acEffectNormal Then
                        .SpecialEffect = acEffectSunken
                        .BackColor = conWhite
                    Else
                        .SpecialEffect = acEffectNormal
                        .BackColor = frm.Detail.BackColor
                    End If
            End Select
        End With
    Next ctl
    If intCanEdit = IFalse Then
        With frm
            .AllowAdditions = False
            .AllowDeletions = False
            .AllowEdits = False
        End With
    Else
        With frm
            .AllowAdditions = True
            .AllowDeletions = True
            .AllowEdits = True
        End With
    End If
End Sub
作者: ACMAIN_CHM    时间: 2009-2-20 20:28
什么是'单元格'? EXCEL 还是 ACCESS ? ,你用了datagrid 控件?


******************
*  一切皆有可能  *
******************

.
ACMAIN - Access论坛回贴准则(个人).
.

.
QQ群 48866293 / 12035577 / 7440532 / 13666209
http://forum.csdn.net/BList/OtherDatabase .
http://www.accessbbs.cn/bbs/index.php .
http://www.accessoft.com/bbs/index.asp .
http://www.access-programmers.co.uk/forums .
http://www.office-cn.net .
.
http://www.office-cn.net/home/space.php?uid=141646 .
作者: jun_er    时间: 2009-2-20 20:47
Access...

不叫单元格吗?。。。不好意思,我一直用的德语access,表达可能不准确。。

datagrid 控件.....不知道是什么。。。我档次很低的。。
作者: todaynew    时间: 2009-2-20 21:27
Access...

不叫单元格吗?。。。不好意思,我一直用的德语access,表达可能不准确。。

datagrid 控件.....不知道是什么。。。我档次很低的。。
jun_er 发表于 2009-2-20 20:47


呵呵,一头雾水了吧?

看看这个《面向初学者的窗体设计集成》你现在要的,和你将要想要的都在其中。
作者: jun_er    时间: 2009-2-20 21:54
呵呵,一头雾水了吧?

看看这个《面向初学者的窗体设计集成》你现在要的,和你将要想要的都在其中。
todaynew 发表于 2009-2-20 21:27


不好意思,没找到需要的。。。
是不是我没有说清楚,我需要打开窗体,是allowEdits,但是整个窗体中的所有控件及单元格都是非活动状态,应该是enable为 false。
作者: todaynew    时间: 2009-2-20 22:02
本帖最后由 todaynew 于 2009-2-20 22:03 编辑

应该就是控件的锁定与解锁吧?

3、双击班级ID或班级名称时,解锁。
Private Sub 班级ID_DblClick(Cancel As Integer)
Me.班级ID.Locked = False
End Sub

Private Sub 班级名称_DblClick(Cancel As Integer)
Me.班级名称.Locked = False
End Sub

4、失去焦点时,锁定班级ID或班级名称。
Private Sub 班级ID_LostFocus()
Me.班级ID.Locked = True
End Sub

Private Sub 班级名称_LostFocus()
Me.班级名称.Locked = True
End Sub
作者: jun_er    时间: 2009-2-20 22:19
应该不是的。。。

是这样的,这个窗体,在一种情况下,工程师打开后,可以全部编辑,这当然没有问题,但是在另一种情况下,工程师只能编辑其中一小部分的内容。因此我需要把其他的内容disable。我现在的解决方案是,通过一个宏打开窗体,并且把不能编辑的内容全部设置为enable= false,但是这样很麻烦,尤其是当我以后需要在窗体里添加新的单元格或控件的时候,都需要更新这个宏。

因此我想请问,有没有什么命令,可以把窗体里的所有控件及内容批量设置为enable= false,这样一来,我只需要单独把需要编辑的单元设置为enable就行了。

不知道说清楚了没。。。。
作者: 紫风    时间: 2009-2-24 08:54
是不是这样:
假设窗体名是:frm1,里面有6个字段:TEXT1,TEXT2,TEXT3,TEXT4,TEXT5,TEXT6。你要锁定的是1,2,3;允许编辑的是4,5,6。
Private Sub Form_Current()
    ME.TEXT1.LOCKED = TRUE
    ME.TEXT2.LOCKED = TRUE
    ME.TEXT3.LOCKED = TRUE
    ME.TEXT4.LOCKED = FALSE
    ME.TEXT5.LOCKED = FALSE
    ME.TEXT6.LOCKED = FALSE
End Sub

至于你说的批量设置字段的LOCKED嘛……我就不清楚。
作者: Henry D. Sy    时间: 2009-2-24 08:59
把窗体设为非编辑的,不是就是批量设置控件了吗
作者: 紫风    时间: 2009-2-24 20:42
把窗体设为非编辑的,不是就是批量设置控件了吗
Henry D. Sy 发表于 2009-2-24 08:59

板主,我本来也是这样想的.但是,楼主的要求是其中3个控件允许被编辑,其它的不允许...
其实我也在想,有没有其它更好的方法...
作者: mrl    时间: 2009-2-24 22:58
看我正用的模块是不合适你的要求

''锁定/解除 窗体上主体节上所有已绑定的控件的可编辑性
''参数      Frm: 窗体名
''参数 MyLocked:  True锁定 / False解除
'' 使用示例:
''执行锁定: TextLocked(Me, True)
''执行解除: TextLocked(Me, False)
Public Sub TextLocked(Frm As Form, MyLocked As Boolean)
    On Error Resume Next
    Dim obj As String
   
    For Each ctl In Frm.Section(acDetail).Controls      '遍历主体上控件
        obj = ctl.ControlSource
        If IsNull(obj) Or Trim(obj) = "" Or ctl.Enabled = False Then GoTo OUT '为 未绑定数据源控件 或 不可用控件 时跳出循环下一个
        
      
        If MyLocked Then
            ctl.Locked = True
            If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Then
                If ctl.ForeColor <> 16737843 Then ctl.ForeColor = 16737843     '对文本框、组合框、列表框字体颜色更改
            End If
        Else
            ctl.Locked = False
            If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Then
                If ctl.ForeColor <> 4194432 Then ctl.ForeColor = 4194432        '对文本框、组合框、列表框字体颜色更改
            End If
        End If
  
OUT:
   
    Next
End Sub
作者: jun_er    时间: 2009-2-25 20:23
谢谢楼上 我试试看!
作者: jun_er    时间: 2009-2-25 22:29
好像不行饿。。
作者: jun_er    时间: 2009-2-26 21:01
等帮助。。。。
作者: jun_er    时间: 2009-2-27 20:34
大家再看看我这个呢。

Public Function TextLocked()
On Error Resume Next


    Dim Frm As Form
    Dim Ctl As Control
   
    DoCmd.OpenForm "Vorschlag Teilesteuerung_1", acNormal, "", "", acFormAdd, acNormal
   
    Set Frm = Current_Form
   
    For Each Ctl In Me.Controls
        If Ctl.ControlType = acTextBox Or _
           Ctl.ControlType = acComboBox Or _
           Ctl.ControlType = acListBox Then
            Ctl.Locked = True
        End If
    Next Ctl


End Function


我运行了一下,报错说,非法使用Me
作者: Henry D. Sy    时间: 2009-2-27 20:39
For Each Ctl In Frm.Controls
作者: jun_er    时间: 2009-2-27 21:43
还是不行。。。根本没有locked。。
作者: jun_er    时间: 2009-2-27 22:21
Public Function TextLocked()
On Error Resume Next


    Dim Frm As Form
    Dim Ctl As Control
   
    DoCmd.OpenForm "Vorschlag Teilesteuerung_1", acNormal, "", "", , acNormal
   
    Set Frm = Current_Form
   
    For Each Ctl In Frm.Controls
        With Ctl
            Select Case .ControlType
            Case acCheckBox
            .Enabled = False
            Case acComboBox
            .Enabled = False
            Case acCommandButton
            .Enabled = False
            Case acListBox
            .Enabled = False
            Case acOptionButton
            .Enabled = False
            Case acTextBox
            .Enabled = False
            End Select
        End With


    Next Ctl


End Function

麻烦大家再帮我看看吧,我又修改了一下,可是还是不行,窗体里的都可以编辑,就是说enable = false没有设置成功。。。不知道问题出在哪里啊。。
作者: Henry D. Sy    时间: 2009-2-28 07:35
为什么不传例子,让人在这里猜谜语吗?
作者: jun_er    时间: 2009-3-2 20:40
本帖最后由 jun_er 于 2009-3-3 20:33 编辑

这是我的数据库.

通过新建按钮,打开窗体,全部可以编辑。而通过新建纯文档按钮,则打开窗体后,只有三个部分可以编辑。
作者: jun_er    时间: 2009-3-2 21:10
本帖最后由 jun_er 于 2009-3-3 20:33 编辑

通过新建按钮,打开窗体如下



而通过新建纯文档,则打开窗体如下,除了红色圈起来的部分,其他都是非活动状态




我现在想编的语句,就是在按下新建纯文档的时候,先把整个窗体所有控件全部设置为非活动状态,然后在依此将需要编辑的部分设为活动(即红色圈内的部分)。
作者: jun_er    时间: 2009-3-3 20:34
ok.

已经解决了,谢谢大家
作者: jun_er    时间: 2009-3-3 21:39
我把我的解决方案贴出来吧。虽然不是最佳的,但是至少能用。希望对大家有帮助。

Function enabled()
Dim frm As Form
    Dim Ctl As Control
   
    DoCmd.OpenForm "窗体名", acNormal, "", "", acAdd, acNormal
   
    Set frm = Forms![窗体名]
    Forms![窗体名]![子窗体].SetFocus
        
    For Each Ctl In frm.Controls
        With Ctl
            Select Case .ControlType
              Case acCheckBox
              .enabled = False
              Case acComboBox
              .enabled = False
              Case acCommandButton
              .enabled = False
              Case acListBox
              .enabled = False
              Case acOptionButton
              .enabled = False
               Case acTextBox
              .enabled = False
            End Select
        End With


    Next Ctl
End Function




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3