1

我正在使用 DevExpress XPF将数据插入我的数据库GridControlNewItemRow

当我在最后一个单元格中按 Enter 键时,它会输入数据并返回到网格的第一行。

我想要它做的是返回到,NewItemRow这样用户就可以开始插入新记录而无需重新选择NewItemRow行。

从 NewItemRow 插入行后,如何将焦点设置到 NewItemRow?

ps:我问的是这里而不是 DevExpress 论坛,因为这里的响应要快得多:)

编辑:

这是我尝试过的一些代码,但结果完全相同:

void MVVMFriendlyDxgTableView_RowUpdated(object sender, DevExpress.Xpf.Grid.RowEventArgs e)
{
  if (RowUpdatedCommand != null)
  {
    if (e.Row != null)
    {
      if (RowUpdatedCommand.CanExecute(e.Row))
      {
        RowUpdatedCommand.Execute(e.Row);
        if (e.RowHandle == GridControl.NewItemRowHandle)
        {
            Dispatcher.BeginInvoke(new Action(() =>
            {
                SelectRow(GridControl.NewItemRowHandle);
            }));
            e.Handled = true;
        }
      }
    }
  }
}
4

2 回答 2

3

事实证明,我遇到的问题是由于更新数据绑定 ObservableCollection 导致刷新网格并选择了不同的行。DJKRAZE 发布的第二个代码本来可以工作,但我对数据库的调用是异步的,因此在 RowUpdated 事件完成之前没有发生。为了解决这个问题,我重写了 OnDataChanged 方法以在数据更新后选择 NewItemRow。

这是有效的结果代码。

protected override void OnDataChanged(bool rebuildVisibleColumns)
{
    base.OnDataChanged(rebuildVisibleColumns);
    Dispatcher.BeginInvoke(new Action(() =>
    {
        this.FocusedRowHandle = GridControl.NewItemRowHandle;
    }), null);
}

谢谢您的帮助。

于 2013-01-03T23:39:35.733 回答
2

您可以简单地将网格视图的 FoucusedRow 属性设置为从 RowEventArgs 获得的新行对象实例:

private void MVVMFriendlyDxgTableView_RowUpdated(object sender, DevExpress.Xpf.Grid.RowEventArgs e) 
{
    if (e.RowHandle == GridControl.NewItemRowHandle)
    {
        Dispatcher.BeginInvoke(new Action(() => { viewSource.View.MoveCurrentToLast(); }));
        Dispatcher.BeginInvoke(new Action(() => { gridView.FocusedRow = e.Row; }));
        e.Handled = true;
    }
}

如果出现闪烁,你可以试试这个

   if (e.RowHandle == GridControl.NewItemRowHandle)
    Dispatcher.BeginInvoke(new Action(() =>
    {
        MVVMFriendlyDxgTableView.FocusedRowHandle = GridControl.NewItemRowHandle;
    }), null);

排序和 ObservableCollection 看这个例子 排序一个集合 / ObservableCollection

于 2013-01-03T22:37:28.047 回答