FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 3418|回复: 3
打印 上一主题 下一主题

grid的DataKeys 在数据绑定中的BUG(long类型需要注意了)

[复制链接]
跳转到指定楼层
楼主
发表于 2012-8-29 01:30:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果数据绑定的ID 是long 类型,获取选中行的ID的值,会被改变。

比如:
  DataTable table = new DataTable();
            table.Columns.Add(new DataColumn("Id", typeof(long)));
            table.Columns.Add(new DataColumn("Name", typeof(String)));
            table.Columns.Add(new DataColumn("EntranceYear", typeof(String)));
            table.Columns.Add(new DataColumn("AtSchool", typeof(bool)));
            table.Columns.Add(new DataColumn("Major", typeof(String)));
            table.Columns.Add(new DataColumn("Group", typeof(int)));
            table.Columns.Add(new DataColumn("Gender", typeof(int)));
            table.Columns.Add(new DataColumn("LogTime", typeof(DateTime)));
            table.Columns.Add(new DataColumn("Desc", typeof(string)));
            table.Columns.Add(new DataColumn("Guid", typeof(Guid)));
            table.Columns.Add(new DataColumn("Hobby", typeof(String)));
            // Hobby:reading,basketball,travel,movie,music
            // 爱好:读书, 篮球, 旅游, 电影, 音乐
            // [[4748893713746522227], [1598382814824138521], [7115545863263662460], [-6365282757019369465], [-8289479567123093980]]
            DataRow row = table.NewRow();

            row[0] = 4748893713746522227;
            row[1] = "陈萍萍";
            row[2] = "2000";
            row[3] = true;
            row[4] = "计算机应用技术";
            row[5] = 1;
            row[6] = 0;
            row[7] = DateTime.Now.AddDays(-100);
            row[8] = "陈萍萍,女,20岁,出生于中国南方的一个小山村,毕业于中国科学技术大学。";
            row[9] = new Guid();
            row[10] = "reading,basketball,travel";
            table.Rows.Add(row);

            row = table.NewRow();
            row[0] = 1598382814824138521;
            row[1] = "胡飞";
            row[2] = "2008";
            row[3] = false;
            row[4] = "信息工程";
            row[5] = 1;
            row[6] = 1;
            row[7] = DateTime.Now.AddDays(-90);
            row[8] = "胡飞,男,20岁,出生于中国北方的一个小山村,毕业于南方科学技术大学。";
            row[9] = new Guid();
            row[10] = "reading,basketball";
            table.Rows.Add(row);

在获取行的ID值的时候,
object[] keys = Grid1.DataKeys[e.RowIndex];获取到的值是 4748893713746522000; 而不是原来的值
row[0] = 4748893713746522227;



沙发
 楼主| 发表于 2012-8-29 04:57:00 | 只看该作者

第一列是long类型的数据


提交后,通过获取的DataKeys得到的值,被改变了。

  

本帖子中包含更多资源

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

x
板凳
发表于 2012-8-30 06:34:16 | 只看该作者
夏雨雪(joe) 发表于 2012-8-29 04:57
第一列是long类型的数据

可能存在此问题,先收藏下
地板
发表于 2012-9-1 03:35:24 | 只看该作者
经过一个上午的调试,终于发现问题的所在:

大家也可以写这段JavaScript测试一下:
<script>
var i = 4748893713746522227;
alert(i);
</script>

你会发现弹出的对话框赫然写着: 4748893713746522000


这是因为JavaScript对数字有最大的长度限制,参考这一篇文章:
http://stackoverflow.com/questions/307179/what-is-javascripts-max-int-whats-the-highest-integer-value-a-number-can-go-t

It is 2^53 == 9 007 199 254 740 992. This is because Numbers are stored as floating point is a 52 bit mantissa.

The min value is -2^53.

在对比下JS支持的最大数字:
9007199254740992
4748893713746522227

======================
因为ExtAspNet使用了独创的XState机制(从根本上减少数据的传输量),但是XState需要依赖于保存到页面上的JavaScript上的变量,从而出现了这个问题。


目前不会修正这个问题,如果你有非常大的数字需要在页面回发之间持久化,可以以字符串的形式保存下来,然后服务器端再转换为需要的数字。






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|FineUI 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-9-20 06:38 , Processed in 0.048583 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表