问题 如何使用带有ag-grid的布尔数据的复选框


我现在已经搜索了一段时间,但没有看到任何真实的例子。

我正在使用ag-grid-react,我想要一个包含布尔值的列来表示带有复选框的布尔值,并在更改时更新rowData中的对象。

我知道有checkboxSelection,我试着像我下面的那样使用它,但是虽然它是一个复选框,它没有链接到数据,只是用于选择单元格。

var columnDefs = [
        { headerName: 'Refunded', field: 'refunded', checkboxSelection: true,}
  ]

那么有没有办法用ag-grid和ag-grid-react做我正在寻找的东西?


10760
2018-01-17 20:57


起源

你试过用colId吗? - Jeb50


答案:


您应该使用cellRenderer属性

const columnDefs = [{ headerName: 'Refunded', 
    field: 'refunded', 
    editable:true,
    cellRenderer: params => {
        return `<input type='checkbox' ${params.value ? 'checked' : ''} />`;
    }
}];

我遇到了同样的问题,这是我能想到的最好的但是我无法将值绑定到此复选框。

我将cell属性editable设置为true,现在如果要更改实际值,则必须双击单元格并键入true或false。

但这就是我去了,我决定帮助你,我知道它不是100%解决所有问题,但至少它解决了数据显示部分。

如果你发现了如何请与我们分享你的答案。


11
2018-02-27 17:39



谢谢,抱歉迟到的回复。你可以看到我的答案。这不是我想要的,但它足以满足我的需要。 - Brett


以下代码有助于解决此问题。缺点是gridOptions中的正常事件不会被触发(onCellEditingStarted,onCellEditingStopped,onCellValueChanged等)。

var columnDefs = [...
           {headerName: "Label", field: "field",editable: true,
                cellRenderer: 'booleanCellRenderer',
                cellEditor:'booleanEditor'

            }
        ];
//register the components
$scope.gridOptions = {...
                components:{
                    booleanCellRenderer:BooleanCellRenderer,
                    booleanEditor:BooleanEditor
                }
            }; 

  function BooleanCellRenderer() {
  }

  BooleanCellRenderer.prototype.init = function (params) {
      this.eGui = document.createElement('span');
      if (params.value !== "" || params.value !== undefined || params.value !== null) {
          var checkedStatus = params.value ? "checked":"";
          var input = document.createElement('input');
          input.type="checkbox";
          input.checked=params.value;
          input.addEventListener('click', function (event) {
              params.value=!params.value;
              //checked input value has changed, perform your update here
              console.log("addEventListener params.value: "+ params.value);
          });
          this.eGui.innerHTML = '';
          this.eGui.appendChild( input );
      }
  };

  BooleanCellRenderer.prototype.getGui = function () {
      return this.eGui;
  };

  function BooleanEditor() {
  }

  BooleanEditor.prototype.init = function (params) {
      this.container = document.createElement('div');
      this.value=params.value;
      params.stopEditing();
  };
  BooleanEditor.prototype.getGui = function () {
      return this.container;
  };

  BooleanEditor.prototype.afterGuiAttached = function () {
  };

  BooleanEditor.prototype.getValue = function () {
      return this.value;
  };

  BooleanEditor.prototype.destroy = function () {
  };

  BooleanEditor.prototype.isPopup = function () {
      return true;
  };

6
2018-02-21 21:32



我现在正在使用你的解决方案@Will。我想知道如何用booleaneditor数据获取所有数据。我必须在更新网格时获取所有更新的数据 - Kle
@Kle你应该能够在点击事件中得到你想要的东西 input.addEventListener('click', function (event) - Will
亲切地参考@Willy给出的解决方案 - Co. Aden
要以通用方式更改rowData中单击列的值,可以在注释后使用以下内容 //checked input value has changed...: params.data[params.colDef.field] = params.value; - Ken Burcham
如果您还需要F2或Enter来编辑单元格,请更新方法 BooleanEditor.prototype.init 同params.node.setDataValue(params.column, !params.value);,params.stopEditing();,params.api.refreshCells(); - Ondras


那这个呢?它是在Angular而不是在React上,但你可以得到这一点:

        { headerName: 'Enabled', field: 'enabled', cellRendererFramework: CheckboxCellComponent },

这是checkboxCellComponent:

@Component({
selector: 'checkbox-cell',
template: `<input type="checkbox" [checked]="params.value" (change)="onChange($event)">`,
styleUrls: ['./checkbox-cell.component.css']
}) 
export class CheckboxCellComponent implements AfterViewInit, 
ICellRendererAngularComp {

@ViewChild('.checkbox') checkbox: ElementRef;

public params: ICellRendererParams;

constructor() { }

agInit(params: ICellRendererParams): void {
  this.params = params;
}

public onChange(event) {
  this.params.data[this.params.colDef.field] = event.currentTarget.checked;
  }
}

让我知道


1
2017-10-24 13:45





在columnDefs中,添加一个复选框列。不需要将cell属性设置为true

columnDefs: [ { headerName: '', field: 'checkbox', cellRendererFramework: CheckboxRenderer, width:30}, ...]

CheckboxRenderer

export class CheckboxRenderer extends React.Component{
    constructor(props) {
        super(props);
        this.state={
            value:props.value
        };
        this.handleCheckboxChange=this.handleCheckboxChange.bind(this);
    }

    handleCheckboxChange(event) {
        this.props.data.checkbox=!this.props.data.checkbox;
        this.setState({value: this.props.data.checkbox});
    }

    render() {
        return (    
        <Checkbox
            checked={this.state.value}
            onChange={this.handleCheckboxChange}></Checkbox>);
    }
}

0
2018-04-21 12:54





字符串值的数组对我不起作用,但是[true,false]的数组正在工作。

{
    headerName: 'Refunded',
    field: 'refunded',
    cellEditor: 'popupSelect',
    cellEditorParams: {
        cellRenderer: RefundedCellRenderer,
        values: [true, false]
    }
},

function RefundedCellRenderer(params) {
    return params.value;
}

0
2018-03-10 01:35





所以最后我有点得到我想要的东西,但是以稍微不同的方式,我使用popupSelect和cellEditorParams的值:['true','false']。当然,我没有像我想要的那样的实际复选框,但它的行为足以满足我的需要

{
    headerName: 'Refunded', 
    field: 'refunded',
    cellEditor: 'popupSelect',
    cellEditorParams: {
        cellRenderer: RefundedCellRenderer,
        values: ['true', 'false']
    }
},

function RefundedCellRenderer(params) {
    return params.value;
}

-3



这并没有解决问题。 - instantaphex