找回密码
 立即注册

QQ登录

只需一步,快速开始

dapsjj
初级会员   /  发表于:2016-11-21 15:00  /   查看:3750  /  回复:9
本帖最后由 dapsjj 于 2016-11-21 15:22 编辑

我尝试在LeaveCell事件中写如下代码:
  1. //spread第7列发生变化时,第8列的值等于第7列的值乘以一个double类型的变量a;
  2. private void grdMain_LeaveCell(object sender, LeaveCellEventArgs e)//单元格失去焦点时触发
  3. {
  4.         double a=2.0;
  5.         if (grdMain.ActiveSheet.Cells[e.Row, 6].Value != null)
  6.         {
  7.         grdMain.ActiveSheet.Cells[e.Row, 7].Text = double.Parse(grdMain.ActiveSheet.Cells[e.Row, 6].Value.ToString()) * a;
  8.         }
  9. }
复制代码
但是提示我double类型不能转化为string类型,请问代码如何修改能完成这个功能?
想要下图所示的效果:鼠标离开单元格就改变值。

3.png

9 个回复

倒序浏览
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-11-21 15:27:29
沙发
建议您先判断是否是第7列发生变化,然后再处理,这样就不做重复计算了。
另外 Text是设置一个string类型,double设置到Value属性上。

  1.             double a = 2.0;
  2.             if (e.Column == 6 && fpSpread1.ActiveSheet.Cells[e.Row, 6].Value != null)
  3.             {
  4.                 fpSpread1.ActiveSheet.Cells[e.Row, 7].Value = double.Parse(fpSpread1.ActiveSheet.Cells[e.Row, 6].Value.ToString()) * a;
  5.             }
复制代码
回复 使用道具 举报
dapsjj
初级会员   /  发表于:2016-11-21 15:35:08
板凳
本帖最后由 dapsjj 于 2016-11-21 15:37 编辑
dexteryao 发表于 2016-11-21 15:27
建议您先判断是否是第7列发生变化,然后再处理,这样就不做重复计算了。
另外 Text是设置一个string类型, ...

我改成grdMain.ActiveSheet.Cells[e.Row, 7].Text = (double.Parse(grdMain.ActiveSheet.Cells[e.Row, 6].Value.ToString()) * a).ToString();也好用了,请问这种写法与您说的:fpSpread1.ActiveSheet.Cells[e.Row, 7].Value = double.Parse(fpSpread1.ActiveSheet.Cells[e.Row, 6].Value.ToString()) * a;有什么区别吗?哪种更好一些?
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-11-21 15:59:45
地板
单元格的Value 是个object,double也可以是string。
Text就是将Value formatTostring后的结果。建议使用Value,可以保留原始的数据类型

评分

参与人数 1满意度 +5 收起 理由
dapsjj + 5 赞一个!

查看全部评分

回复 使用道具 举报
dapsjj
初级会员   /  发表于:2016-11-21 16:59:03
5#
dexteryao 发表于 2016-11-21 15:59
单元格的Value 是个object,double也可以是string。
Text就是将Value formatTostring后的结果。建议使用Va ...
  1. grdMain.ActiveSheet.Cells[e.Row, 9].Value = double.Parse(grdMain.ActiveSheet.Cells[e.Row, 4].Value.ToString()) *
  2. double.Parse(grdMain.ActiveSheet.Cells[e.Row, 6].Value.ToString());
复制代码

提示System.FormatException,怎么处理?
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-11-21 17:22:33
6#
您使用 double.Parse(grdMain.ActiveSheet.Cells[e.Row, 6].Value.ToString()) 是有问题的,如果用户输入的字符串无法转换成数字就会报错。
您可以使用NumberCell Type限制用户输入

  1.             NumberCellType nct = new NumberCellType();
  2.             fpSpread1.ActiveSheet.Cells[0, 0].CellType = nct;
复制代码


或者用下面的代码判断。
  1.             double a = 2.0;
  2.             if (e.Row == 6 && fpSpread1.ActiveSheet.Cells[e.Row, 6].Value != null)
  3.             {
  4.                 double newValue = 0;
  5.                 if (double.TryParse(fpSpread1.ActiveSheet.Cells[e.Row, 6].Value.ToString(), out newValue))
  6.                 {
  7.                     fpSpread1.ActiveSheet.Cells[e.Row, 7].Value = newValue * a;
  8.                 }
  9.             }
复制代码
回复 使用道具 举报
dapsjj
初级会员   /  发表于:2016-11-21 17:38:14
7#
dexteryao 发表于 2016-11-21 17:22
您使用 double.Parse(grdMain.ActiveSheet.Cells[e.Row, 6].Value.ToString()) 是有问题的,如果用户输入的 ...

我这里spread设计器设置的是number类型,还需要再按照您说的:
NumberCellType nct = new NumberCellType();
fpSpread1.ActiveSheet.Cells[0, 0].CellType = nct;
再写上这个代码吗?
2016-11-21_173707.png
回复 使用道具 举报
dapsjj
初级会员   /  发表于:2016-11-21 17:48:16
8#
dexteryao 发表于 2016-11-21 17:22
您使用 double.Parse(grdMain.ActiveSheet.Cells[e.Row, 6].Value.ToString()) 是有问题的,如果用户输入的 ...

我把Cells[0, 0].CellType = nct;改成grdMain.ActiveSheet.Columns[4].CellType = nct;也就是第5列怎么就不对呢?
代码为:
  1.            NumberCellType nct = new NumberCellType();
  2.                     grdMain.ActiveSheet.Columns[4].CellType = nct;
  3.                     grdMain.ActiveSheet.Columns[6].CellType = nct;
  4.                     grdMain.ActiveSheet.Cells[e.Row, 9].Value = double.TryParse(grdMain.ActiveSheet.Cells[e.Row, 4].Value.ToString(), nct)
  5. * double.TryParse(grdMain.ActiveSheet.Cells[e.Row, 6].Value.ToString(), nct);
  6.                     
复制代码

请问哪里错了?
回复 使用道具 举报
dapsjj
初级会员   /  发表于:2016-11-21 18:00:12
9#
dexteryao 发表于 2016-11-21 17:22
您使用 double.Parse(grdMain.ActiveSheet.Cells[e.Row, 6].Value.ToString()) 是有问题的,如果用户输入的 ...
  1. if (ds != null && ds.Tables[0].Rows[0][12].ToString() == "1")
  2.                 {
  3.                   
  4.                     double newValue1 = 0;
  5.                     double newValue2 = 0;
  6.                   
  7.                     if(double.TryParse(grdMain.ActiveSheet.Cells[e.Row, 4].Value.ToString(), out newValue1)&&
  8.                        double.TryParse(grdMain.ActiveSheet.Cells[e.Row, 6].Value.ToString(), out newValue2))
  9.                     {
  10.                         grdMain.ActiveSheet.Cells[e.Row, 9].Value = newValue1 * newValue2;
  11.                     }
  12.   
  13.                 }
复制代码

这样改就不出错了。
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-11-22 08:34:40
10#
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部