找回密码
 立即注册

QQ登录

只需一步,快速开始

下午三点的人

注册会员

16

主题

47

帖子

131

积分

注册会员

积分
131

[处理中] wijmo的flexgrid

下午三点的人
注册会员   /  发表于:2022-7-4 11:10  /   查看:1691  /  回复:3
1金币
使用了selector之后,怎样在点击的时候选中的是选中一行的效果,而不是选中某一个单元格,求一个解决方案!!!!我试过操作dom,但是表格列很长的话,后面的列是没加载出来的,拖动滚动条,后面渲染出来的单元格就不会被选中。。也试过绑定一列来设置多选框,但是有分组的时候,deferUpdate有问题。选中分组的那个单元格,选中之后,选中的效果又立马消失。
import "@grapecity/wijmo.styles/wijmo.css";
import "bootstrap.css";
import "./app.css";
//
import * as React from 'react';
import * as ReactDOM from 'react-dom';
//
import * as wjcCore from "@grapecity/wijmo";
import * as wjcGrid from "@grapecity/wijmo.react.grid";
import { GroupRow } from "@grapecity/wijmo.grid"
import { getData } from "./data";
class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            // data: getData(100),
            data: new wjcCore.CollectionView(getData(100), {
                // sortDescriptions: ["country", "product"],
                groupDescriptions: ["title","Priority"]
            })
        };
    }
    render() {
        return <div className="container-fluid">
            <wjcGrid.FlexGrid deferResizing={true} alternatingRowStep={0} headersVisibility="Column" selectionMode="Cell" itemsSource={this.state.data} initialized={this.initializeGrid.bind(this)}>

            </wjcGrid.FlexGrid>
        </div>;
    }
    initializeGrid(flex) {
        flex.formatItem.addHandler((s, e) => {
            console.log(s, e)
            if (e.panel == s.columnHeaders) {
                if (s.columns[e.col].binding == 'sel') {
                    e.cell.innerHTML = '<input class="select-all" tabindex="-1" type="checkbox">';
                    this._updateSelectAllBox(s);
                }
            }
            else if (s.rows[e.row] instanceof GroupRow) {
                e.cell.innerHTML = '<input class="select-group" tabindex="-1" type="checkbox">' + e.cell.innerHTML;
                this.groupAllSelectBox(s);
            }
            else if (e.panel == s.cells) {
                wjcCore.setAttribute(e.cell.parentElement, 'aria-selected', s.rows[e.row].dataItem.sel);
            }
        });
        // initialize column widths
        flex.autoSizeColumns(null, null, null, 18);
        // select/de-select all items when user clicks the check box on the header
        flex.hostElement.addEventListener('click', (e) => {
            if (wjcCore.hasClass(e.target, 'select-all') &&
                e.target instanceof HTMLInputElement) {
                flex.deferUpdate(() => {
                    flex.collectionView.items.forEach((item) => {
                        item.sel = (e.target).checked;
                    });
                });
            }
            if (wjcCore.hasClass(e.target, 'select-group') &&
                e.target instanceof HTMLInputElement) {
                // flex.deferUpdate(() => {
                //     flex.collectionView.groups[0].items.forEach((item) => {
                //         item.sel = (e.target).checked;
                //     });
                // });
            }
        });
    }
    _updateSelectAllBox(grid) {
        let cb = grid.hostElement.querySelector('.select-all');
        if (cb instanceof HTMLInputElement) {
            let items = grid.collectionView.items, last = null, indeterminate = false;
            for (let i = 0; i < items.length; i++) {
                if (last != null && items.sel != last) {
                    indeterminate = true;
                    break;
                }
                last = items.sel;
            }
            cb.checked = last;
            if (indeterminate) {
                cb.indeterminate = true;
            }
        }
    }

    groupAllSelectBox(grid){
        let cb = grid.hostElement.querySelector('.select-group');
        console.log(111,cb)
        if (cb instanceof HTMLInputElement) {
            let items = grid.collectionView.groups[0].items, last = null, indeterminate = false;
            console.log(222,items)
            for (let i = 0; i < items.length; i++) {
                if (last != null && items.sel != last) {
                    indeterminate = true;
                    break;
                }
                last = items.sel;
            }
            cb.checked = last;
            if (indeterminate) {
                cb.indeterminate = true;
            }
        }
    }
}
ReactDOM.render(<App />, document.getElementById('app'));



3 个回复

倒序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-7-4 12:09:14
沙发
你如果是需要按行选中的话设置selectionMode=3即可,selectionMode没办法和selector共存,这个目前没有什么解决办法
回复 使用道具 举报
下午三点的人
注册会员   /  发表于:2022-7-4 13:38:07
板凳
Richard.Ma 发表于 2022-7-4 12:09
你如果是需要按行选中的话设置selectionMode=3即可,selectionMode没办法和selector共存,这个目前没有什么 ...

那设置多选框为一列,使用deferUpadate,分组行的多选框被勾选之后又被刷新了,有的解决办法嘛
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-7-4 17:45:45
地板
我没理解你说的意思,能否详细说明一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部