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 ObservableCollection personList { 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 代码