找回密码
 立即注册

QQ登录

只需一步,快速开始

沐华丶

注册会员

5

主题

29

帖子

80

积分

注册会员

积分
80
沐华丶
注册会员   /  发表于:2023-3-22 10:22  /   查看:3177  /  回复:14
1金币
image.png920239257.png
我要实现反选的功能。单击列头,选中所有行;选中所有行的情况下,自动勾选列头;若某行被勾选,则不勾选列头或取消勾选列头;
private void FpUserRoleManageCellClick(object sender, CellClickEventArgs e)
        {
            if (e.ColumnHeader && e.Column == 0)
            {
                bool chk = false;
                if (this.fpUserRoleManage_Sheet1.ColumnHeader.Cells[0, 0].Value != null)
                {
                    bool.TryParse(this.fpUserRoleManage_Sheet1.ColumnHeader.Cells[0, 0].Value.ToString(), out chk);
                }
                this.fpUserRoleManage_Sheet1.ColumnHeader.Cells[0, 0].Value = !chk;
                for (int i = 0; i < fpUserRoleManage_Sheet1.RowCount; i++)
                {
                    if (this.fpUserRoleManage_Sheet1.Cells[i, 1].Value == null)
                    {
                        break;
                    }
                    this.fpUserRoleManage_Sheet1.Cells[i, 0].Value = !chk;
                }
            }
            else if (e.Column == 0)
            {

                bool rowChecked = Convert.ToBoolean(fpUserRoleManage.ActiveSheet.Cells[e.Row, 0].Value);
                fpUserRoleManage.ActiveSheet.Cells[e.Row, 0].Value = !rowChecked;

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

最佳答案

查看完整内容

本人已解决

14 个回复

倒序浏览
最佳答案
最佳答案
沐华丶
注册会员   /  发表于:2023-3-22 10:22:52
来自 14#
本人已解决
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-3-22 17:39:11
2#
请直接上传一个重现问题的demo,我帮你看看原因
回复 使用道具 举报
沐华丶
注册会员   /  发表于:2023-3-22 17:39:18
3#
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[i, 0].Value == null)
                    {
                        break;
                    }
                    if (Convert.ToBoolean(this.fpUserRoleManage_Sheet1.Cells[i, 0].Value))
                    {
                        checkedRowCount++;
                    }
                    else
                    {
                        allRowsChecked = false;
                    }
                }               
                // 更新列头复选框的状态
                this.fpUserRoleManage_Sheet1.ColumnHeader.Cells[0, 0].Value = checkedRowCount == fpUserRoleManage_Sheet1.RowCount;
               
            }
我又调整了一下我代码,当最后一行选中时,列头并未自动更新,需要单击一下其他行的列头,才会将ColumnHeader[0]勾上;需要再取消勾选一行,才会将ColumnHeader[0]的勾选去掉
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-3-22 17:53:43
4#
请上传一个能说明问题的demo,我帮你看看原因,直接看代码的话不好重现问题判断原因
回复 使用道具 举报
沐华丶
注册会员   /  发表于:2023-3-22 18:07:43
5#
我上传了一个视频。另外

private void InitFp()
        {
            Hsp.Core.NetFrame.UI.Utils.FpUtils.FarPointStyle(this.fpUserRoleManage);
            this.fpUserRoleManage_Sheet1.ColumnHeader.Rows[0].Height = 30F;
            this.fpUserRoleManage_Sheet1.Rows.Default.Height = 25;
            this.fpUserRoleManage_Sheet1.Rows.Default.VerticalAlignment = CellVerticalAlignment.Center;
            this.fpUserRoleManage_Sheet1.ColumnHeader.Rows[0].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[0, 0].CellType = new FarPoint.Win.Spread.CellType.CheckBoxCellType();
            this.fpUserRoleManage_Sheet1.Columns[1].BackColor = Color.AliceBlue;
            this.fpUserRoleManage_Sheet1.Columns[2].BackColor = Color.AliceBlue;
            this.fpUserRoleManage_Sheet1.Columns[3].BackColor = Color.AliceBlue;
            this.fpUserRoleManage_Sheet1.Columns[4].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[0, 0].Value != null)
                {
                    bool.TryParse(this.fpUserRoleManage_Sheet1.ColumnHeader.Cells[0, 0].Value.ToString(), out chk);
                }
                this.fpUserRoleManage_Sheet1.ColumnHeader.Cells[0, 0].Value = !chk;
                for (int i = 0; i < fpUserRoleManage_Sheet1.RowCount; i++)
                {
                    if (this.fpUserRoleManage_Sheet1.Cells[i, 1].Value == null)
                    {
                        break;
                    }
                    this.fpUserRoleManage_Sheet1.Cells[i, 0].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[i, 0].Value == null)
                    {
                        break;
                    }
                    if (Convert.ToBoolean(this.fpUserRoleManage_Sheet1.Cells[i, 0].Value))
                    {                        
                        checkedRowCount++;
                    }
                    else
                    {
                        allRowsChecked = false;
                    }
                }               
                // 更新列头复选框的状态
                this.fpUserRoleManage_Sheet1.ColumnHeader.Cells[0, 0].Value = checkedRowCount == fpUserRoleManage_Sheet1.RowCount;
               
            }

}
这是我事件的Demo。

问题.rar

4.16 MB, 下载次数: 107

回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-3-22 18:26:42
6#
你可以自己先调试看看,选中最后一个复选框,以及取消选中时checkedRowCount是怎么变化的。
回复 使用道具 举报
沐华丶
注册会员   /  发表于:2023-3-23 09:18:11
7#
Richard.Ma 发表于 2023-3-22 18:26
你可以自己先调试看看,选中最后一个复选框,以及取消选中时checkedRowCount是怎么变化的。

我点击最后一个复选框,进入到调试,checkedRowCount为3,最后一行的value也为false
回复 使用道具 举报
沐华丶
注册会员   /  发表于:2023-3-23 09:29:17
8#
Richard.Ma 发表于 2023-3-22 18:26
你可以自己先调试看看,选中最后一个复选框,以及取消选中时checkedRowCount是怎么变化的。

CheckBox的状态怎么才能做到实时提交呢
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-3-23 14:34:39
9#
我看到你这个是写在CellClick 事件中的,那么肯定是要比CheckBox状态变更早的。
你要判断值变化的话,可以尝试用cellchange事件看看
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部