2010-08-06 11 views
11

Estoy usando WPF toolkit proporcionado control DataGrid para mostrar la lista de productos junto con su OpenStock, descripción etc. En este DataGrid he establecido la columna OpenStock como editable y el resto no editable . Lo que quiero ahora cuando se carga mi ventana, quiero establecer el foco del teclado en la primera celda de la columna OpenStock y, si es posible, en el modo de edición. Busqué esto durante 2 días y finalmente lo publico aquí.cómo establecer el foco en una celda particular de la cuadrícula de datos WPF toolkit

cualquier ayuda o código de muestra sería útil.

<my:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}" Margin="2,2,2,55" 
x:Name="dataGrid1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="White"  
AlternatingRowBackground="AliceBlue" AlternationCount="2" SelectionMode="Single" 
SelectionUnit="Cell" BorderThickness="0" IsTabStop="True"> 
     <my:DataGrid.Resources> 
      <Style x:Key="errorStyle" TargetType="{x:Type TextBox}"> 
       <Setter Property="Padding" Value="-2"/> 
       <Style.Triggers> 
        <Trigger Property="Validation.HasError" Value="True"> 
         <Setter Property="Background" Value="Yellow"/> 
         <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, 
           Path=(Validation.Errors)[0].ErrorContent}"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </my:DataGrid.Resources> 
     <my:DataGrid.Columns> 
      <my:DataGridTextColumn Width="60" FocusManager.IsFocusScope="False" Binding="{Binding Path=pCode}" Header="Code" IsReadOnly="True" /> 
      <my:DataGridTextColumn Width="150" Binding="{Binding pName}" Header="Description" IsReadOnly="True" /> 
      <my:DataGridTextColumn Width="120" Binding="{Binding CloseStock}" Header="Closing Stock" IsReadOnly="True" /> 
      <my:DataGridTextColumn Width="100" Binding="{Binding OpenStock, ValidatesOnExceptions=True}" Header="Open Stock" 
            EditingElementStyle="{StaticResource errorStyle}"/> 
      <my:DataGridTextColumn Width="150" Binding="{Binding YrlyOpenStock}" Header="Yearly Opening" IsReadOnly="True" /> 

     </my:DataGrid.Columns> 
    </my:DataGrid>  

muchas gracias ........

Respuesta

35

Es necesario configurar la celda actual a la que desea llamar y luego editada BeginEdit en el controlador cargado:

dataGrid1.CurrentCell = new DataGridCellInfo(
    dataGrid1.Items[0], dataGrid1.Columns[3]); 
dataGrid1.BeginEdit(); 

Si asigna un nombre a su DataGridTextColumn en XAML, puede usar ese nombre en lugar de Columns[3].

+2

Great answer. Tuve que centrarme en dataGrid "dataGrid1.Focus();" primero, pero luego funcionó. – jbe

+0

Tenga en cuenta que el orden de las columnas en la colección 'dataGrid1.Columns' no es necesariamente el orden que se muestra en la pantalla, consulte la nota en https://msdn.microsoft.com/en-us/library/system.windows.controls. datagrid.columns (v = vs.110) .aspx #. Si necesita indexar por orden de visualización, simplemente almacene 'dataGrid1.Columns.OrderBy (c => c.DisplayIndex) .ToArray()' en una variable local, e indexe en esa matriz en su lugar. – Gooseberry

6

Usa este código para mover vista de desplazamiento para celular específico

dgv.ScrollIntoView (dgv.Items [fila], dgv.Columns [col]);

0

Utilice la función siguiente, funcionará.

private void SetFocusOnGrid(DataGrid grid, int index) 
{ 
    grid.ScrollIntoView(grid.Items.GetItemAt(index)); 
    grid.SelectionMode = DataGridSelectionMode.Single; 
    grid.SelectionUnit = DataGridSelectionUnit.FullRow; 
    grid.SelectedIndex = index; 

    DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); 
    row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 
} 
Cuestiones relacionadas