Wpf - 如何在特定单元格编辑结束后以编程方式对行编辑结束

时间:2016-04-20 11:57:00

标签: c# wpf gridview mvvm telerik-grid

我有“产品”文本框,其中用户键入产品名称。当用户按下回车键时,此“产品”将添加到GridView并自动对焦到“数量”单元格。 (我已经成功开发了这部分。)

用户在GridView的Cell中键入Quantity后,我想将CommitEdit指向此行并将焦点返回到“Product”文本框。这是我不知道该怎么做的部分。

目前我尝试过以下内容:

private void RadGridViewInvoiceItems_CellEditEnded( object sender, GridViewCellEditEndedEventArgs e )
{
      if ( e.Cell.Column.Header.ToString() == "Quantity" )
      {
           this.gridView.CommitEdit();
           this.productTextBox.Focus();
      }         
}

但上面的代码导致“StackOverFlow”异常。我该如何解决这个问题?

P.S。我用C#Wpf和MVVM模式以及Telerik控件开发了这个应用程序。

2 个答案:

答案 0 :(得分:1)

您可以使用DataGrid.CellEditEnding处理程序中的DataGrid.CommitEdit,确保处理重入。

这是一篇描述该技术的博客文章:

答案 1 :(得分:0)

StackOverflow 由无限递归引起的异常。当您在CommitEdit()事件处理程序中调用DataGrid的CellEditEnding时,它将再次触发CellEditEnding事件,在此您再次调用CommitEdit(),在这里……

尝试使用以下类似内容:

private bool isProcessingRow;
private void DataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    if (!isProcessingRow && sender is DataGrid grid)
    {
        isProcessingRow = true;
        switch (e.EditAction)
        {
            case DataGridEditAction.Commit: grid.CommitEdit(DataGridEditingUnit.Row, true); break;
            case DataGridEditAction.Cancel: grid.CancelEdit(DataGridEditingUnit.Row); break;
        }
        isProcessingRow = false;
    }
}

然后将此处理程序订阅CellEditEnding事件。