找回密码
 立即注册

QQ登录

只需一步,快速开始

mzmlliu

银牌会员

3

主题

13

帖子

2541

积分

银牌会员

积分
2541

活字格认证

最新发帖
mzmlliu
银牌会员   /  发表于:2013-11-6 16:11  /   查看:10990  /  回复:5
各位大神好:
   今天刚刚使用Fpspread, 根据我们公司的业务遇到如下几个问题,请好心的IT牛人帮忙看下该如何实现;
   1. 关于Combobox下拉控件
     1.1 如何绑定整个列的下拉数据,官方如下代码只能单行的绑定,不会要一个For循环去绑定,绑定数据可以是list , datatable类型吗?
         FarPoint.Web.Spread.ComboBoxCellType oblistCell = new FarPoint.Web.Spread.ComboBoxCellType();
         FpSpread1.Sheets[0].Columns[3].CellType = oblistCell;
         FpSpread1.Sheets[0].Cells[0, 3].CellType = new ComboBoxCellType(new string[] { "男", "女" }, new string[] { "男", "女" });
     1.2 表格控件已经实现类似Excel的编辑功能,这个很强大。这就意味着不需要单独用Textbox等控件输入再点添加,直接可以在表格控件实现, 但又碰到一个问题了, 比如我新增一行,第一行第一列新入职的职员,后面的下拉框带出 该职员的职位信息 如: 经理,主管,主任,文员可以供选择。这个又该如何实现呢,我知道有一个FpSpread1_UpdateCommand方法,,可是红色字体这样的绑定 没有效果。
protected void FpSpread1_UpdateCommand(object sender, FarPoint.Web.Spread.SpreadCommandEventArgs e)
    {
         //取得事件名称
            string commandName = e.CommandName;
            //取得当前操作表单
            FarPoint.Web.Spread.SheetView currentSheet = e.SheetView;
            //取得编辑
            ArrayList editValues = e.EditValues;
            //获取当前 Update 列
            int currentCol;
            //通过判断当前元素类型获取当前列
            for (int i = 0; i < editValues.Count; i++)
            {
                if (e.EditValues is string)
                {
                    currentCol = i;
                }               
            }
            //通过 CommandArgument 获取当前行
            int currentRow = (int)(e.CommandArgument);
         
           //获取了行 和 列 我们就去绑定下拉框的数据啦
          FarPoint.Web.Spread.ComboBoxCellType oblistCell = new FarPoint.Web.Spread.ComboBoxCellType();
         FpSpread1.Sheets[0].Columns[currentCol].CellType = oblistCell;
         FpSpread1.Sheets[0].Cells[currentRow , currentCol].CellType = new ComboBoxCellType(new string[] { "经理", "主管" }, new string[] { "经理", "主管" });

   }

2. CheckBox 功能绑定也是遇到这样的情况
  2.1 数据库有一个state的字段{Y,N},如果是Y则表明要勾选,N则不勾选,CheckBox也不像asp.net GridView一样加一个控件就有一个名字,获取那个控件名就可以直接.check=true;
  2.2 还有弱弱的问一句,如何判断哪些行是被选中的呢?

5 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2013-11-6 17:44:00
沙发
回复 1楼mzmlliu的帖子

1. 关于Combobox下拉控件
1.1可以直接通过设置 Column 的单元格类型实现,可以绑定 List 和 Table,简单实现了问题1的demo,请参考:
ComboBoxCellType.zip (15.13 KB, 下载次数: 1236)
回复 使用道具 举报
mzmlliu
银牌会员   /  发表于:2013-11-7 09:41:00
板凳
回复 2楼iceman的帖子

morning iceman,
感谢你的Demo ,现在发现一个问题,我改变textbox的值可以进去FpSpread1_UpdateCommand方法,但是方法中改变comboBox下拉的值没有效果。我再次选择下拉框的值,同样调用FpSpread1_UpdateCommand方法,确可以改变下拉框的值,这是为什么呢,同样的代码,会 有二种效果。
protected void FpSpread1_UpdateCommand(object sender, FarPoint.Web.Spread.SpreadCommandEventArgs e)
    {
            //取得事件名称
            string commandName = e.CommandName;
            //取得当前操作表单
            FarPoint.Web.Spread.SheetView currentSheet = e.SheetView;
            //取得编辑
            ArrayList editValues = e.EditValues;
            //获取当前 Update 列
            int currentCol=0;
            //通过判断当前元素类型获取当前列
            for (int i = 0; i < editValues.Count; i++)
            {
                if (e.EditValues is string)
                {
                    currentCol = i;
                }               
            }
            //通过 CommandArgument 获取当前行
            int currentRow = (int)(e.CommandArgument);
            string aa = FpSpread1.Sheets[0].Cells[currentRow, 0].Text;
        
            //获取了行 和 列 我们就去绑定下拉框的数据啦
            DataSet dsType = GetDataSet();//testServer.SelOtherType();
            FarPoint.Web.Spread.ComboBoxCellType oblistCell = new FarPoint.Web.Spread.ComboBoxCellType();
            oblistCell.AllowWrap = true;
            oblistCell.ShowButton = true;
            oblistCell.DataSource = dsType;
            oblistCell.DataTextField = "uType";
            oblistCell.DataValueField = "uType";
            oblistCell.UseValue = true;
            oblistCell.AutoPostBack = true;
            FpSpread1.Sheets[0].Cells[currentRow, 3].CellType = oblistCell;
    }

/// <summary>
    /// 设置数据源
    /// </summary>
    /// <returns>ComboBoxCellType 使用的数据源</returns>
    private DataSet GetDataSet()
    {
        DataSet ds = new System.Data.DataSet();
        DataTable name;

        name = ds.Tables.Add("Heros");
        name.Columns.AddRange(new DataColumn[] { new DataColumn("uType", typeof(string)), new DataColumn("ID", typeof(Int32)) });
        name.Rows.Add(new object[] { "蜘蛛侠", 0 });
        name.Rows.Add(new object[] { "蝙蝠侠", 1 });

        return ds;
    }
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-11-7 11:51:00
地板
回复 3楼mzmlliu的帖子

UpdateCommand 方法用于监测客户端-也就是在浏览器上对单元格值的修改。

你说的现象我没有办法重现。请问你指的是:两次用同样的方式更改 ComboBox 的值,但是 UpdateCommand 第一次无法捕捉到?

UpdateCommand 中可以取得的是 ComboBoxCellType 的 Value 值,而不是文本值。
Untitled.png

另外,Demo 中 cb.AutoPostBack = true 可以响应后台的 FpSpread1_ButtonCommand 事件,也许对你有帮助。
回复 使用道具 举报
mzmlliu
银牌会员   /  发表于:2013-11-7 12:21:00
5#
回复 4楼iceman的帖子

文本控件的触发事件和下拉控件的触发事件 都是用FpSpread1_UpdateCommand ,附件是昨天你给做的Demo页面。
1. 在我更改文本值后,可以触发到FpSpread1_UpdateCommand 事件,但是下拉控件无法重新绑定值。
2. 我点击下拉框后,同样触发FpSpread1_UpdateCommand 事件,确能重新加载下拉控件数据。

烦请您帮忙看下,非常感谢。

ComboBoxCellType.zip (2.8 KB, 下载次数: 1156)
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-11-7 12:23:00
6#
回复 5楼mzmlliu的帖子

你试试这个链接中的 Demo:http://gcdn.grapecity.com/showto ... ;amp;jump=pid#51927

有问题欢迎继续沟通。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部