WPF DataGrid 以编程方式转到第一行

问题描述 投票:0回答:2

这是我的代码

版本1

public void scrollIntoGrid(DataGrid grid)
        {
            object item = grid.Items[0];
            grid.SelectedItem = item;
            grid.ScrollIntoView(item);
            grid.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
            grid.SelectedIndex = 0;
            //DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(grid.SelectedItem);         
            //row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Left));
            //row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));
        }

版本2

public void scrollIntoGrid(DataGrid grid)
        {
            object item = grid.Items[0];
            grid.SelectedItem = item;
            grid.ScrollIntoView(item);
            //grid.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
            //grid.SelectedIndex = 0;
            DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(grid.SelectedItem);
            row.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
            //row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));
        }

并且所有迭代都进入网格中的第二行而不是第一行。

c# wpf datagrid
2个回答
1
投票

以下代码对我有用。在按钮上单击它会选择第一行。如果这就是您的意思

go to first row

如果您对第一行的解释是标题行,那么这将不起作用。 您的 scroolIntoGrid 函数可能如下所示:

  public void scrollIntoGrid(DataGrid grid)
    {

        if(grid != null && grid.HasItems)
        {
            grid.SelectedIndex = 0;
            grid.Focus();
        }
       
    }

完整代码在这里:

文件背后的代码:

 public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    

}

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var listOfPersons = new List<Person> { { 
                new Person { Firstname="Hello",Lastname="World"} },
            new Person {Firstname="World",Lastname="Hello"} };
        mygrid.DataContext = listOfPersons;
        
        
    }


    private void btnSearch_Click(object sender, RoutedEventArgs e)
    {
        scrollIntoGrid(this.mygrid);
    }



    public void scrollIntoGrid(DataGrid grid)
    {

        if(grid != null && grid.HasItems)
        {
            grid.SelectedIndex = 0;
            grid.Focus();
        }
       
    }

  
}

}

XAML 文件:

<Window x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp1"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid >
    <StackPanel Orientation="Vertical" Grid.Column="2" Margin="20,10,10,10">
        <Button Content="Search"
            Height="25" HorizontalAlignment="Right"  Margin="20,10,10,10"
            Name="btnSearch" VerticalAlignment="Top" Width="75" TabIndex="1300" Click="btnSearch_Click" />
    </StackPanel>
    <DataGrid x:Name="mygrid" AutoGenerateColumns="False" Grid.Column="1" Margin="20,160,10,10" 
              BorderThickness="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Focusable="True"
              ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" GridLinesVisibility="None"
              ItemsSource="{Binding}" CanUserSortColumns="False" CanUserResizeColumns="False" IsReadOnly="True" 
             >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Shortname" Width="100" Binding="{Binding Firstname}" />
            <DataGridTextColumn Header="Internal Code" Width="100" Binding="{Binding Lastname}"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

根据您的评论,您实际上想从向下箭头键上的文本框跳转,以下更改对我来说很有效。

添加了带有

PreviewKeyDown
事件的 XAML 文本框

<TextBox x:Name="searchBox" PreviewKeyDown="searchBox_KeyDown"></TextBox>

并在后面的代码中:

  private void searchBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Down) // The Arrow-Down key
        {
            scrollIntoGrid(mygrid);
            e.Handled = true;
            Keyboard.Focus(mygrid);
        }
    }

ScrollIntoGrid 与上述相同。


0
投票

一段时间后回到这个问题,我发现有效的解决方案是文本框中的 KeyUp 事件。

if (e.Key == Key.Down)
 {
  object item = dgProductSaleInvSm.Items[0];
  dgProductSaleInvSm.SelectedItem = item;
  dgProductSaleInvSm.ScrollIntoView(item);
  DataGridRow row = (DataGridRow)dgProductSaleInvSm.ItemContainerGenerator.ContainerFromIndex(0);
 row.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
 }                
© www.soinside.com 2019 - 2024. All rights reserved.