FineUI 官方论坛

标题: grid的DataKeys 在数据绑定中的BUG(long类型需要注意了) [打印本页]

作者: 夏雨雪(joe)    时间: 2012-8-29 01:30
标题: grid的DataKeys 在数据绑定中的BUG(long类型需要注意了)
如果数据绑定的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;




作者: 夏雨雪(joe)    时间: 2012-8-29 04:57
[attach]1003[/attach]
第一列是long类型的数据

[attach]1004[/attach]
提交后,通过获取的DataKeys得到的值,被改变了。

  


作者: sanshi    时间: 2012-8-30 06:34
夏雨雪(joe) 发表于 2012-8-29 04:57
第一列是long类型的数据

可能存在此问题,先收藏下
作者: sanshi    时间: 2012-9-1 03:35
经过一个上午的调试,终于发现问题的所在:

大家也可以写这段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 官方论坛 (https://fineui.com/bbs/) Powered by Discuz! X3.4