第10001个菜鸟 发表于 2023-6-12 09:33:00

Spread Winform 16.1 ChekcBox使用问题

本帖最后由 第10001个菜鸟 于 2023-6-14 08:39 编辑

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

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

Richard.Ma 发表于 2023-6-12 09:33:01

情况可以重现出来,看来是spread.net普通单元格会对bool值转换为大写的bool字符串以兼容excel(你可以尝试在excel中输入小写true,也会被转换为大写),实际参与计算时仍会被作为bool值。

那么你可以直接验证这个字符串是“True”“False”来判断是否勾选

Richard.Ma 发表于 2023-6-12 10:05:40

1。列头单元格无法编辑,所以列头的复选框单元格同样是无法选中的。 你可以通过CellClick 事件,自己来判断点击的列头的复选框单元格。写代码来实现全选

            fpSpread1.ActiveSheet.ColumnHeader.Cells.CellType=new CheckBoxCellType();
            fpSpread1.ActiveSheet.ColumnHeader.Cells.Value = false;
            fpSpread1.CellClick += (s, e) => {
                var sheet = fpSpread1.ActiveSheet;
                if (e.ColumnHeader && e.Row == 0 && e.Column == 0)
                {
                  var value = sheet.ColumnHeader.Cells.Value;
                  sheet.ColumnHeader.Cells.Value = !(bool)sheet.ColumnHeader.Cells.Value;
                  for (int i = 0; i < sheet.RowCount; i++)
                  {
                        if(sheet.Cells.CellType is CheckBoxCellType)
                        {
                            sheet.Cells.Value = sheet.ColumnHeader.Cells.Value;
                        }
                  }
                }
            };


2.如上的代码就可以看出,复选框单元格的勾选状态实际就是单元格值(bool型)

第10001个菜鸟 发表于 2023-6-12 16:39:29

本帖最后由 第10001个菜鸟 于 2023-6-12 16:43 编辑

Richard.Ma 发表于 2023-6-12 10:05
1。列头单元格无法编辑,所以列头的复选框单元格同样是无法选中的。 你可以通过CellClick 事件,自己来判断 ...

非常感谢您的帮助,在您的示例代码基础上,我进行了扩展,即当勾选单元格的复选框时,对列头复选框勾选状态进行更新,遇到以下两个问题
1.没有进行列头勾选对整列复选框状态进行更新的前提下(即直接点击单元格的复选框,点之前是未选中的状态),此时通过cellclick获取到的单元格复选框value值为null
2.通过cellclick事件列头复选框给单元格的复选框赋值后,当我获取单元格的复选框value时只能获取到字符串类型的true和false吗?无法转换为bool类型

Richard.Ma 发表于 2023-6-12 17:03:46

1,是的,未选中时,有可能是null(初始状态),或者false(设置过false值),这个得你自己判断

2.如果单元格是一个复选框单元格类型,那么就应该是bool型的,如果是普通单元格,那么会是字符串

第10001个菜鸟 发表于 2023-6-12 17:58:23

Richard.Ma 发表于 2023-6-12 17:03
1,是的,未选中时,有可能是null(初始状态),或者false(设置过false值),这个得你自己判断

2.如果 ...



如上述代码,我在页面上先点击了列头的复选框,让这一整列的复选框都有了一个初始值,这时我再去点击单元格中的复选框触发CellClick事件,此时获取到的Value值是字符串类型的True,而不是布尔类型

Richard.Ma 发表于 2023-6-12 18:25:47

请上传一个demo,我明天帮你看一下

第10001个菜鸟 发表于 2023-6-13 09:56:01

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 = "Tom";
            dataRow = "20";
            dataRow = "男";
            dt.Rows.Add(dataRow);

            dataRow = dt.NewRow();
            dataRow = "Jerry";
            dataRow = "10";
            dataRow = "女";
            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.Cells.CellType = productCboType;

            ButtonCellType buttonCellType = new ButtonCellType();
            buttonCellType.Text = "删除";
            fpSpread1.Sheets.Cells.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.CellType = chkboxcell;

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



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

            MessageBox.Show("cells.Value=" + fpSpread1.Sheets.Cells.Value + "\r\ncells.Value=" + fpSpread1.Sheets.Cells.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.Cells.Value == null ? "" : fpSpread1.Sheets.Cells.Value.ToString());
                }
            }
      }

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

            object value = fpSpread1.ActiveSheet.Cells.Value;
      }


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

第10001个菜鸟 发表于 2023-6-14 08:38:26

Richard.Ma 发表于 2023-6-13 17:56
情况可以重现出来,看来是spread.net普通单元格会对bool值转换为大写的bool字符串以兼容excel(你可以尝试 ...

好的,我了解了,非常感谢您的帮助:handshake

Richard.Ma 发表于 2023-6-14 09:09:34

不客气
页: [1]
查看完整版本: Spread Winform 16.1 ChekcBox使用问题