找回密码
 立即注册

QQ登录

只需一步,快速开始

victorysoft

高级会员

40

主题

100

帖子

1040

积分

高级会员

积分
1040

活字格认证

victorysoft
高级会员   /  发表于:2014-5-26 10:23  /   查看:8845  /  回复:7
fpSpread1_Sheet1.AddCustomFunction(new CFHuiZong(fpSpread1_Sheet1));
fpSpread1_Sheet1.SetFormula(i, lh, "CFHuiZong(" + i.ToString() + "," + colzbbm.ToString() + "," + lh.ToString() + ")");


  /// <summary>
    /// 汇总
    /// </summary>
    public class CFHuiZong : FunctionInfo
    {
        private SheetView fpSpread1_Sheet1 = null;
        public CFHuiZong(SheetView fpSpread1_Sheet1)
        {
            this.fpSpread1_Sheet1 = fpSpread1_Sheet1;
        }
        public override string Name
        {
            get { return "CFHuiZong"; }
        }
        public override int MinArgs
        {
            get { return 3; }
        }
        public override int MaxArgs
        {
            get { return 3; }
        }
        public override bool AcceptsReference(int i)
        {
            return i == 0;
        }
        public override object Evaluate(object[] args)
        {
            decimal sumval = 0;
            int row = CalcConvert.ToInt(args[0]);
            int col = CalcConvert.ToInt(args[1]);
            int valcol = CalcConvert.ToInt(args[2]);
            int jcbzcol=fpSpread1_Sheet1.Columns["JCBZ"].Index;
            string zbbm = fpSpread1_Sheet1.Cells[row, col].Text;
            for (int i = 0; i < fpSpread1_Sheet1.RowCount; i++)
            {
                if (i != row)
                {
                    string zbbmnew = fpSpread1_Sheet1.Cells[i, col].Text;
                    int jcbz = 0;
                    int.TryParse(fpSpread1_Sheet1.Cells[i, valcol].Text,out jcbz);
                    if (zbbmnew.Length - 3 == zbbm.Length
                        &amp;&amp; zbbmnew.IndexOf(zbbm) == 0
                        &amp;&amp; jcbz==0)
                    {
                        decimal val = 0;
                        decimal.TryParse(fpSpread1_Sheet1.Cells[i, valcol].Text, out val);
                        sumval += val;
                    }
                }
            }
            return sumval;
        }
    }

我写完自定义公式后,第一次加载窗体会计算,但是修改单元格的值以后不会自动计算,但是修改带有公式的单元格的值以后,会自动计算为公式返回的值.
环境信息    spread版本为6.0 winform framework4.0  工具 vs2010

7 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2014-5-26 12:27:00
沙发
回复 1楼victorysoft的帖子

你好,
请尝试在 Spread Change 事件中添加以下代码手动调用重新计算:

  1.         void fpSpread1_Change(object sender, ChangeEventArgs e)
  2.         {
  3.             this.fpSpread1.Sheets[0].RecalculateAll();
  4.         }
复制代码
回复 使用道具 举报
victorysoft
高级会员   /  发表于:2014-5-26 14:43:00
板凳
回复 2楼iceman的帖子

加上这个事件一级公式可以执行,但是多级公式无法执行.如有1,2,3,4,5,6,7行数据,2行为3,4行的合计值,5行为6,7行的合计值,而1行为2,5行的合计值,这样的情况下,用那个事件,只能合计出2,5行的值,无法合计出1行的值.
回复 使用道具 举报
victorysoft
高级会员   /  发表于:2014-5-26 15:20:00
地板
回复 2楼iceman的帖子

void fpSpread1_Sheet1_CellChanged(object sender, SheetViewEventArgs e)
        {
            try
            {
                fpSpread1_Sheet1.RecalculateAll();
            }
            catch
            {
            }
        }
用这个可以,但是不加try,会引发一个未将对象引用到对象实力的异常,不知如何判定.
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-5-26 15:28:00
5#
回复 3楼victorysoft的帖子

能否请你制作一个重现问题的演示程序发送到论坛。因为我从描述看实际使用场景还比较复杂,我这边可能无法很完整的模拟。谢谢
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-6-3 09:16:00
6#
回复 4楼victorysoft的帖子

请问问题当前进展如何?
回复 使用道具 举报
victorysoft
高级会员   /  发表于:2014-6-4 16:10:00
7#
我放弃使用自定义公式了,改用函数了
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-6-4 16:49:00
8#
回复 7楼victorysoft的帖子

好的,感谢你反馈问题结果。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部