找回密码
 立即注册

QQ登录

只需一步,快速开始

sxyweiren

中级会员

73

主题

366

帖子

755

积分

中级会员

积分
755

活字格认证微信认证勋章

sxyweiren
中级会员   /  发表于:2013-12-17 13:29  /   查看:8069  /  回复:7
TrueDBGrid的BeforeColUpdate事件里面如果e.Cancel=True,值好像达不到还原成之前入力的值的动作啊?

如何能够达到还原成之前的值的动作?
如果有Format怎么办?
如果有EditMask怎么办?这些属性的设置对值的还原有没有影响?

如果搞封装怎么封装?

如果设定某一个单元格只能入力数字应该怎么控制?有多少种控制方法?

7 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2013-12-17 18:36:00
沙发
回复 1楼sxyweiren的帖子

可以通过以下代码设置单元格值还原为更改之前文本:

  1.         void c1TrueDBGrid1_BeforeColUpdate(object sender, C1.Win.C1TrueDBGrid.BeforeColUpdateEventArgs e)
  2.         {
  3.             e.Cancel = true;
  4.             int row=this.c1TrueDBGrid1.Row;
  5.             int col=e.ColIndex;
  6.             this.c1TrueDBGrid1[row, col] = e.OldValue;
  7.         }
复制代码


在我理解,Mask 和 格式信息不会随着值的改变而更改。
回复 使用道具 举报
sxyweiren
中级会员   /  发表于:2013-12-17 18:55:00
板凳
问题①:
但是如果是如下的操作

        void c1TrueDBGrid1_BeforeColUpdate(object sender, C1.Win.C1TrueDBGrid.BeforeColUpdateEventArgs e)
        {
            if(isNumber(c1TrueDBGrid1[row, col] ))//这里是判断单元格的内容是不是数值
            {
            e.Cancel = true;
            int row=this.c1TrueDBGrid1.Row;
            int col=e.ColIndex;
            this.c1TrueDBGrid1[row, col] = e.OldValue;
        }
        }

在初期单元格内容为空的情况下,虽然单元格的内容变成了空,但是光标还是不能离开。

问题②:
>>在我理解,Mask 和 格式信息不会随着值的改变而更改。
?
但是如果EditMask为“0000/00/00”,并且设置EditMaskUpdate=True,
                If IsDate(C1TrueDBGrid1.Columns(1).Value) = False Then
                    e.Cancel = True
                    C1TrueDBGrid1.Columns(1).Value = e.OldValue
                    Exit Sub
                End If
单元格内输入【1212/31/23】的话,按回车键会有奇迹发生,显示的值就乱了。

问题③:如果设定某一个单元格只能入力数字应该怎么控制?有多少种控制方法?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-12-18 11:01:00
地板
回复 3楼sxyweiren的帖子

问题一,我没能重现,能否把 Demo 发上来我看看。使用的是否为日文版控件?由于我们没有安装日文版控件环境,所以使用英文版进行测试。

问题二,如果设置 EditMask 为 “0000/00/00” ,TrueDBGrid 会认为是日期型,1212/31/23 为非法数据,英文版中弹出提出框提示非法数据。你可以把 Demo 发上来我查看。

问题三,可以通过两种方式,数据库中字段类型设置为 Int 型,或者设置 EditMask 为 “#”:

  1. this.c1TrueDBGrid1.Columns[0].EditMask = "##########";
复制代码


另外,建议参考随机安装 Demo,英文版路径为:C:\Users\用户名\Documents\ComponentOne Samples\Studio for WinForms\C1TrueDBGrid\Samples\CS\TriStateCheckBox
回复 使用道具 举报
sxyweiren
中级会员   /  发表于:2013-12-18 12:04:00
5#
回复 4楼iceman的帖子

问题1:
新的TrueDBGrid,什么东西都不加,只加下面一个事件:
    Private Sub C1TrueDBGrid1_BeforeColUpdate(ByVal sender As Object, ByVal e As C1.Win.C1TrueDBGrid.BeforeColUpdateEventArgs) Handles C1TrueDBGrid1.BeforeColUpdate
        Select Case C1TrueDBGrid1.Col
            Case 1
                '数字以外
                If IsNumeric(C1TrueDBGrid1.Columns(1).Value) = False Then
                    e.Cancel = True
                    C1TrueDBGrid1.Columns(1).Value = e.OldValue
                    Exit Sub
                End If
        End Select
    End Sub

问题2:英文版的如果Source里面不写提示框(Msgbox)的代码也会弹出MsgBox?
代码就是上面的把IsNumeric 换成IsDate就可以了。

问题3: ####好像是可以输入+的?变成0会不会好一些?如果是长度没有限制的数字呢?

※上面的代码全是VB.NET的代码
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-12-18 18:18:00
6#
回复 5楼sxyweiren的帖子

1.英文版中 C1TrueDBGrid 如果只是拖拽后的效果,则没有操作界面。
2.是的,默认既有提示框弹出。

前两个问题,我觉得和语言版本关系比较密切,我建议你也到日本论坛发帖询问:
https://www.grapecity.com/japan/support/
回复 使用道具 举报
sxyweiren
中级会员   /  发表于:2013-12-19 14:09:00
7#
回复 6楼iceman的帖子

1,就是一个空白的TrueDBGrid,增加BeforeColUpdate事件来Check的。

2,手里没有英文版的开发环境。这个我去那边问问吧。日文版的好像必须CD号才行呢。客户只给了序列号。

3,如何限定为只能入力数字?长度无限制的那种。
回复 使用道具 举报
gw0506
超级版主   /  发表于:2013-12-19 17:47:00
8#
问题1,2参考之前的回复,需要你在我们日本论坛寻找帮助。
问题3,长度不能无限制,因为数字类型本身是有为数限制的。设置只能输入数字可以使用:
  1. this.c1TrueDBGrid1.Columns["Value"].NumberFormat = "0.000"
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部