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