输入键移动下一行
本文关键字:一行 移动 输入 | 更新日期: 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.csnamespace 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工作