如何将焦点设置在WPF DataGrid或其第一行?

时间:2011-09-27 07:02:49

标签: c# wpf xaml wpf-controls wpfdatagrid

我在DataGrid上放置了WPF Window。我有一个按钮,它执行一些业务逻辑并填充网格。

我希望在按钮的DataGrid时将焦点设置在TAB(最好是DataGrid中的第一行)。我已设置TabIndex但不知何故,焦点并没有出现在DataGrid上。

表单的XAML的相关部分在这里:

<StackPanel Orientation="Vertical" Grid.Column="2" Margin="20,10,10,10">
    <Button Content="Search"
                Height="25" HorizontalAlignment="Right" Margin="0,-25,0,0"
                Name="btnSearch" VerticalAlignment="Top" Width="75" **TabIndex="1300"** Click="btnSearch_Click" Keyboard.KeyDown="btnSearch_PreviewKeyDown" LostFocus="btnSearch_LostFocus"/>
</StackPanel>
<DataGrid AutoGenerateColumns="False" Grid.Column="1" Margin="20,160,10,10" Name="dataGridOrganisations" **TabIndex="1400"**
          BorderThickness="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Focusable="True"
                ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" GridLinesVisibility="None"
           ItemsSource="{Binding}" CanUserReorderColumns="False" CanUserResizeRows="False" IsReadOnly="True" SelectionChanged="dataGridOrganisations_SelectionChanged" Keyboard.PreviewKeyDown="dataGridOrganisations_PreviewKeyDown"  >
    <DataGrid.Columns>
        <DataGridTextColumn Header="Shortname" Width="100" Binding="{Binding ShortName}" />
        <DataGridTextColumn Header="Internal Code" Width="100" Binding="{Binding LocalID}"/>
        <DataGridTextColumn Header="Name" Width="*" Binding="{Binding Name}"/>
    </DataGrid.Columns>
</DataGrid>

当我在Button的LostFocus事件中添加以下代码时,会突出显示第一行。但是当我使用'向下'箭头键选择网格中的下一行时;它不会转到下一行,而是首先将焦点放在“搜索”按钮上,然后再转到第二行!

if (this.dataGridOrganisations != null && this.dataGridOrganisations.HasItems)
{
    this.dataGridOrganisations.Focus();
    if (dataGridOrganisations.Items != null && dataGridOrganisations.Items.Count > 0)
    {
        DataGridRow firstRow = this.dataGridOrganisations.ItemContainerGenerator.ContainerFromItem(dataGridOrganisations.Items[0]) as DataGridRow;
        if (firstRow != null)
        {
            firstRow.IsSelected = true;
        }
    }
}

如何设置DataGrid(或其第一行)的焦点?为什么TabIndex在这里不起作用?

3 个答案:

答案 0 :(得分:2)

如果控件层次结构中的ButtonDataGrid之间没有可聚焦控件,则甚至不需要制表符索引。你有很多处理程序,一切似乎有点让我感到困惑。我无法在该代码中发现任何内容(当然也许其他人可以),我的建议是您尝试简化代码,直到它再次正常工作,默认情况下应该如此。例如这段代码的标签应该有效:

  <StackPanel>
    <Button Content="Lorem Ipsum"/>
    <DataGrid ItemsSource="{Binding Source={StaticResource Items}}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}"/>
        </DataGrid.Columns>
    </DataGrid>
  </StackPanel>

另外,为什么大的tab-index delta?如果你使用1301&amp; 1302之间没有任何值,所以它应该自动成为更安全的代码。

答案 1 :(得分:1)

在xaml的数据网格中添加以下代码

SelectedIndex="0" Loaded="DataGrid_Loaded"

在.cs文件中添加以下代码

private void DataGrid_Loaded(object sender, RoutedEventArgs e)

    {
        DataGrid dataGrid = sender as DataGrid;
        dataGrid.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
    }

答案 2 :(得分:0)

DataGrid1.SelectedIndex = 0;

DataGrid1.Focus();

您可以将想要的任何整数放入所选索引。