找回密码
 立即注册

QQ登录

只需一步,快速开始

yazhenshao

注册会员

2

主题

5

帖子

17

积分

注册会员

积分
17
  • 63

    金币

  • 2

    主题

  • 5

    帖子

最新发帖
yazhenshao
注册会员   /  发表于:2023-5-24 20:23  /   查看:1483  /  回复:5
farpoint.win.spread单元格类型设置的是checkbox,点击一下后触发cellclick事件,然后进入编辑状态,然后再次点击时就不触发cellclick事件了。有没有什么方法让其每次点击单元格选择框时都触发?

5 个回复

倒序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-5-25 18:46:23
沙发
没法重现你的问题,checkbox单元格类型并不会进入编辑状态。也是每次都可以触发的。如果你用的是老版本,你可以升级版本测试一下
回复 使用道具 举报
波波虎
注册会员   /  发表于:2023-5-26 22:41:19
板凳
你好,我发表下自己的思路昂,不知道对你有没有用。
这种情况通常是由于checkbox编辑状态与cellclick事件的触发机制所致。在Farpoint.win.spread中,checkbox的编辑状态与双击单元格时的编辑状态是不同的,点击checkbox时虽然也会进入编辑状态,但是并不会触发cellclick事件。

如果想要每次点击checkbox都触发cellclick事件,可以通过重写编辑器的EnterMode方法来实现。具体步骤如下:

1. 继承Farpoint.win.spread.editors.CheckBoxEditor类,重写EnterMode方法。

例如,新增一个名为MyCheckBoxEditor的类,代码如下:

public class MyCheckBoxEditor : Farpoint.Win.Spread.Editors.CheckBoxEditor
{
    public override void EnterMode()
    {
        base.EnterMode();
        this.EditingControl.Click += EditingControl_Click;
    }

    private void EditingControl_Click(object sender, EventArgs e)
    {
        this.EditingControl.Click -= EditingControl_Click;
        this.OnCellClick(new FarPoint.Win.Spread.CellClickEventArgs(this.Row, this.Column));
    }
}

2. 在需要使用的地方,将该编辑器分配给对应的列。

例如,将列0的单元格类型设置为checkbox,并将其编辑器设置为MyCheckBoxEditor,代码如下:
fpSpread1.Sheets[0].Columns[0].CellType = new FarPoint.Win.Spread.CellType.CheckBoxCellType();
fpSpread1.Sheets[0].Columns[0].Editor = new MyCheckBoxEditor();

这样就可以实现每次点击checkbox都触发cellclick事件的效果了。
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-5-29 09:43:31
地板
楼上提供了重写CheckBoxEditor。可以参考看看是否可以解决问题。无法解决的话,建议还是上传demo上来分析具体原因
回复 使用道具 举报
yazhenshao
注册会员   /  发表于:2023-6-13 08:32:07
5#
非常感谢两位的解答,我是要实现一个复选框列,然后点击复选框时选中,再点击则不选中的需求,最后我还是用fpMain_CellClick实现了,以下代码可以满足我的要求。等有空我再试试二楼提供的重写方法,非常感谢
private void fpMain_CellClick(object sender, FarPoint.Win.Spread.CellClickEventArgs e)
        {
            if (e.Column == 0)
            {
                if (!e.ColumnHeader)
                {
                    if (fpMain.Sheets[0].Cells[e.Row, 0].Text == "0")
                    {
                        bool allCheck = true;
                        fpMain.Sheets[0].Cells[e.Row, 0].Text = "1";
                        for (int i = 0; i < fpMain.Sheets[0].RowCount; i++)
                        {
                            if (fpMain.Sheets[0].Cells[i, 0].Text == "0")
                            {
                                allCheck = false;
                                break;
                            }
                        }
                        if (allCheck)
                        {
                            fpMain.Sheets[0].ColumnHeader.Cells[0, 0].Text = "1";
                        }
                    }
                    else
                    {
                        fpMain.Sheets[0].Cells[e.Row, 0].Text = "0";
                    }
                }
            }
        }
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-6-13 09:55:21
6#
好的,问题解决就行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部