WPF之DataGrid

WPF之DataGrid

1.DataGrid控件提供了丰富的功能,包括:

数据绑定:可以将DataGrid绑定到任何数据源,如List、集合或数据库中的数据。
列定义:可以定义多种类型的列,如文本、日期、货币、枚举等。
编辑模式:支持编辑模式,如双击单元格进行编辑或使用快捷键。
选择模式:支持多种选择模式,如单选、多选、范围选择等。
分组:可以对数据进行分组,使大量数据更易于浏览。
过滤和排序:允许用户通过拖放列头来过滤和排序数据。
模板:可以使用模板自定义单元格和行的外观。


2. DataGrid的属性
DataGrid控件有多个属性,这些属性决定了控件的行为和外观。以下是一些常用的属性:

AutoGenerateColumns:决定是否自动生成列。
CanUserAddRows:决定是否允许用户添加新行。
CanUserDeleteRows:决定是否允许用户删除行。
Columns:定义列的集合。
ItemsSource:绑定到DataGrid的数据源。
SelectedItem:选中的项目。
DataGrid的事件


3.DataGrid控件触发的事件包括:

CellEditEnding:编辑单元格结束时触发。
ColumnHeaderClick:列标题点击时触发。
CurrentCellChanged:当前单元格变化时触发。
RowEditEnding:编辑行结束时触发。

示例:

<Window x:Class="WpfApp9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp9"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DataGrid x:Name="paraDataGrid" AutoGenerateColumns="True" CanUserAddRows="True" CanUserDeleteRows="True">
            <DataGrid.Columns>
                <DataGridTextColumn Header="参数名称" Width="Auto"/>
                <DataGridTextColumn Header="参数内容" Width="Auto"/>
            </DataGrid.Columns>
            
        </DataGrid>
   </Grid>
</Window>

常用属性

AutoGenerateColumns="True"
<Window x:Class="WpfApp9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp9"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DataGrid x:Name="dataGrid" AutoGenerateColumns="True">
            
            
        </DataGrid>
    </Grid>
</Window>

using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp9
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<Person> list = new List<Person>();

            list.Add(new Person("major","18"));
            list.Add(new Person("major1", "20"));
            dataGrid.ItemsSource = list;
        }
    }

    public class Person
    {
       public string Name { get; set; }
       public string Age { get; set; }

        public Person(string name,string age)
        {
            Name = name;
            Age = age;
        }
    }

}

在这里插入图片描述

        <DataGrid x:Name="dataGrid" AutoGenerateColumns="True" RowBackground="AliceBlue" >
            
            
        </DataGrid>

在这里插入图片描述

        <DataGrid x:Name="dataGrid" AutoGenerateColumns="True" RowBackground="AliceBlue" AlternatingRowBackground="Pink">
            
            
        </DataGrid>

在这里插入图片描述

        <DataGrid x:Name="dataGrid" AutoGenerateColumns="True" RowBackground="AliceBlue" AlternatingRowBackground="Pink" ColumnHeaderHeight="50">


        </DataGrid>

在这里插入图片描述

  <Grid Margin="10">
      <DataGrid Name="DgPersons" AutoGenerateColumns="False" RowBackground="LightPink" AlternatingRowBackground="LightBlue" ColumnHeaderHeight="30" RowHeaderWidth="20" ColumnWidth="100" GridLinesVisibility="Horizontal" HorizontalGridLinesBrush="Red" HeadersVisibility="All" LoadingRow="DgPersons_LoadingRow" RowDetailsVisibilityMode="VisibleWhenSelected" HorizontalScrollBarVisibility="Auto" FrozenColumnCount="2" SelectionChanged="DgPersons_SelectionChanged" SelectionMode="Extended">
          <DataGrid.RowDetailsTemplate>
              <DataTemplate>
                  <Border BorderBrush="LightGoldenrodYellow" BorderThickness="1" Margin="3" Padding="5">
                      <TextBlock Text="{Binding Description}" TextWrapping="Wrap"/>
                  </Border>
              </DataTemplate>
          </DataGrid.RowDetailsTemplate>
          <DataGrid.ColumnHeaderStyle>
              <Style TargetType="{x:Type DataGridColumnHeader}">
                  <Setter Property="Foreground" Value="LightGreen"/>
              </Style>
          </DataGrid.ColumnHeaderStyle>
          <DataGrid.Columns>
              <DataGridCheckBoxColumn Binding="{Binding IsChecked}" Width="40"/>
              <DataGridTextColumn Header="编号" Binding="{Binding Id}" Width="40"/>
              <DataGridTextColumn Header="名字" Binding="{Binding Name}" Width="100">
                  <DataGridTextColumn.ElementStyle>
                      <Style TargetType="{x:Type TextBlock}">
                          <Setter Property="Foreground" Value="Blue"/>
                      </Style>
                  </DataGridTextColumn.ElementStyle>
              </DataGridTextColumn>
              <!--<DataGridTextColumn Header="年龄" Binding="{Binding Age}" Width="40"/>-->
              <DataGridTemplateColumn>
                  <DataGridTemplateColumn.CellTemplate>
                      <DataTemplate>
                          <Grid Background="{Binding Age}">
                              <TextBlock Text="{Binding Age}" Width="50"/>
                          </Grid>
                      </DataTemplate>
                  </DataGridTemplateColumn.CellTemplate>
              </DataGridTemplateColumn>
              <DataGridTextColumn Header="学号" Binding="{Binding Number}" Width="120"/>
              <DataGridComboBoxColumn Header="性别" SelectedItemBinding="{Binding Gerder}" ItemsSource="{Binding Source={StaticResource GerderEnumProvider}}"/>
              <DataGridTemplateColumn>
                  <DataGridTemplateColumn.CellTemplate>
                      <DataTemplate>
                          <Grid>
                              <Button Content="编辑" Width="50"/>
                          </Grid>
                      </DataTemplate>
                  </DataGridTemplateColumn.CellTemplate>
              </DataGridTemplateColumn>
              <DataGridTemplateColumn>
                  <DataGridTemplateColumn.CellTemplate>
                      <DataTemplate>
                          <TextBlock Text="{Binding Borthday}"/>
                      </DataTemplate>
                  </DataGridTemplateColumn.CellTemplate>
                  <DataGridTemplateColumn.CellEditingTemplate>
                      <DataTemplate>
                          <DatePicker SelectedDate="{Binding Borthday,Mode=TwoWay}"/>
                      </DataTemplate>
                  </DataGridTemplateColumn.CellEditingTemplate>
              </DataGridTemplateColumn>
             
          </DataGrid.Columns>
      </DataGrid>
  </Grid>
  public partial class MainWindow : Window
  {
      public MainWindow()
      {
          InitializeComponent();
      }

      private void Window_Loaded(object sender, RoutedEventArgs e)
      {
          ObservableCollection<Person> persons = new ObservableCollection<Person>();
          for (int i = 0; i < 10; i++)
          {
              persons.Add(new Person()
              {
                  Id = i,
                  Name = "Tom" + i,
                  Age = 18 + i,
                  Number = 100 + i,
                  Gerder=Gerder.M,
                  Description= " Description DescriptionDescription DescriptionDescription DescriptionDescription DescriptionDescription DescriptionDescription DescriptionDescription DescriptionDescription Description",
                  Borthday=DateTime.Now
              });
          }

          DgPersons.ItemsSource = persons;

          //Enum.GetValues(typeof(Gerder)).Cast<Gerder>().ToList();

      }

      private void DgPersons_LoadingRow(object sender, DataGridRowEventArgs e)
      {
          if (e.Row.DataContext is Person person)
          {
              if (person.Age > 20)
              {
                  e.Row.Background = Brushes.LightCoral;
              }
          }
      }

      private void DgPersons_SelectionChanged(object sender, SelectionChangedEventArgs e)
      {
          if(sender is DataGrid dataGrid)
          {
              int count= dataGrid.SelectedItems.Count;

              //如果对DataGrid进行增加或者删除操作的时候,一定要注意是否有排序信息,如果有先删掉,再操作
          }
      }
  }
### 回答1: WPF(Windows Presentation Foundation)是一种用于创建Windows应用程序界面的框架。在WPF中,可以使用DataGrid控件来展示和编辑数据。折叠DataGrid可以让用户在需要时展开和收起数据,以便更好地组织和管理信息。 要在WPF中实现折叠DataGrid,可以使用一些额外的控件和代码逻辑。首先,可以使用TreeView控件作为外层容器,用于显示可展开和收起的树形结构。然后,在TreeView的各个节点中,嵌套使用DataGrid控件来展示具体的数据。 为了实现折叠和展开的功能,可以在TreeView的节点上使用ToggleButton等控件,以便用户点击时切换折叠或展开状态。在代码中,可以使用数据绑定来动态地添加和删除TreeView节点,以及相应地调整DataGrid的可见性。当用户点击折叠按钮时,可以通过修改绑定的标志位来隐藏对应的DataGrid,从而实现折叠效果。 此外,还可以通过自定义样式和模板来美化和定制DataGrid和TreeView的外观。可以修改控件的背景、边框、字体等属性,以便与应用程序的整体风格保持一致。 总之,在WPF中实现折叠DataGrid需要合理运用控件和代码逻辑,通过数据绑定和样式调整,来实现折叠和展开的功能,同时保持应用程序的美观和易用性。 ### 回答2: WPF中的DataGrid控件是一个非常强大和灵活的控件,可以用于展示和编辑数据。如果要实现折叠(DataGrid Grouping),我们可以通过使用CollectionViewSource和GroupDescription来实现。 首先,我们需要创建一个CollectionViewSource对象,并将DataGrid的ItemsSource绑定到该对象上。CollectionViewSource允许我们对数据进行分组和排序。 然后,我们可以使用GroupDescription对象来指定分组的属性。GroupDescription可以是一个字符串,表示要根据某个属性进行分组,也可以是一个自定义的实现了IGrouping接口的对象。 最后,我们还需要设置DataGrid的GroupStyle以定义分组的样式。GroupStyle可以包含一个HeaderTemplate,用于显示分组的标题,以及一个ItemsPanel,用于显示分组的内容。 下面是一个简单的示例,展示如何在WPF中折叠(DataGrid Grouping): 1. XAML代码: ```xml <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="450" Width="800"> <Grid> <DataGrid x:Name="dataGrid"> <DataGrid.GroupStyle> <GroupStyle> <GroupStyle.HeaderTemplate> <DataTemplate> <TextBlock FontWeight="Bold" Text="{Binding Path=Name}"/> </DataTemplate> </GroupStyle.HeaderTemplate> <GroupStyle.ContainerStyle> <Style TargetType="{x:Type GroupItem}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type GroupItem}"> <StackPanel> <TextBlock FontWeight="Bold" Text="{Binding Path=Items.Count}"/> <ItemsPresenter/> </StackPanel> </ControlTemplate> </Setter.Value> </Setter> </Style> </GroupStyle.ContainerStyle> </GroupStyle> </DataGrid.GroupStyle> </DataGrid> </Grid> </Window> ``` 2. C#代码: ```C# public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); List<Person> people = new List<Person> { new Person{Name="Mike", Age=25}, new Person{Name="Tom", Age=30}, new Person{Name="Mike", Age=35}, new Person{Name="Tom", Age=40} }; CollectionViewSource cvs = new CollectionViewSource(); cvs.Source = people; cvs.GroupDescriptions.Add(new PropertyGroupDescription("Name")); dataGrid.ItemsSource = cvs.View; } } public class Person { public string Name { get; set; } public int Age { get; set; } } ``` 以上代码创建了一个简单的Window,其中有一个DataGrid控件,展示了一个包含姓名和年龄的Person类的集合。通过设置GroupStyle,我们让DataGrid根据姓名进行分组,每个分组显示一个标题和该分组中的数据。 总结起来,WPFDataGrid控件可以通过使用CollectionViewSource和GroupDescription来实现折叠或分组的效果。配合适当的样式设置,我们可以根据自己的需求,灵活地展示和编辑数据。 ### 回答3: WPF折叠DataGrid是一种在用户界面中显示表格数据的方法,可以通过折叠视图以及展开视图来管理和显示大量的数据。 折叠DataGrid可以通过使用WPF的Expander控件来实现。Expander控件提供了一个可折叠的容器,用户可以单击标题栏来展开或折叠容器内容。 在折叠DataGrid中,可以将DataGrid放置在Expander控件中。当用户点击折叠DataGrid的标题时,Expander会展开,显示DataGrid的内容;当用户再次点击标题时,Expander会折叠,隐藏DataGrid的内容。 在WPF中,我们可以使用XAML来定义折叠DataGrid。首先,我们创建一个Expander控件,将DataGrid作为其Content。然后,我们可以设置Expander的Header为DataGrid的标题。最后,我们可以通过设置Expander的IsExpanded属性来控制DataGrid的展开和折叠。 下面是一个简单的WPF折叠DataGrid的示例: ```xaml <Grid> <Expander Header="DataGrid" IsExpanded="False"> <DataGrid> <!-- DataGrid的列和数据绑定 --> </DataGrid> </Expander> </Grid> ``` 在这个示例中,DataGrid被放置在Expander内,并将Expander的Header设置为"DataGrid"。IsExpanded属性设置为False,表示DataGrid默认处于折叠状态。 通过这种方式,我们可以方便地实现DataGrid的折叠和展开,以便在需要时显示或隐藏大量的数据。这在处理大量数据或需要用户手动展开来查看数据时非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值