WPF学习笔记(15)数据网格控件DataGrid与数据模板


一、DataGrid

1. DataGrid类概述

DataGrid用于在网格中显示可编辑数据的控件。
官方文档:https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.controls.datagrid?view=netframework-4.8

在这里插入图片描述

2. ItemsControl类

ItemsControl类是列表ListBox、下拉框ComboBox、菜单、网格DataGrid等一系列选项的基类,部分属性如下:

属性说 明
ltemsSource获取或设置用于生成 ltemsControl 的内容的集合。
设置ltemsSource属性后,集合ltems是只读且固定大小的,因此不可修改。
ltems获取用于生成 ltemsControl 的内容的集合。
DisplayMemberPath获取或设置源对象上的值的路径,以用作对象的可视表示形式,不能同时设置 DisplayMemberPath 和ltemTemplate.
ItemTemplate获取或设置用来显示每个项的数据模板DataTemplate。
ltemContainerStyle获取或设置应用于为每个项生成的容器元素的 Style。

3. Selector类

Selector类允许用户从其元素中选择项的控件。部分属性和事件如下:

属性说 明
SelectedIndex获取或设置当前选择中第一项的索引,如果选择为空返回-1。
Selectedltem获取或设置当前选择中的第一项,如果选择为空返回 null。
SelectedValue获取或设置当前选择中的第一项的某个成员值。
SelectedValuePath通常与 SelectedValue 属性一起使用,用于指定控件中选定项目的属性。
事件说 明
Selected当选择项时发生。
SelectionChanged当选择更改时发生。
UnSelected当取消选择项时发生。

3. DataGrid类

DataGrid类部分属性和事件如下:

属性说 明
Columns获取一个集合,该集合包含 DataGrid 中的所有列。
AutoGenerateColumns获取或设置一个值,该值指示是否自动创建列,默认值为 True
AlternatingRowBackground获取或设置间隔使用的背景画笔。
CanUserAddRows获取或设置一个值,该值指示用户是否可添加新行,默认为True要出现空白行还需要保证自定义对象需要具有无参的构造函数
Currentltem获取与包含当前单元格的行绑定的数据项。
SelectionUnit获取或设置一个值,该值指示是否选择行、单元格或两者。
Cell只可选择单元格。
CellOrRowHeader 单击单元格时只选择该单元格,单击行标题选择整行。
FullRow只可选择整行。
SelectionMode获取或设置单选还是多选。
Single 单选
Extended多选
IsReadOnly获取或设置一个值,该值指示是否可编辑。

4. DataGridColumn类

DataGridColumn 类表示一个 DataGrid 列的抽象基类,部分属性和事件如下:

属性说 明
Width获取或设置列的宽度。Header
HeaderStringFormat获取或设置要应用于列标题的格式,
HeaderTemplate获取或设置用于显示列标题的数据模板
HeaderTemplateSelector获取或设置标题列的数据模板选择器。
Visibility获取或设置列是否显示
IsReadOnly获取或设置一个值,该值指示能否编辑列中的单元格。
SortDirection获取或设置列的排序方向(升序或降序)。

5. DataGridColumn类的派生类

DataGridBoundColumn类 表示一个可绑定到 DataGrid 的数据源中的属性的列的基类。

属性说 明
Binding获取或设置列的标题。

DataGridTextcolumn类继承自DataGridBoundcolumn,表示一个文本列。

属性说 明
FontSize获取或设置字体大小。
FontFamily获取或设置字体。
Foreground获取或设置前景色。

DataGridCheckBoxColumn类继承自DataGridBoundcolumn。表示一个复选框列。

属性说 明
IsThreeState获取或设置是否是三态复选框。

6. 实例

在这里插入图片描述

<Grid>
    <DataGrid x:Name="dataGrid" AlternatingRowBackground="Red" Margin="210,35,160,100"
              AutoGenerateColumns="False"
              CanUserAddRows="True"
              SelectionMode="Extended">
        <DataGrid.Columns>
            <DataGridTextColumn Header="学号" Width="100" Binding="{Binding Id}" />
            <DataGridTextColumn Header="姓名" Width="Auto" Binding="{Binding Name}" />
            <DataGridTextColumn Header="分数" Width="*" Binding="{Binding Score}" />
        </DataGrid.Columns>
   </DataGrid>
</Grid>
public class Stu
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Score { get; set; }
    //空的构造函数
    //如果没有空的构造函数,搭配CanUserAddRows使用时空白行无法产生
    public Stu() { }
    public Stu(int id, string name, int score)
    {
        Id = id;
        Name = name;
        Score = score;
    }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<Stu> list = new List<Stu>
        {
            new Stu(1, "张三", 99),
            new Stu(2, "李四", 80),
            new Stu(3, "王五", 75)
        };
        dataGrid.ItemsSource = list;

        dataGrid.SelectionChanged += dataGrid_SelectionChanged;
    }

    private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        // 获取选中的项
        Stu s = dataGrid.SelectedItem as Stu;
        if (s != null)
        {
            // 访问第一列的数据
            Console.WriteLine(s.Id + "," + s.Name + "," + s.Score);
            Console.WriteLine("_______________________");
        }

        // 遍历访问每一列的数据
        foreach (object item in dataGrid.SelectedItems) 
        { 
            Stu stu = (Stu)item;
            Console.WriteLine(stu.Id + "." + stu.Name + "," + stu.Score);
        }
    }
}

在这里插入图片描述

二、DataGrid数据模板

DataGridColumn 类表示一个 设置DataTemplate的列, HeaderTemplate 用来获取或设置用于显示列标题的数据模板,HeaderTemplateSelector 用来获取或设置标题列的数据模板选择器。
通过在MainWindow.xaml界面的window.resources 定义数据模板,然后使用DataGrid类继承的ItemTemplate属性引用,示例代码如下:

<Window.Resources>
    <DataTemplate x:Key="myDT">
        <TextBlock Text="{Binding Id}" Width="30" Height="30" TextAlignment="Center" Background="Yellow" >
            <TextBlock.Clip>
                <EllipseGeometry Center="15,15" RadiusX="15" RadiusY="15" />
            </TextBlock.Clip></TextBlock>
        </DataTemplate>
</Window.Resources>
<Grid>
    <!--d:ItemsSource="{d:SampleData ItemCount=5}"仅在设计界面显示-->
    <DataGrid x:Name="dataGrid" d:ItemsSource="{d:SampleData ItemCount=5}"
              AutoGenerateColumns="False" AlternatingRowBackground="Red">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="学号" Width="100" CellTemplate="{StaticResource myDT}" />
            <DataGridTextColumn Header="姓名" Width="Auto" Binding="{Binding Name}" />
            <DataGridTextColumn Header="分数" Width="*" Binding="{Binding Score}" />
            </DataGrid.Columns>
    </DataGrid>
</Grid>
public class Stu
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Score { get; set; }
    //空的构造函数
    //如果没有空的构造函数,空白行无法产生,搭配CanUserAddRows使用
    public Stu() { }
    public Stu(int id, string name, int score)
    {
        Id = id;
        Name = name;
        Score = score;
    }
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<Stu> list = new List<Stu>
        {
            new Stu(1, "张三", 99),
            new Stu(2, "李四", 80),
            new Stu(3, "王五", 75)
        };
        dataGrid.ItemsSource = list;           
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值