沐华丶 发表于 2023-3-22 10:22:51

单元格设置成CheckBox,点击两次才能选上


我要实现反选的功能。单击列头,选中所有行;选中所有行的情况下,自动勾选列头;若某行被勾选,则不勾选列头或取消勾选列头;
private void FpUserRoleManageCellClick(object sender, CellClickEventArgs e)
      {
            if (e.ColumnHeader && e.Column == 0)
            {
                bool chk = false;
                if (this.fpUserRoleManage_Sheet1.ColumnHeader.Cells.Value != null)
                {
                  bool.TryParse(this.fpUserRoleManage_Sheet1.ColumnHeader.Cells.Value.ToString(), out chk);
                }
                this.fpUserRoleManage_Sheet1.ColumnHeader.Cells.Value = !chk;
                for (int i = 0; i < fpUserRoleManage_Sheet1.RowCount; i++)
                {
                  if (this.fpUserRoleManage_Sheet1.Cells.Value == null)
                  {
                        break;
                  }
                  this.fpUserRoleManage_Sheet1.Cells.Value = !chk;
                }
            }
            else if (e.Column == 0)
            {

                bool rowChecked = Convert.ToBoolean(fpUserRoleManage.ActiveSheet.Cells.Value);
                fpUserRoleManage.ActiveSheet.Cells.Value = !rowChecked;

                bool allChecked = true;
                for (int i = 0; i < fpUserRoleManage_Sheet1.RowCount; i++)
                {
                  bool isChecked = Convert.ToBoolean(fpUserRoleManage.ActiveSheet.Cells.Value);
                  if (!isChecked)
                  {
                        allChecked = false;
                        break;
                  }
                }
                fpUserRoleManage.ActiveSheet.ColumnHeader.Cells.Value = allChecked;
            }
我的代码是这个,反向选选择的时候,需要点两次才能勾选上。这是farpointSpread内部逻辑的问题吗

沐华丶 发表于 2023-3-22 10:22:52

本人已解决:)

Richard.Ma 发表于 2023-3-22 17:39:11

请直接上传一个重现问题的demo,我帮你看看原因

沐华丶 发表于 2023-3-22 17:39:18

else if (!e.ColumnHeader && e.Column == 0)
            {
                        
                bool allRowsChecked = true;
                int checkedRowCount = 0; // 记录已勾选的行数
                for (int i = 0; i < fpUserRoleManage_Sheet1.RowCount; i++)
                {
                  if (this.fpUserRoleManage_Sheet1.Cells.Value == null)
                  {
                        break;
                  }
                  if (Convert.ToBoolean(this.fpUserRoleManage_Sheet1.Cells.Value))
                  {
                        checkedRowCount++;
                  }
                  else
                  {
                        allRowsChecked = false;
                  }
                }               
                // 更新列头复选框的状态
                this.fpUserRoleManage_Sheet1.ColumnHeader.Cells.Value = checkedRowCount == fpUserRoleManage_Sheet1.RowCount;
               
            }
我又调整了一下我代码,当最后一行选中时,列头并未自动更新,需要单击一下其他行的列头,才会将ColumnHeader勾上;需要再取消勾选一行,才会将ColumnHeader的勾选去掉

Richard.Ma 发表于 2023-3-22 17:53:43

请上传一个能说明问题的demo,我帮你看看原因,直接看代码的话不好重现问题判断原因

沐华丶 发表于 2023-3-22 18:07:43

我上传了一个视频。另外

private void InitFp()
      {
            Hsp.Core.NetFrame.UI.Utils.FpUtils.FarPointStyle(this.fpUserRoleManage);
            this.fpUserRoleManage_Sheet1.ColumnHeader.Rows.Height = 30F;
            this.fpUserRoleManage_Sheet1.Rows.Default.Height = 25;
            this.fpUserRoleManage_Sheet1.Rows.Default.VerticalAlignment = CellVerticalAlignment.Center;
            this.fpUserRoleManage_Sheet1.ColumnHeader.Rows.Font = new Font("微软雅黑", 13.5F, FontStyle.Bold);
            this.fpUserRoleManage_Sheet1.OperationMode = OperationMode.Normal;
            this.fpUserRoleManage_Sheet1.ColumnHeader.Rows.Get(0).Height = 40F;
            this.fpUserRoleManage_Sheet1.ColumnHeader.Cells.CellType = new FarPoint.Win.Spread.CellType.CheckBoxCellType();
            this.fpUserRoleManage_Sheet1.Columns.BackColor = Color.AliceBlue;
            this.fpUserRoleManage_Sheet1.Columns.BackColor = Color.AliceBlue;
            this.fpUserRoleManage_Sheet1.Columns.BackColor = Color.AliceBlue;
            this.fpUserRoleManage_Sheet1.Columns.BackColor = Color.AliceBlue;
      }

private void InitEvent()
      {            fpUserRoleManage.CellClick += FpUserRoleManageCellClick;
            
      }




private void FpUserRoleManageCellClick(object sender, CellClickEventArgs e)
      {
            if (e.ColumnHeader && e.Column == 0)
            {
                bool chk = false;
                if (this.fpUserRoleManage_Sheet1.ColumnHeader.Cells.Value != null)
                {
                  bool.TryParse(this.fpUserRoleManage_Sheet1.ColumnHeader.Cells.Value.ToString(), out chk);
                }
                this.fpUserRoleManage_Sheet1.ColumnHeader.Cells.Value = !chk;
                for (int i = 0; i < fpUserRoleManage_Sheet1.RowCount; i++)
                {
                  if (this.fpUserRoleManage_Sheet1.Cells.Value == null)
                  {
                        break;
                  }
                  this.fpUserRoleManage_Sheet1.Cells.Value = !chk;
                }
            }
            else if (!e.ColumnHeader && e.Column == 0)
            {               
                bool allRowsChecked = true;
                int checkedRowCount = 0; // 记录已勾选的行数
                for (int i = 0; i < fpUserRoleManage_Sheet1.RowCount; i++)
                {
                  if (this.fpUserRoleManage_Sheet1.Cells.Value == null)
                  {
                        break;
                  }
                  if (Convert.ToBoolean(this.fpUserRoleManage_Sheet1.Cells.Value))
                  {                        
                        checkedRowCount++;
                  }
                  else
                  {
                        allRowsChecked = false;
                  }
                }               
                // 更新列头复选框的状态
                this.fpUserRoleManage_Sheet1.ColumnHeader.Cells.Value = checkedRowCount == fpUserRoleManage_Sheet1.RowCount;
               
            }

}
这是我事件的Demo。

Richard.Ma 发表于 2023-3-22 18:26:42

你可以自己先调试看看,选中最后一个复选框,以及取消选中时checkedRowCount是怎么变化的。

沐华丶 发表于 2023-3-23 09:18:11

Richard.Ma 发表于 2023-3-22 18:26
你可以自己先调试看看,选中最后一个复选框,以及取消选中时checkedRowCount是怎么变化的。

我点击最后一个复选框,进入到调试,checkedRowCount为3,最后一行的value也为false

沐华丶 发表于 2023-3-23 09:29:17

Richard.Ma 发表于 2023-3-22 18:26
你可以自己先调试看看,选中最后一个复选框,以及取消选中时checkedRowCount是怎么变化的。

CheckBox的状态怎么才能做到实时提交呢

Richard.Ma 发表于 2023-3-23 14:34:39

我看到你这个是写在CellClick 事件中的,那么肯定是要比CheckBox状态变更早的。
你要判断值变化的话,可以尝试用cellchange事件看看
页: [1] 2
查看完整版本: 单元格设置成CheckBox,点击两次才能选上