数据网格控件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;
}
}