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 代码