输入键移动下一行

本文关键字:一行 移动 输入 | 更新日期: 2023-09-27 18:18:50

我试图开发一个数据网格的wpf应用程序,我想让用户像在excel中输入值。

的例子:数据网格有2列,名称和条形码用户正在编辑第一行上的条形码,当用户按下Enter键时,焦点应该移动到条形码单元格上的下一行。

用户必须能够使用条形码扫描器在现有产品列表上注册条形码,而不需要使用鼠标或键盘。

对如何实现这个行为有什么想法吗?

谢谢,弗雷德里克

输入键移动下一行

一个更简单的解决方案是捕获KeyDown事件,如果键是'Enter',则移动到下一个选项卡。

private void dg_PreviewKeyDown(object sender, KeyEventArgs e)
{
    var u = e.OriginalSource as UIElement;
    if (e.Key == Key.Enter && u != null)
    {
        e.Handled = true;
        u.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
    }
}

我刚刚用一些额外的代码完成了这一点,通过处理数据网格上的PreviewKeyUp事件,工作代码是:

private void DataGrid_PreviewKeyUp(object sender, KeyEventArgs e)
{
    if ((e.Key == Key.Enter) || (e.Key == Key.Return))
    {
        DataGrid grid = sender as DataGrid;
        if (grid.CurrentColumn.Header.ToString().Equals("Barcode", StringComparison.OrdinalIgnoreCase))
        {
            if (grid.SelectionUnit == DataGridSelectionUnit.Cell || grid.SelectionUnit == DataGridSelectionUnit.CellOrRowHeader)
            {
                var focusedElement = Keyboard.FocusedElement as UIElement;
                focusedElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
             }
             grid.BeginEdit();
             e.Handled = true;
        }
    }
}

包含Barcode属性的Column是我唯一需要用于此行为的Column

是这样的吗?

//MainWindow.xaml.cs

namespace BarcodeImplementationInDG
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        List<Products> lst = new List<Products>();
        public MainWindow()
        {
            InitializeComponent();
            dg.ItemsSource = lst;
        }
    }
    public class Products
    {
        public string Product { get; set; }
        public string Barcode { get; set; }
    }
}
//MainWindow.xaml

<Window x:Class="BarcodeImplementationInDG.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid x:Name="dg" VerticalAlignment="Top" HorizontalAlignment="Left" CanUserAddRows="True" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" Height="309" Width="507" >
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="ProductColumn" Binding="{Binding Product}" Header="Product"  />
                <DataGridTextColumn x:Name="BarcodeColumn" Binding="{Binding Barcode}" Header="Barcode"  />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

数据将存储在列表列表中,以防您想要使用它们

按Enter键,焦点自动移动到第二行…

如果可以接受第三方WPF网格,则可以使用Essential Grid,因为它具有内置在网格中的类似Excel的行为。

如果您符合资格,可以通过社区许可计划免费获得整套控件。注:我为Syncfusion工作