Domanda

Sto usando wpftoolkit DataGrid per visualizzare i dati; Nel mio caso d'uso

  1. L'utente fa clic su una cella ed inserisce un valore (intrappolo l'evento e impostato il focus su TextBox)
  2. Premi INVIO
  3. Il valore è impegnato
  4. Focus si sposta sulla cella successiva

Ora, l'utente non può inserire alcun valore in TextBox(nel DataGridCell) a meno che non scatta sulla cella. Il TextBox può far parte di vari controlli (come NumericUpDown, Calendar eccetera.).

Questo comportamento è simile a Excel ma non sono in grado di spostare l'attenzione sulla sottostante TextBox Poiché vari altri controlli degli utenti wrapper ci sono in DataGridCell(qualcosa di simile a DataGridCell contiene MatrixCellContainer, che contiene MatrixCell, che contiene UpDown Controllo)

Qualsiasi puntatore sarà davvero utile.

Aggiornare:

Posso ottenere ciò che sto cercando maneggiando DataGridCell_Selected Evento come questo:

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

Ma so che ci sarà un modo migliore per raggiungere questo obiettivo!

È stato utile?

Soluzione 2

Finalmente mi sono sistemato con questo -

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

Sto ancora cercando un approccio migliore però ...

Altri suggerimenti

Come stai impostando la messa a fuoco sulla cella successiva?

WPF ha due versioni di messa a fuoco, focus logico e focus della tastiera. Sospetto che tu stia usando myDataGridCell.Focus(), che imposta solo l'obiettivo logico.

myDataGridCell.Focus();         // Sets Logical Focus
Keyboard.Focus(myDataGridCell); // Sets Keyboard Focus
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top