C# Wpf datagrid输入键移动下一行

C# Wpf datagrid输入键移动下一行,c#,wpf,datagrid,C#,Wpf,Datagrid,我正在尝试开发一个带有datagrid的wpf应用程序,我希望允许用户像在excel中一样输入值 例如: datagrid有两列,名称和条形码 用户正在编辑第一行上的条形码,当用户按Enter键时,焦点应移动条形码单元格下面的行 用户必须能够使用条形码扫描仪在现有产品列表上注册条形码,而无需使用鼠标或键盘 关于如何实施这种行为有什么想法吗 谢谢, 弗雷德里科像这样的吗 //MainWindow.xaml.cs namespace BarcodeImplementationInDG { /

我正在尝试开发一个带有datagrid的wpf应用程序,我希望允许用户像在excel中一样输入值

例如: datagrid有两列,名称和条形码 用户正在编辑第一行上的条形码,当用户按Enter键时,焦点应移动条形码单元格下面的行

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

关于如何实施这种行为有什么想法吗

谢谢, 弗雷德里科

像这样的吗

//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; }
    }
}
名称空间条码实现indg
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
List lst=新列表();
公共主窗口()
{
初始化组件();
dg.ItemsSource=lst;
}
}
公共类产品
{
公共字符串乘积{get;set;}
公共字符串条形码{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中,以备您使用


输入时,焦点自动移动到第二行。

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


如果您符合条件,整个控制套件将通过该程序免费提供。注意:我为Syncfusion工作。

我刚刚用一些额外的代码完成了这项工作,通过处理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;
        }
    }
}

保存条形码属性的列是此行为唯一需要的列。

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

是否希望datagrid像Tab键一样处理Enter键?否,Tab键将焦点设置为下一个单元格,我需要在同一列上设置焦点,但在当前单元格的下一行。就像在excel中一样,当用户编辑单元格时,当他按下enter键时,下面的单元格将接收焦点并开始编辑。但它已经像excel一样了。。你能解释更多吗?我的问题是移动和编辑下面的单元格,点击回车键是的,焦点设置为自动,但我需要开始编辑单元格,无需更多用户交互。用户正在编辑条形码单元格,当他按enter键时,焦点设置为下面的单元格,他可以开始键入新值,无需双击新单元格。不需要任何用户交互,只需开始扫描或键入。编辑从第一个单元格开始,对吗?我需要编辑下一行同一列的单元格。就像在Excel上编辑一样,也许完整的场景可以帮助我解决您的问题,或者在stackoverflow上开始聊天谢谢您的帮助,完整的场景:我有一个产品列表,它显示在数据网格上,带有名称、代码、条形码和数量列。我需要更新产品的库存,数量栏。为了让用户更快地完成此任务,在编辑第一个产品的数量时,他按enter键,需要开始输入第二个产品的数量。所以用户做,数量,输入,数量,输入。。。。直到完成为止。我的问题是移动焦点,启动editint,只需按回车键