| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2257 人关注过本帖, 3 人收藏
标题:提供一个在Grid中嵌入CommandButton的自定义控件
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏(3)
 问题点数:0 回复次数:4 
提供一个在Grid中嵌入CommandButton的自定义控件
程序代码:
CLEAR ALL
CLOSE DATABASES ALL
SET DEFAULT TO (Application.ActiveProject.HomeDir)
Form1 = NEWOBJECT("C_Form")        && 从类定义中C_Form中生成窗体
Form1.Show                         && 显示刚才生成的窗体
READ EVENTS                        && 激活交互事件
CLOSE DATABASES ALL
CLEAR ALL
RETURN                             && 程序结束

*-----------------------------
* 程序运行窗体的类定义
*-----------------------------
DEFINE CLASS C_Form AS Form
    Caption = "自定义按钮测试"     && 窗体标题
    WindowState = 2                && 启动时最大化
   
    ADD OBJECT Grid1 AS Grid       && 在窗体中放置一个Grid
   
    *-------------------------
    * 窗体载入内存时打开相关的数据表
    *-------------------------
    PROCEDURE Load
        USE Table1 IN 0
    ENDPROC
   
    *-------------------------
    * 窗体从内存中卸载时关闭已打开的数据表
    *-------------------------
    PROCEDURE Unload
        USE IN Table1
    ENDPROC
   
    *-------------------------
    * 自定义对窗体的控件进行布局的方法
    *-------------------------
    PROCEDURE Arrange
        WITH This.Grid1
            .Top = 5
            .Left = 5
            .Width = ThisForm.Width - .Left - 5
            .Height = ThisForm.Height - .Top - 5
        ENDWITH
    ENDPROC
   
    *-------------------------
    * 窗体激活或获得焦点时
    *-------------------------
    PROCEDURE Activate
        ThisForm.Arrange
    ENDPROC
   
    *-------------------------
    * 窗体改变大小时
    *-------------------------
    PROCEDURE Resize
        ThisForm.Arrange
    ENDPROC
   
    *-------------------------
    * 关闭窗体时释放交互事务
    *-------------------------
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC
   
    *-------------------------
    * 表格的初始化
    *-------------------------
    PROCEDURE Grid1.Init
        WITH This
            .RecordSourceType = 1                               && 数据源为表别名
            .RecordSource = "Table1"                            && 绑定数据源
            WITH .Columns(3)                                    && 对具体数据表中的某列细化
                .RemoveObject("Text1")                          && 移除该栏中内置的TextBox控件
                .AddObject("Button1", "GridCommandButton")      && 新增自定义控件
                WITH .Button1
                    .ControlSource = "Table1.F03"               && 绑定本栏的数据源
                    .TrueCaption = "Yes"                        && 修改预定义的文字
                    .FalseCaption = "No"                        && 修改预定义的文字
                    .Width = 60                                 && 设置控件宽度
                    .Height = 20                                && 设置控件高度
                    .Visible = .T.                              && 让控件可见
                ENDWITH
                .CurrentControl = "Button1"                     && 设定本栏的控制控件
                .Sparse = .F.                                   && 每次Refresh时Grid所有行中本栏的数据均刷新
                .Width = 60                                     && 本栏的宽度与新控件匹配
            ENDWITH
            .RowHeight = 22                                     && 表格行的高度与新控件匹配
        ENDWITH
    ENDPROC
   
ENDDEFINE 

*-----------------------------
* 功能:嵌入Grid中的CommandButton,可与逻辑型数据绑定
* 机制:从Container中继承,构造一个包含隐藏TextBox和呈现CommandButton的
*       自定义控件。TextBox与平常Grid Cell的一样绑定数据,把需要提供的
*       数据转交给CommandButton,以便呈现。
* 注意:数据绑定源须为逻辑型,否则失效或出错。
*-----------------------------
DEFINE CLASS GridCommandButton AS Container
    BorderWidth = 0           && 取消容器的边框线

    *-------------------------
    * 自定义属性
    ControlSource = ""        && 数据绑定源
    TrueCaption = "是"        && 当数据值为.T.时CommandButton的文字
    FalseCaption = "否"       && 当数据值为.F.时CommandButton的文字
    *-------------------------
   
    *-------------------------
    * 内部受保护控件
    *-------------------------
    ADD OBJECT PROTECTED Text1 AS TextBox WITH Visible = .F.
    ADD OBJECT PROTECTED Button1 AS CommandButton
   
    PROCEDURE Width_Assign(tAssign)
        This.Button1.Width = tAssign
    ENDPROC
   
    PROCEDURE Height_Assign(tAssign)
        This.Button1.Height = tAssign
    ENDPROC
   
    PROCEDURE ControlSource_Assign(tAssign)
        WITH This.Text1
            .ControlSource = tAssign
            .Value = EVALUATE(tAssign)
        ENDWITH
    ENDPROC
   
    PROCEDURE Text1.Value_Assign(tAssign)
        This.Value = tAssign
        WITH This.Parent.Button1
            .VisualEffect = IIF(tAssign, 2, 1)
            .Caption = IIF(This.Parent.Text1.Value, This.Parent.TrueCaption, This.Parent.FalseCaption)
        ENDWITH
    ENDPROC
   
    *-------------------------
    * 点击按钮时翻转值的真假
    *-------------------------
    PROCEDURE Button1.Click
        WITH This.Parent.Text1
            .Value = !.Value
        ENDWITH
    ENDPROC
   
ENDDEFINE  


运行效果图:
图片附件: 游客没有浏览图片的权限,请 登录注册

留意图中Grid的当前行在第一行,而第二行的按钮已变换外观,不受记录指针移动的影响。点击按钮除了即时改变外观,数据源也已改变,与平常是一样的。

[ 本帖最后由 TonyDeng 于 2012-7-2 04:22 编辑 ]
收到的鲜花
  • 茵梦湖2012-07-02 12:37 送鲜花  50朵   附言:很好, 赞~
2012-07-02 03:31
muyubo
Rank: 9Rank: 9Rank: 9
来 自:山东莱芜
等 级:蜘蛛侠
威 望:3
帖 子:471
专家分:1017
注 册:2011-3-6
收藏
得分:0 
!版主太执着了,我睡觉醒来,打开电脑,竟然就看到了结果。谢谢!
2012-07-02 03:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你能用得上就好。如果要设置颜色,可以自己编写与Width/Height类似的事件,把传给Container的颜色传递给CommandButton,图片也行,总之没什么做不到的。

授人以渔,不授人以鱼。
2012-07-02 04:01
茵梦湖
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:31
帖 子:545
专家分:2180
注 册:2009-4-25
收藏
得分:0 
以下是引用TonyDeng在2012-7-2 03:31:01的发言:

CLEAR ALL
CLOSE DATABASES ALL
SET DEFAULT TO (Application.ActiveProject.HomeDir)
Form1 = NEWOBJECT("C_Form")        && 从类定义中C_Form中生成窗体
Form1.Show                         && 显示刚才生成的窗体
READ EVENTS                        && 激活交互事件
CLOSE DATABASES ALL
CLEAR ALL
RETURN                             && 程序结束
 
*-----------------------------
* 程序运行窗体的类定义
*-----------------------------
DEFINE CLASS C_Form AS Form
    Caption = "自定义按钮测试"     && 窗体标题
    WindowState = 2                && 启动时最大化
   
    ADD OBJECT Grid1 AS Grid       && 在窗体中放置一个Grid
   
    *-------------------------
    * 窗体载入内存时打开相关的数据表
    *-------------------------
    PROCEDURE Load
        USE Table1 IN 0
    ENDPROC
   
    *-------------------------
    * 窗体从内存中卸载时关闭已打开的数据表
    *-------------------------
    PROCEDURE Unload
        USE IN Table1
    ENDPROC
   
    *-------------------------
    * 自定义对窗体的控件进行布局的方法
    *-------------------------
    PROCEDURE Arrange
        WITH This.Grid1
            .Top = 5
            .Left = 5
            .Width = ThisForm.Width - .Left - 5
            .Height = ThisForm.Height - .Top - 5
        ENDWITH
    ENDPROC
   
    *-------------------------
    * 窗体激活或获得焦点时
    *-------------------------
    PROCEDURE Activate
        ThisForm.Arrange
    ENDPROC
   
    *-------------------------
    * 窗体改变大小时
    *-------------------------
    PROCEDURE Resize
        ThisForm.Arrange
    ENDPROC
   
    *-------------------------
    * 关闭窗体时释放交互事务
    *-------------------------
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC
   
    *-------------------------
    * 表格的初始化
    *-------------------------
    PROCEDURE Grid1.Init
        WITH This
            .RecordSourceType = 1                               && 数据源为表别名
            .RecordSource = "Table1"                            && 绑定数据源
            WITH .Columns(3)                                    && 对具体数据表中的某列细化
                .RemoveObject("Text1")                          && 移除该栏中内置的TextBox控件
                .AddObject("Button1", "GridCommandButton")      && 新增自定义控件
                WITH .Button1
                    .ControlSource = "Table1.F03"               && 绑定本栏的数据源
                    .TrueCaption = "Yes"                        && 修改预定义的文字
                    .FalseCaption = "No"                        && 修改预定义的文字
                    .Width = 60                                 && 设置控件宽度
                    .Height = 20                                && 设置控件高度
                    .Visible = .T.                              && 让控件可见
                ENDWITH
                .CurrentControl = "Button1"                     && 设定本栏的控制控件
                .Sparse = .F.                                   && 每次Refresh时Grid所有行中本栏的数据均刷新
                .Width = 60                                     && 本栏的宽度与新控件匹配
            ENDWITH
            .RowHeight = 22                                     && 表格行的高度与新控件匹配
        ENDWITH
    ENDPROC
   
ENDDEFINE  
 
*-----------------------------
* 功能:嵌入Grid中的CommandButton,可与逻辑型数据绑定
* 机制:从Container中继承,构造一个包含隐藏TextBox和呈现CommandButton的
*       自定义控件。TextBox与平常Grid Cell的一样绑定数据,把需要提供的
*       数据转交给CommandButton,以便呈现。
* 注意:数据绑定源须为逻辑型,否则失效或出错。
*-----------------------------
DEFINE CLASS GridCommandButton AS Container
    BorderWidth = 0           && 取消容器的边框线
 
    *-------------------------
    * 自定义属性
    ControlSource = ""        && 数据绑定源
    TrueCaption = "是"        && 当数据值为.T.时CommandButton的文字
    FalseCaption = "否"       && 当数据值为.F.时CommandButton的文字
    *-------------------------
   
    *-------------------------
    * 内部受保护控件
    *-------------------------
    ADD OBJECT PROTECTED Text1 AS TextBox WITH Visible = .F.
    ADD OBJECT PROTECTED Button1 AS CommandButton
   
    PROCEDURE Width_Assign(tAssign)
        This.Button1.Width = tAssign
    ENDPROC
   
    PROCEDURE Height_Assign(tAssign)
        This.Button1.Height = tAssign
    ENDPROC
   
    PROCEDURE ControlSource_Assign(tAssign)
        WITH This.Text1
            .ControlSource = tAssign
            .Value = EVALUATE(tAssign)
        ENDWITH
    ENDPROC
   
    PROCEDURE Text1.Value_Assign(tAssign)
        This.Value = tAssign
        WITH This.Parent.Button1
            .VisualEffect = IIF(tAssign, 2, 1)
            .Caption = IIF(This.Parent.Text1.Value, This.Parent.TrueCaption, This.Parent.FalseCaption)
        ENDWITH
    ENDPROC
   
    *-------------------------
    * 点击按钮时翻转值的真假
    *-------------------------
    PROCEDURE Button1.Click
        WITH This.Parent.Text1
            .Value = !.Value
        ENDWITH
    ENDPROC
   
ENDDEFINE   
 

运行效果图:

留意图中Grid的当前行在第一行,而第二行的按钮已变换外观,不受记录指针移动的影响。点击按钮除了即时改变外观,数据源也已改变,与平常是一样的。


很好很不错~

2012-07-02 12:35
ksbbzhr
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2012-12-4
收藏
得分:0 
请教版主  
我想要仅仅显示当前行的按钮    而非当前行则不要显示 保持空白
这样该怎么做? 谢谢   我已经搞了大约有2年了  这个问题一直困扰着我
2012-12-04 14:26
快速回复:提供一个在Grid中嵌入CommandButton的自定义控件
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.091129 second(s), 12 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved