Вопрос

Я использую wpftoolkit DataGrid отобразить данные; В моем случае использования

  1. Пользователь нажимает на ячейку и вводит значение (я поймаю событие и устанавливаю фокус на TextBox)
  2. Нажимает Enter
  3. Стоимость совершена
  4. Фокус переключается на следующую ячейку

Теперь пользователь не может ввести какое -либо значение в TextBoxDataGridCell), если он не нажимает на камеру. А TextBox может быть частью различных элементов управления (например NumericUpDown, Calendar так далее.).

Такое поведение похоже на Excel, но я не могу сместить фокус на базовый TextBox как различные другие элементы управления пользователем обертки в DataGridCell(что-то типа DataGridCell содержит MatrixCellContainer, который содержит MatrixCell, который содержит UpDown Контроль)

Любой указатель будет действительно полезным.

Обновлять:

Я могу достичь того, что я ищу, обрабатывая DataGridCell_Selected Событие подобного:

private void DataGridCell_Selected(object sender, RoutedEventArgs e)
{
        Microsoft.Windows.Controls.DataGridCell dataGridCell = 
               sender as Microsoft.Windows.Controls.DataGridCell;

    // ToDo: This is a very bad hack; 
    // should be replaced by some proper technique
    if (dataGridCell != null)
    {
        NumericUpDownBase<int>[] IntUpDownControls = 
            dataGridCell.GetChildrenOfType<NumericUpDownBase<int>>();
        if (IntUpDownControls.Count() != 0)
        {
            IntUpDownControls[0].Focus();
            //Keyboard.Focus(IntUpDownControls[0]);
        }
    else
    {
        NumericUpDownBase<double>[] DblUpDownControls = 
                dataGridCell.GetChildrenOfType<NumericUpDownBase<Double>>();
         if (DblUpDownControls.Count() != 0)
         {
                 DblUpDownControls[0].Focus();
                 //Keyboard.Focus(DblUpDownControls[0]);
          }
    }
    }
 }

Но я знаю, что будет лучший способ достичь этого!

Это было полезно?

Решение 2

Наконец я устроился с этим -

private void HandleCellSelected(object sender, RoutedEventArgs e)
{
    DataGridCell dataGridCell = sender as DataGridCell;
    if (dataGridCell != null)
    {
        TextBox[] textboxcontrols = dataGridCell.GetChildrenOfType<TextBox>();
        if (textboxcontrols.Count() != 0)
        {
            textboxcontrols[0].Focus();
        }
    }
}

Все еще ищу лучший подход, хотя ...

Другие советы

Как вы уделяете фокус на следующую ячейку?

У WPF есть две версии фокуса, логический фокус и фокус клавиатуры. Я подозреваю, что вы используете myDataGridCell.Focus(), который только устанавливает логический фокус.

myDataGridCell.Focus();         // Sets Logical Focus
Keyboard.Focus(myDataGridCell); // Sets Keyboard Focus
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top