WPF DataGrid 控件
默认
C# 代码
public partial class DataGridView : Window { public DataGridViewModel viewModel; public DataGridView() { InitializeComponent(); this.viewModel = new DataGridViewModel(); this.viewModel.personList.Add(new Person { Id = 1, Name = "马云" }); this.viewModel.personList.Add(new Person { Id = 2, Name = "刘强东" }); this.viewModel.personList.Add(new Person { Id = 3, Name = "曹德旺" }); this.DataContext = this.viewModel; } } public class Person { public int Id { get; set; } public string Name { get; set; } } public class DataGridViewModel : INotifyPropertyChanged { public ObservableCollectionpersonList { set; get; } public DataGridViewModel() { this.personList = new ObservableCollection (); } public event PropertyChangedEventHandler PropertyChanged; public void RaisePropertyChanged(string propertyName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
XAML 代码
视图效果
1、DataGrid 加上 RowHeaderWidth="0" 取消最左面的一列
2、CanUserAddRows="False" 表示不让DataGrid自动生成行
自动添加行号:
C# 代码
private void dataGrid_LoadingRow(object sender, DataGridRowEventArgs e) { e.Row.Header = e.Row.GetIndex() + 1; }
XAML 代码
视图效果
按 Enter 键焦点进入下一个单元格
C# 代码
private void dataGrid_PreviewKeyDown(object sender, KeyEventArgs e) { var uie = e.OriginalSource as UIElement; if (e.Key == Key.Enter) { uie.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); e.Handled = true; } }
XAML 代码
取得当前焦点所在的行
C# 代码
private void Button_Click(object sender, RoutedEventArgs e) { var _cells = dataGrid.SelectedCells; if (_cells.Any()) { string columnName = dataGrid.CurrentColumn.Header.ToString(); int rowIndex = dataGrid.Items.IndexOf(_cells.First().Item); } }
行焦点改变时,获取所有的 cell 值
C# 代码
private void dataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { var cells = dataGrid.SelectedCells; if (cells.Any()) { int rowIndex = dataGrid.Items.IndexOf(cells.First().Item); foreach (var cell in cells) { string Text = (cell.Column.GetCellContent(cell.Item) as TextBlock).Text; } } }
XAML 代码