我有“产品”文本框,其中用户键入产品名称。当用户按下回车键时,此“产品”将添加到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控件开发了这个应用程序。
答案 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
事件。