Question

J'utilise DataGrid de WPFToolKit aux données d'affichage; Dans mon cas d'utilisation

  1. utilisateur clique sur une cellule et entre une valeur (I piège l'événement et régler la mise au point sur la TextBox)
  2. Presses Entrez
  3. La valeur est engagée
  4. Mise au point à la cellule quarts de travail suivant

Maintenant, l'utilisateur ne peut entrer une valeur dans le TextBox (dans le DataGridCell) à moins qu'il clique sur la cellule. Le TextBox peut être une partie de différents contrôles (comme NumericUpDown, Calendar etc.).

Ce comportement est similaire à Excel, mais je ne suis pas en mesure de mettre l'accent sur le TextBox sous-jacent que divers autres contrôles utilisateur wrapper sont là dans le DataGridCell (quelque chose comme DataGridCell contient MatrixCellContainer, qui contient MatrixCell, qui contient UpDown Control)

Tout pointeur sera vraiment utile.

Mise à jour:

Je peux obtenir ce que je suis à la recherche par la gestion des événements de DataGridCell_Selected comme ceci:

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

Mais je sais qu'il y aura une meilleure façon d'y parvenir!

Était-ce utile?

La solution 2

Enfin je me suis installé à ce sujet -

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

Toujours à la recherche d'une meilleure approche mais ...

Autres conseils

Comment vous définissez mise au point à la cellule suivante?

WPF a deux versions de mise au point, Mise au point logique et focus clavier. Je suppose que vous utilisez myDataGridCell.Focus(), qui définit uniquement le focus logique.

myDataGridCell.Focus();         // Sets Logical Focus
Keyboard.Focus(myDataGridCell); // Sets Keyboard Focus
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top