【问题标题】:DevExpress Grid, Bool rows change not reflect immediatlyDevExpress Grid,Bool 行更改不会立即反映
【发布时间】:2016-04-27 17:36:02
【问题描述】:

我有一个 DX 网格视图,它有 2 个布尔列。我的目的是当我检查第 1 列中的第 2 行时,第 2 列必须立即更改,但不是。单击另一行后它会更改。这是我的 rowcellvaluechanged 事件代码:

 void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
    {
        //button1.PerformClick();
        if (e.Column.Name == "col1")
        {
             var x = gridView1.GetRowCellValue(e.RowHandler, col1);
            gridView1.SetRowCellValue(e.RowHandler, col2, x);
        }

    }

我在 DX 网站上找过,没有解决办法。我该如何处理?

【问题讨论】:

    标签: c# winforms datagridview devexpress


    【解决方案1】:

    当您切换到另一个单元格时,网格会发布一个编辑器值。要强制它,请调用PostEditor 方法。但是,在这种情况下,您将需要使用活动编辑器的 EditValueChanged 事件。要获取它,请使用 ActiveEditor 属性。要捕捉创建编辑器的瞬间,请使用ShownEditor 事件。

    gridView1.ShownEditor += gridView1_ShownEditor;
    
    private void gridView1_ShownEditor(object sender, EventArgs e) {
        GridView view = (GridView)sender;
        view.ActiveEditor.EditValueChanged += editor_EditValueChanged;
    }
    
    private void editor_EditValueChanged(object sender, EventArgs e) {
        if (!gridView1.FocusedColumn.Name == "col1")
            return;
        gridView1.PostEditor();
        var x = gridView1.GetRowCellValue(e.RowHandler, col1);
        gridView1.SetRowCellValue(e.RowHandler, col2, x);
    }
    

    【讨论】:

    • 一个小修正:您需要使用 GridView.HiddenEditor 事件取消订阅 editor_EditValueChanged 事件处理程序
    【解决方案2】:

    您可以使用GridView.PostEditor 方法立即将更改后的值从编辑器传递到网格的底层数据源。这样做的最佳地点是真实单元格编辑器的EditValueChanged 事件。您可以按如下方式处理此事件:

    gridView1.PopulateColumns();
    var checkEdit = gridView1.Columns["Value1"].RealColumnEdit as RepositoryItemCheckEdit;
    checkEdit.EditValueChanged += checkEdit_EditValueChanged;
    //...
    void checkEdit_EditValueChanged(object sender, EventArgs e) {
        gridView1.PostEditor();
    }
    

    然后你就可以实现所有需要的依赖了:

    gridView1.CellValueChanged += gridView1_CellValueChanged;
    //...
    void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e) {
        if(e.Column.FieldName == "Value1") 
            gridView1.SetRowCellValue(e.RowHandle, gridView1.Columns["Value2"], e.Value);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-12
      相关资源
      最近更新 更多