0

DataGridデータを表示するためにWPFToolKit を使用しています。私のユースケースでは

  1. ユーザーがセルをクリックして値を入力します (イベントをトラップし、フォーカスを に設定しますTextBox)
  2. Enter キーを押します
  3. 値がコミットされます
  4. フォーカスが次のセルに移動

これで、セルをクリックしない限り、ユーザーは に値を入力できなくなりTextBoxました。DataGridCellは、TextBoxさまざまなコントロール (など) の一部にすることができます。NumericUpDownCalendar

TextBoxこの動作は Excel に似ていますが、他のさまざまなラッパー ユーザー コントロールが含まれているため、基になるものにフォーカスを移すことができませんDataGridCell( DataGridCellcontains MatrixCellContainer、contains MatrixCell、contains UpDownControl など) 。

どんなポインタでも本当に役に立ちます。

アップデート:

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]);
          }
    }
    }
 }

しかし、これを達成するためのより良い方法があることを私は知っています!

4

2 に答える 2

2

フォーカスを次のセルにどのように設定していますか?

WPFには、論理フォーカスとキーボードフォーカスの2つのバージョンのフォーカスがあります。myDataGridCell.Focus()論理フォーカスのみを設定するを使用していると思われます。

myDataGridCell.Focus();         // Sets Logical Focus
Keyboard.Focus(myDataGridCell); // Sets Keyboard Focus
于 2011-10-20T15:23:08.370 に答える
0

最後に私はこれで落ち着きました -

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();
        }
    }
}

しかし、まだより良いアプローチを探しています...

于 2012-01-19T12:37:31.273 に答える