找回密码
 立即注册

QQ登录

只需一步,快速开始

第10001个菜鸟

注册会员

6

主题

16

帖子

54

积分

注册会员

积分
54
第10001个菜鸟
注册会员   /  发表于:2023-6-12 09:33  /   查看:3724  /  回复:9
1金币
本帖最后由 第10001个菜鸟 于 2023-6-14 08:39 编辑

1.如何通过列标题上的复选框实现整列复选框的全选/全不选,我现在列头上设置的复选框无法编辑(勾选或取消勾选)

2.在遍历FpSpread内容时,如何获取复选框的勾选状态
急急急!!!!请知晓的大佬或官方大大指点一下

最佳答案

查看完整内容

情况可以重现出来,看来是spread.net普通单元格会对bool值转换为大写的bool字符串以兼容excel(你可以尝试在excel中输入小写true,也会被转换为大写),实际参与计算时仍会被作为bool值。 那么你可以直接验证这个字符串是“True”“False”来判断是否勾选

9 个回复

倒序浏览
最佳答案
最佳答案
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-6-12 09:33:01
来自 8#
情况可以重现出来,看来是spread.net普通单元格会对bool值转换为大写的bool字符串以兼容excel(你可以尝试在excel中输入小写true,也会被转换为大写),实际参与计算时仍会被作为bool值。

那么你可以直接验证这个字符串是“True”“False”来判断是否勾选
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-6-12 10:05:40
2#
1。列头单元格无法编辑,所以列头的复选框单元格同样是无法选中的。 你可以通过CellClick 事件,自己来判断点击的列头的复选框单元格。写代码来实现全选

  1.             fpSpread1.ActiveSheet.ColumnHeader.Cells[0,0].CellType=new CheckBoxCellType();
  2.             fpSpread1.ActiveSheet.ColumnHeader.Cells[0, 0].Value = false;
  3.             fpSpread1.CellClick += (s, e) => {
  4.                 var sheet = fpSpread1.ActiveSheet;
  5.                 if (e.ColumnHeader && e.Row == 0 && e.Column == 0)
  6.                 {
  7.                     var value = sheet.ColumnHeader.Cells[0, 0].Value;
  8.                     sheet.ColumnHeader.Cells[0, 0].Value = !(bool)sheet.ColumnHeader.Cells[0, 0].Value;
  9.                     for (int i = 0; i < sheet.RowCount; i++)
  10.                     {
  11.                         if(sheet.Cells[i,0].CellType is CheckBoxCellType)
  12.                         {
  13.                             sheet.Cells[i, 0].Value = sheet.ColumnHeader.Cells[0, 0].Value;
  14.                         }
  15.                     }
  16.                 }
  17.             };
复制代码



2.  如上的代码就可以看出,复选框单元格的勾选状态实际就是单元格值(bool型)
回复 使用道具 举报
第10001个菜鸟
注册会员   /  发表于:2023-6-12 16:39:29
3#
本帖最后由 第10001个菜鸟 于 2023-6-12 16:43 编辑
Richard.Ma 发表于 2023-6-12 10:05
1。列头单元格无法编辑,所以列头的复选框单元格同样是无法选中的。 你可以通过CellClick 事件,自己来判断 ...

image.png804072570.png
非常感谢您的帮助,在您的示例代码基础上,我进行了扩展,即当勾选单元格的复选框时,对列头复选框勾选状态进行更新,遇到以下两个问题
1.没有进行列头勾选对整列复选框状态进行更新的前提下(即直接点击单元格的复选框,点之前是未选中的状态),此时通过cellclick获取到的单元格复选框value值为null
2.通过cellclick事件列头复选框给单元格的复选框赋值后,当我获取单元格的复选框value时只能获取到字符串类型的true和false吗?无法转换为bool类型
image.png631892089.png
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-6-12 17:03:46
4#
1,是的,未选中时,有可能是null(初始状态),或者false(设置过false值),这个得你自己判断

2.如果单元格是一个复选框单元格类型,那么就应该是bool型的,如果是普通单元格,那么会是字符串
回复 使用道具 举报
第10001个菜鸟
注册会员   /  发表于:2023-6-12 17:58:23
5#
Richard.Ma 发表于 2023-6-12 17:03
1,是的,未选中时,有可能是null(初始状态),或者false(设置过false值),这个得你自己判断

2.如果 ...

image.png750868530.png

如上述代码,我在页面上先点击了列头的复选框,让这一整列的复选框都有了一个初始值,这时我再去点击单元格中的复选框触发CellClick事件,此时获取到的Value值是字符串类型的True,而不是布尔类型
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-6-12 18:25:47
6#
请上传一个demo,我明天帮你看一下
回复 使用道具 举报
第10001个菜鸟
注册会员   /  发表于:2023-6-13 09:56:01
7#
Richard.Ma 发表于 2023-6-12 18:25
请上传一个demo,我明天帮你看一下

public Form1()
        {
            InitializeComponent();

            DataTable dt = new DataTable();

            dt.Columns.Add("");
            dt.Columns.Add("姓名");
            dt.Columns.Add("年龄");
            dt.Columns.Add("性别");
            dt.Columns.Add("操作");

            DataRow dataRow = dt.NewRow();
            dataRow[1] = "Tom";
            dataRow[2] = "20";
            dataRow[3] = "男";
            dt.Rows.Add(dataRow);

            dataRow = dt.NewRow();
            dataRow[1] = "Jerry";
            dataRow[2] = "10";
            dataRow[3] = "女";
            dt.Rows.Add(dataRow);

            dataRow = dt.NewRow();
            dt.Rows.Add(dataRow);
            dataRow = dt.NewRow();
            dt.Rows.Add(dataRow);
            dataRow = dt.NewRow();
            dt.Rows.Add(dataRow);
            dataRow = dt.NewRow();
            dt.Rows.Add(dataRow);
            dataRow = dt.NewRow();
            dt.Rows.Add(dataRow);
            dataRow = dt.NewRow();
            dt.Rows.Add(dataRow);
            dataRow = dt.NewRow();
            dt.Rows.Add(dataRow);
            dataRow = dt.NewRow();
            dt.Rows.Add(dataRow);

            //在指定位置插入数据源,这种方式可以在多个位置插入数据表,但是需要自己设置列名,且通过FpSpread的DataSource属性无法获取到数据源
            //FarPoint.Win.Spread.Data.SpreadDataBindingAdapter data = new FarPoint.Win.Spread.Data.SpreadDataBindingAdapter();
            //// Assign the datasource to a data table
            //data.DataSource = dt;
            //data.Spread = fpSpread1;
            //data.SheetName = "Sheet1";
            //data.MapperInfo = new FarPoint.Win.Spread.Data.MapperInfo(0, 1, dt.Rows.Count, dt.Columns.Count);
            //data.FillSpreadDataByDataSource();

            //data.DataSource = dt;
            //data.Spread = fpSpread1;
            //data.SheetName = "Sheet1";
            //data.MapperInfo = new FarPoint.Win.Spread.Data.MapperInfo(30, 1, dt.Rows.Count, dt.Columns.Count);
            //data.FillSpreadDataByDataSource();
            fpSpread1.DataSource = dt;

            FarPoint.Win.Spread.CellType.ComboBoxCellType productCboType = new FarPoint.Win.Spread.CellType.ComboBoxCellType();
            productCboType.Items = new string[] { "男", "女" };
            //搜索下拉框内容
            productCboType.AutoSearch = FarPoint.Win.AutoSearch.SingleCharacter;
            productCboType.Editable = true;
            fpSpread1.Sheets[0].Cells[0, 3, dt.Rows.Count - 1, 3].CellType = productCboType;

            ButtonCellType buttonCellType = new ButtonCellType();
            buttonCellType.Text = "删除";
            fpSpread1.Sheets[0].Cells[0, 4, dt.Rows.Count - 1, 4].CellType = buttonCellType;



            CheckBoxCellType chkboxcell = new FarPoint.Win.Spread.CellType.CheckBoxCellType();
            chkboxcell.ThreeState = false;
            chkboxcell.TextTrue = "Checked!";
            chkboxcell.TextFalse = "Check";
            chkboxcell.TextIndeterminate = "Not Sure";
            fpSpread1.ActiveSheet.Cells[0, 0, dt.Rows.Count - 1, 0].CellType = chkboxcell;

            fpSpread1.ActiveSheet.ColumnHeader.Cells[0, 0].CellType = chkboxcell;
            fpSpread1.ActiveSheet.ColumnHeader.Cells[0, 0].Value = false;
            fpSpread1.CellClick += (s, e) =>
            {
                var sheet = fpSpread1.Sheets[0];
                if (e.ColumnHeader && e.Row == 0 && e.Column == 0)
                {
                    var value = sheet.ColumnHeader.Cells[0, 0].Value;
                    sheet.ColumnHeader.Cells[0, 0].Value = !(bool)sheet.ColumnHeader.Cells[0, 0].Value;
                    for (int i = 0; i < sheet.RowCount; i++)
                    {
                        if (sheet.Cells[i, 0].CellType is CheckBoxCellType)
                        {
                            sheet.Cells[i, 0].Value = sheet.ColumnHeader.Cells[0, 0].Value;
                        }
                    }
                }
                else
                {
                    if (e.Column == 0 && sheet.Cells[e.Row, e.Column].CellType is CheckBoxCellType)
                    {
                        bool colCheck = true;
                        for (int i = 0; i < sheet.RowCount; i++)
                        {
                            if (sheet.Cells[i, e.Column].CellType is CheckBoxCellType)
                            {
                                bool cellChk = (bool)sheet.Cells[i, e.Column].Value;
                                if (!cellChk == false)
                                {
                                    colCheck = false;
                                    break;
                                }
                            }
                        }
                        sheet.ColumnHeader.Cells[0, 0].Value = colCheck;
                    }
                }
            };



            //不能在当前数据源占用单元格之外设置
            fpSpread1.Sheets[0].SetValue(6, 0, "哈哈");

            MessageBox.Show("cells[1,1].Value=" + fpSpread1.Sheets[0].Cells[1, 1].Value + "\r\ncells[1,2].Value=" + fpSpread1.Sheets[0].Cells[1, 2].Value);
        }

        private void FpCell_Click(object sender, CellClickEventArgs e)
        {
            MessageBox.Show("aaa");
        }

        private void fpSpread1_ComboSelChange(object sender, EditorNotifyEventArgs e)
        {
            FpCombo cbo = (sender as FpSpread).EditingControl2 as FpCombo;

            MessageBox.Show(cbo.SelectedItem.ToString());
        }

        private void fpSpread1_ButtonClicked(object sender, EditorNotifyEventArgs e)
        {
            if ((sender as FpSpread).EditingControl2 is FpButton)
            {
                //删除当前行
                fpSpread1.ActiveSheet.RemoveRows(e.Row, 1);
            }

            if ((sender as FpSpread).EditingControl2 is FpCheckBox)
            {
                FpCheckBox chk = (sender as FpSpread).EditingControl2 as FpCheckBox;
                if (chk.Checked)
                {
                    MessageBox.Show(fpSpread1.Sheets[0].Cells[e.Row, e.Column + 1].Value == null ? "" : fpSpread1.Sheets[0].Cells[e.Row, e.Column + 1].Value.ToString());
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DataTable dt = fpSpread1.Sheets[0].DataSource as DataTable;

            object value = fpSpread1.ActiveSheet.Cells[0, 0].Value;
        }


整个demo示例上传超过20M了,这是所有的.cs文件代码,前台页面只有一个button和FpSpread

回复 使用道具 举报
第10001个菜鸟
注册会员   /  发表于:2023-6-14 08:38:26
9#
Richard.Ma 发表于 2023-6-13 17:56
情况可以重现出来,看来是spread.net普通单元格会对bool值转换为大写的bool字符串以兼容excel(你可以尝试 ...

好的,我了解了,非常感谢您的帮助
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-6-14 09:09:34
10#
不客气
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部