找回密码
 立即注册

QQ登录

只需一步,快速开始

thesadfrog

银牌会员

6

主题

14

帖子

2958

积分

银牌会员

积分
2958

活字格认证

thesadfrog
银牌会员   /  发表于:2011-10-25 17:47  /   查看:12049  /  回复:17
刚入手 spread组件. 真难. 算是实现了功能,但感觉怪怪的,斑竹给判一下,是否有更好的解决办法?
(通过web service 访问sql数据库)
spread V3
vs2005

pageload code
--------------------------
                    FpSpread1.DataSource = ObjectDataSource2;
                    FpSpread1.DataBind();//dataset


                    foreach (FarPoint.Web.Spread.Column c in FpSpread1.Sheets[0].Columns)
                    {
                        if (c.DataField == "DeptBudgetTaskEntryID"
                            || c.DataField == "DeptAcctID"
                            || c.DataField == "ListOrder"
                            )
                        {
                            c.Visible = false;
                        }
                        else
                        {
                            switch (c.DataField)
                            {
                                case "BudgetName":
                                    c.Label = "预算项目";
                                    break;
                                case "Num":
                                    c.Label = "数量";
                                    IntegerCellType ict = new IntegerCellType();
                                    ict.ErrorMessage = "请输入正整型数据";
                                    ict.MinimumValue = 0;
                                    c.CellType = ict;
                                    break;
                                case "price":
                                    c.Label = "单价(元)";
                                    CurrencyCellType cct = new CurrencyCellType();
                                    cct.MinimumValue = 0;
                                    cct.ErrorMessage = "货币数据类型";
                                   
                                    cct.NumberFormat = GetNumFormat();
                                    c.CellType = cct;
                                    break;
                                case "DeptBudgetAmount":
                                    c.Label = "部门预算(元)";
                                    CurrencyCellType cct1 = new CurrencyCellType();
                                    cct1.MinimumValue = 0;
                                    cct1.ErrorMessage = "货币数据类型";
                                    cct1.NumberFormat = GetNumFormat();
                                    c.CellType = cct1;
                                    break;
                                case "unit":
                                    c.Label = "计量单位(数量)";
                                    break;
                                case "Location":
                                    c.Label = "地点";
                                    break;
                                case "note":
                                    c.Label = "必要性支出说明";
                                    break;

                            }

                        }
                    }
--------------------------pageload over
update code
----------------
protected void FpSpread1_UpdateCommand(object sender, FarPoint.Web.Spread.SpreadCommandEventArgs e)
        {
            string DeptBudgetTaskEntryID = "";
            

            string BudgetName = "";
            int Num = 0;
            decimal price = 0;
            decimal DeptBudgetAmount = 0;
            string unit = "";
            string Location = "";
            string note = "";

            for (int i = 0; i < e.EditValues.Count; i++)
            {
                if (e.EditValues[i].ToString() != "System.Object")//非隐藏列,e.EditValues[i]=object ,此处如何判断 目前的判断感觉太变态
                {
                    switch (FpSpread1.Sheets[0].Columns[i].DataField) //根据绑定列 ,获取字段值
                    {
                        case "BudgetName":
                            BudgetName = e.EditValues[i].ToString();
                            break;
                        case "Num":
                            Num = Convert.ToInt32(e.EditValues[i]);
                            break;
                        case "price":
                            price = Convert.ToDecimal(e.EditValues[i]);
                            break;
                        case "DeptBudgetAmount":
                            DeptBudgetAmount = Convert.ToDecimal(e.EditValues[i]);
                            break;
                        case "unit":
                            unit = e.EditValues[i].ToString();
                            break;
                        case "Location":
                            Location = e.EditValues[i].ToString();
                            break;

                        case "note":
                            note = e.EditValues[i].ToString();
                            break;
                    }
                }
                else//隐藏列,获取主键
                {
                    switch (FpSpread1.Sheets[0].Columns[i].DataField)
                    {
                        case "DeptBudgetTaskEntryID":
                            DeptBudgetTaskEntryID = e.SheetView.GetValue(Convert.ToInt32(e.CommandArgument), i).ToString();
                            break;
                    }
                }
            }

            //调用数据访问层(webservice)保存数据
            DeptBudgetDataAccess.P7DeptBudgetEntryUpdate(
                DeptBudgetTaskEntryID, BudgetName,Num,price,DeptBudgetAmount,unit,Location,note);

            e.Handled = true;
        }[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]

17 个回复

倒序浏览
jxsgood
中级会员   /  发表于:2011-10-26 00:17:00
沙发
可以与你交流下,我也是初学。以下是我进行了简单的测试后的结论,可能有不对的地方。

方法一:FpSpread1.DataSource = SqlDataSource1;
预先设置SqlDataSource1的各项参数(包括查询,更新,删除,插入),通这样绑定数据后:
数据正常显示单元格类型与数据库字段类型不匹配commanbar上边的 更新、删除、插入 等操作无效果。

方法二:FpSpread1.DataSourceID = “SqlDataSource1”;
预先设置SqlDataSource1的各项参数(包括查询,更新,删除,插入),通这样绑定数据后:
数据正常显示单元格类型与数据库字段类型不匹配,commanbar上边的 更新、插入成功删除操作无效果

方法三:FpSpread1.DataSource = DataSet;
先自己写代码:生成DataSet,然后绑定到FpSpread1,通过这样绑定数据后:
数据正常显示,单元格格式自动匹配数据库字段类型(文本、整数、小数、bit型都能自动识别),这种方式的,更新、插入、删除 就只能自己写代码了。

方法四:在界面设计时候就直接绑定到SqlDataSource1,方法参考:
http://gcdn.grapecity.com/showtopic-2343.html
数据显示正常,单元格格式自动匹配数据库字段类型(在界面绑定的时候,列字段类型就生成了)commanbar上边的 更新、插入、删除 功能全部都成功。


综上所述:
方法一: 最差的,需要自己写代码设置字段类型,自己写代码进行数据库操作。
方法四: 看起来最完美,但是不够灵活,需要在页面生成前就预先进行配置,非常有局限性。

我比较喜欢方法三:这是最灵活的,更新、插入、删除的代码虽不能偷懒,但可以自己掌控。字段类型可以不用特别考虑了,甚至列标题都不用在FpSpread设置,在生成DataSet的时候,就可以通过SQL把列标题换了。


PS:为什么回复都需要审核啊?
回复 使用道具 举报
thesadfrog
银牌会员   /  发表于:2011-10-26 09:11:00
板凳

回复 2# jxsgood 的帖子

SqlDataSource 我这里是不能用, sql对web不可见,只能通过webservice访问数据.


再咨询一个问题, 设计期,先设计好模版,然后再bangding, 不行么?,不想代码控制列.可视化开发的 优点给砍了.
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-10-26 12:27:00
地板
你好,
目前没有更好的办法去判断,因为e.EditValues返回值的类型只有 Object 和 String.不过你把判断主键的代码移动到循环外面会更好一些.
另外,判断类型通常使用 is 关键字去判断.
回复 使用道具 举报
thesadfrog
银牌会员   /  发表于:2011-10-26 12:40:00
5#

回复 4# iceman 的帖子

再问一句, 代码 update 保存到数据库之后, 界面 数据还是 旧数据, 需要怎么 处理 ?
重新绑定?  or 编码 给单元格 赋值?
浪费资源,              麻烦
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-10-26 14:19:00
6#

回复 5# thesadfrog 的帖子

你好,我绑定数据库执行 Update ,Spread 界面上显示的数据为新数据,所以没有重现出你的问题,请问你所指的界面数据是 <b> Spread界面</b>上的数据 还是<b> 数据库</b>中的数据 没有改变?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-10-26 14:57:00
7#

回复 3# thesadfrog 的帖子

你好,如果设计模板的意思是指之前设计好 Spread 界面,之后绑定数据源.可以设置:
  1. FpSpread1.Sheets[0].DataAutoCellTypes = false;
复制代码
设置表单就不会自动生成列的数据类型.
回复 使用道具 举报
thesadfrog
银牌会员   /  发表于:2011-10-26 15:02:00
8#
我是按照 一楼的办法 保存的 数据(del update insert ), 界面数据 没变化(删除,删除行还在), (可能和我的binding方式有关).
我重新binding 后就ok了
  protected void FpSpread1_DeleteCommand(object sender, FarPoint.Web.Spread.SpreadCommandEventArgs e)
        {
            Hashtable ht = (Hashtable)e.SheetView.GetDataKey((int)e.CommandArgument);

            ht = (Hashtable)ht[&quot;key&quot;];

            string DeptBudgetTaskEntryID = ht[&quot;DeptBudgetTaskEntryID&quot;].ToString();

            DeptBudgetDataAccess.P7DeptBudgetTaskEntryDel(DeptBudgetTaskEntryID);

            e.SheetView.RemoveRows((int)e.CommandArgument, 1); //没有这句, 前台界面的数据还在

            e.Handled = true;
        }
回复 使用道具 举报
jxsgood
中级会员   /  发表于:2011-10-26 23:23:00
9#
e.Handled = true;
如果将Handled 设为True,那么客服端事件将会被取消,也就是说你服务器端代码虽然执行了,但是系统不处理客服端了,所以客服端界面没有被处理。

我觉得这个参数相当有用,当服务器端处理出现错误的时候,可以把它设定为 true,这样就可以保证客服显示数据,与数据库一致。
比如:你webserver更新数据库失败了,马上设置 e.Handled = true; 客服端显示就跟没更新前一样,保持数据库数据与页面数据一致。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-10-27 09:14:00
10#

回复 9# jxsgood 的帖子

楼上正解~:strong:
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部