找回密码
 立即注册

QQ登录

只需一步,快速开始

chenf1980

论坛元老

41

主题

147

帖子

9349

积分

论坛元老

积分
9349

活字格认证

chenf1980
论坛元老   /  发表于:2011-5-20 17:54  /   查看:10047  /  回复:11
数据库的有个字段为number,长度为10
在MultiRow的cell里面,长度也设置为10,结果输入1111111111没事,输入9999999999就出问题了。

multiRow里面,我添加了一个事件,是为了format用的:
Protected Overrides Sub OnCellFormatting(ByVal e As GrapeCity.Win.MultiRow.CellFormattingEventArgs)
            If TypeOf Me.Rows(e.RowIndex)(e.CellIndex) Is NumericUpDownCell _
                    OrElse Not String.IsNullOrEmpty(e.CellStyle.Format) Then
                Dim value As Object = e.Value
                If value IsNot Nothing AndAlso Not IsDBNull(value) Then
                    If IsNumeric(value) Then
                             e.Value = CDec(value).ToString(e.CellStyle.Format)
                    End If
                End If
            End If
            MyBase.OnCellFormatting(e)
        End Sub

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

11 个回复

正序浏览
neil
论坛元老   /  发表于:2011-5-23 10:46:00
12#

回复 6# chenf1980 的帖子

不明白你为什么要自己处理CellFormatting事件。

不过你上面改ValueType的时机不对。
应该是在模板的构造函数中,  在调用InitializeComponent()之后, 添加语句改ValueType.

比如:
public Template2()
        {
            InitializeComponent();
            this.numericUpDownCell1.ValueType = typeof(Int64);
        }

运行起来之后,你可以在监视窗口中查看ValueType属性是否该成功了,如果改成int64还是有异常,请直接改为Decimal。
回复 使用道具 举报
barrylei
中级会员   /  发表于:2011-5-23 10:38:00
11#

回复 9# chenf1980 的帖子

你不要再OnCellValidating里改,要在定义模板的地方改,就是生成模板的那个地方,Template.Designer.vb的InitializeComponent里。(这块改了以后,如果再次在Designer里修改模板,可能会丢掉)
或者在FormLoad里改,写下面的Code,(我用的C#,你可能要转成VB)

  1. Template template = this.gcMultiRow1.Template;  //先把模板取出来
  2. template.Row.Cells[0].ValueType = typeof(Int64); //修改你想要改的Cell的ValueType,作为例子,我设的是Cell(0)
  3. this.gcMultiRow1.Template = template;// 再把模板赋回去
复制代码
回复 使用道具 举报
neil
论坛元老   /  发表于:2011-5-23 10:25:00
10#

回复 9# chenf1980 的帖子

你设的format是什么样子的。
回复 使用道具 举报
chenf1980
论坛元老   /  发表于:2011-5-23 09:56:00
9#
是类型转化异常。如果用datatable模拟数据库的话,如果一开始指定类型为int32
Dim columnNameList As New ArrayList(New String() {"C1", "C2", "C3", "C4", "C5", "C6", "C7"})
        Dim dtTable As New DataTable
        For ii = 0 To 6
            dtTable.Columns.Add(columnNameList(ii), GetType(Int32))
        Next
那么尽管后面对这个Cell进行重新指定
Protected Overrides Sub OnCellValidating(ByVal e As GrapeCity.Win.MultiRow.CellValidatingEventArgs)
        Me.Item(e.RowIndex, e.CellName).ValueType = GetType(Int64)
        MyBase.OnCellValidating(e)  
  End Sub

这样的话,还是不行
回复 使用道具 举报
barrylei
中级会员   /  发表于:2011-5-23 09:18:00
8#

回复 5# chenf1980 的帖子

》奇怪的,valuetype改成int64之后,还是出现了更上面图片同样的错误。请问,应该如何修改?

如果还是出现相同的错误,那确实有一点奇怪,因为从异常的信息来看,它报的是Int32转换异常。
这样,你能给我发一个Sample吗,我来check一下。数据库连接那边你不需要附加你的数据库,你写一个DataTable模拟你的数据库,一两个字段就可以。只要问题能重现就行。
回复 使用道具 举报
barrylei
中级会员   /  发表于:2011-5-23 09:14:00
7#
我们是双休的,刚好周六加班,看到你的帖子,所以就回了。
回复 使用道具 举报
chenf1980
论坛元老   /  发表于:2011-5-21 15:49:00
6#
版主都是双休的吗?
回复 使用道具 举报
chenf1980
论坛元老   /  发表于:2011-5-21 13:44:00
5#
奇怪的,valuetype改成int64之后,还是出现了更上面图片同样的错误。请问,应该如何修改?
回复 使用道具 举报
barrylei
中级会员   /  发表于:2011-5-21 11:10:00
地板
在模板上把你要绑的那个Cell的ValueType设置成Int64就可以了。

  1.             TextBoxCell text = new TextBoxCell();
  2.             text.ValueType = typeof(Int64);
复制代码
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部