Wpf数据表格回车键移动到下一行

8
我正在尝试开发一个带有数据网格的wpf应用程序,我希望允许用户像在Excel中一样输入值。
例如: 数据网格有2列,名称和条形码 用户正在编辑第一行的条码,当用户按Enter键时,焦点应该移动到下面一行的条码单元格。
用户必须能够使用条形码扫描器在现有产品列表上注册条形码,无需使用鼠标或键盘。
如何实现这种行为?有什么想法吗?
谢谢, Frederico

你想让数据网格处理回车键就像处理Tab键一样吗? - Ahmad Hammoud
不,Tab键将焦点设置为下一个单元格,我需要将焦点设置在当前列的下一行。 就像在Excel中,当用户编辑单元格时,按Enter键后,下面的单元格会获得焦点并开始编辑。 - Frederico Regateiro
但它已经像Excel一样了,你能再解释一下吗? - Ahmad Hammoud
我的问题是在按下回车键后移动和编辑下面的单元格。 - Frederico Regateiro
4个回答

7
一个更简单的解决方案是捕获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));
    }
}

2

我刚刚通过一些额外的代码完成了这个操作,在Datagrid上处理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;
        }
    }
}

只有包含条形码属性的列对于这种行为是我需要的。


0

像这样吗?

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

数据将存储在列表lst中,以便您在需要时使用。

按Enter键后,焦点会自动移动到第二行。


是的,聚焦已自动设置,但我需要开始编辑单元格,而无需更多用户交互。 用户正在编辑条形码单元格,当他按Enter键时,焦点将设置在下面的单元格上,他可以开始输入新值,而无需双击新单元格。 - Frederico Regateiro
它不需要任何用户交互,只需开始扫描或输入。 - Ahmad Hammoud
编辑从第一个单元格开始,对吗? 我需要编辑下面一行的同一列单元格。 就像在Excel中编辑一样。 - Frederico Regateiro
也许一个完整的场景会帮助我弄清楚你的问题,或者你可以在Stack Overflow上发起聊天。 - Ahmad Hammoud
感谢您的帮助,一个完整的场景: 我有一个产品列表,它显示在数据网格上,包括名称、代码、条形码和数量列。 我需要更新产品的库存,即数量列。 为了让用户更快地完成此任务,在编辑第一个产品的数量时,他按下回车键,然后需要开始输入第二个产品的数量。因此,用户执行以下操作:数量、回车、数量、回车,直到完成为止。 我的问题是如何通过按回车键来移动焦点并开始编辑。 - Frederico Regateiro

0
如果可以接受第三方WPF网格,Essential Grid 可以用作它具有内置于网格中的类似Excel的行为。
整个控件套件可通过社区许可证计划免费获得,如果您符合条件。注意:我在Syncfusion工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接