question Mise au point avec WPF DataGrid
-
27-10-2019 - |
Question
J'utilise DataGrid
de WPFToolKit aux données d'affichage; Dans mon cas d'utilisation
- 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
) - Presses Entrez
- La valeur est engagée
- 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!
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