как установить фокус на определенную ячейку набора инструментов WPF datagrid

Я использую набор инструментов WPF, предоставляющий элемент управления DataGrid, для отображения списка продуктов вместе с его OpenStock, описанием и т. Д. В этом DataGrid я установил столбец OpenStock для редактирования, а остальные не редактируются. Что я хочу сейчас, когда мои эти окна загружаются, я хочу установить фокус клавиатуры на первую ячейку столбца OpenStock и, если возможно, в режиме редактирования. Я искал это в течение 2 дней и, наконец, разместил здесь.

любая помощь или образец кода будут полезны.

<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>       

большое спасибо........


person Raj    schedule 06.08.2010    source источник


Ответы (5)


Вам нужно установить текущую ячейку на ту, которую вы хотите отредактировать, а затем вызвать BeginEdit в обработчике Loaded:

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

Если вы дадите своему DataGridTextColumn имя в XAML, вы можете использовать это имя, а не Columns[3].

person Quartermeister    schedule 06.08.2010
comment
Отличный ответ. Пришлось сосредоточить внимание на dataGrid dataGrid1.Focus (); сначала но потом это сработало. - person jbe; 29.12.2010
comment
Обратите внимание, что порядок столбцов в коллекции dataGrid1.Columns не обязательно соответствует порядку, отображаемому на экране, см. Примечание в msdn.microsoft.com/en-us/library/. Если вам действительно нужно индексировать по порядку отображения, просто сохраните dataGrid1.Columns.OrderBy(c => c.DisplayIndex).ToArray() в локальной переменной и вместо этого выполните индексирование в этом массиве. - person Gooseberry; 05.03.2016

Используйте этот код, чтобы переместить прокрутку в определенную ячейку:

dgv.ScrollIntoView(dgv.Items[row], dgv.Columns[col]);
person Monntrack    schedule 10.03.2011

Используйте функцию ниже, она будет работать.

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));
}  
person Ramesh Vishwakarma    schedule 24.02.2018

Это сработало для меня:

DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(dataGrid1.Items[sampleRowIndex], dataGrid1.Columns[sampleColumnIndex]);
dataGrid1.SelectedCells.Clear();
dataGrid1.SelectedCells.Add(dataGridCellInfo);

Это выберет ячейку, на которой вы хотите сфокусироваться.

Объект DataGridCellInfo предоставляет информацию о ячейке и элементе данных, который связан с ячейкой. Он используется вместо ссылки на фактический объект DataGridCell, когда элемент управления DataGrid получает ячейку, например, в свойствах CurrentCell или SelectedCells. Отметьте здесь для получения дополнительной информации.

person Parisa    schedule 17.09.2018

У меня есть datagrid с TextBox в DataTemplate DataGridTemplateColumn. Также я использую Enter вместо Tab для фокусировки TextBox

private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        e.Handled = true;
        var TabKey = new KeyEventArgs(e.KeyboardDevice, e.InputSource, e.Timestamp, Key.Tab);
        TabKey.RoutedEvent = Keyboard.KeyDownEvent;
        InputManager.Current.ProcessInput(TabKey);
    }
}

Я решаю проблему с фокусом с помощью комбинации этого кода:

dataGrid.Focus();
//In case of more columns
//dataGrid.CurrentCell = new DataGridCellInfo(dataGrid.Items[0], dataGrid.Columns[1]);
dataGrid.BeginEdit();
(Keyboard.FocusedElement as UIElement).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
person CoRe23    schedule 26.11.2019