专业游戏门户,分享手游网游单机游戏百科知识攻略!

嗨游网
嗨游网

datagrid用法详解(datagrid控件详解)

来源:小嗨整编  作者:小嗨  发布时间:2023-02-21 05:10
摘要:datagrid用法详解(datagrid控件详解)。在WPF中,主要使用DataGrid控件进行表格化数据的展示,控件提供一个用户界面,用于ADO.NET数据集(ADO.NET是微软的一个组件库,作为数据访问接口使用,详细内容直接参考百科...

datagrid用法详解(datagrid控件详解)。在WPF中,主要使用DataGrid控件进行表格化数据的展示,控件提供一个用户界面,用于 ADO.NET 数据集(ADO.NET是微软的一个组件库,作为数据访问接口使用,详细内容直接参考百科ADO.NET),并显示表格数据和启用数据源更新。DataGrid 控件设置为有效数据源时,则自动填充该控件,同时根据数据的形状创建列和行。DataGrid 控件可用于显示单个表或显示一组表之间的分层关系,本篇就简单介绍下DataGrid的常见用法。

1.使用DataGrid显示数据

第一步,在前端xaml文件上添加两个控件,一个是DataGrid控件,用于展示数据;另一个是Button控件,用于添加数据。前端PageUser.xaml文件的内容如下:

<Page x:Class="wpfbase.PageUser"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     xmlns:local="clr-namespace:wpfbase"
     mc:Ignorable="d"
     d:DesignHeight="325" d:DesignWidth="525"
     Title="PageUser">
 <Grid>
   <Grid.RowDefinitions>
     <RowDefinition Height="20" />
     <RowDefinition Height="5"/>
     <RowDefinition Height="*"/>
   </Grid.RowDefinitions>
   <Button Grid.Row="0" Click="AddUser" Content="添加用户" />
   <DataGrid Grid.Row="2" AutoGenerateColumns="False"
             CanUserAddRows="False" CanUserDeleteRows="False"
             CanUserReorderColumns="False" CanUserResizeColumns="False"
             CanUserResizeRows="False" ColumnHeaderHeight="30"
             FontSize="16" GridLinesVisibility="Horizontal"
             HeadersVisibility="Column" IsReadOnly="True" Name="datagrid"
             ItemsSource="{Binding UserDB}" RowHeight="28">
     <DataGrid.Columns>
       <DataGridTextColumn Width="Auto" MinWidth="25" Binding="{Binding UserID}" Header=""/>
       <DataGridTextColumn Width="*" Binding="{Binding UserName}" Header="用户名"/>
       <DataGridTextColumn Width="*" Binding="{Binding UserAccount}" Header="帐号"/>
       <DataGridTextColumn Width="*" Binding="{Binding UserPasswd}" Header="密码"/>
       <DataGridTextColumn Width="*" Binding="{Binding UserPhone}" Header="电话"/>
       <DataGridTextColumn Width="*" Binding="{Binding UserEmail}" Header="邮箱"/>
       <DataGridTextColumn Width="0.6*" Binding="{Binding UserSex}" Header="性别"/>
     </DataGrid.Columns>
   </DataGrid>
 </Grid>
</Page>

DataGrid控件中的ItemsSource="{Binding UserDB}"将DataGrid的数据源与UserDB属性绑定,也就表明数据源将从传入DataGrid控件数据对象的UserDB属性获取。DataGrid.Columns定义的是数据表的列(行头),Header的值是行头名,Binding绑定的是数据源对象中的子属性。数据源对象是一个数据对象数组,每一个数据对象需要包含UserID,UserName,UserAccount,UserPasswd,UserPhone,UserEmail,UserSex等属性。

DataGrid属性说明:

Datagrid属性的意义及使用方法参考WPF DataGrid常用属性记录。

第二步,后台cs文件实现数据展示及按钮触发的函数。前端PageUser.xaml.cs文件的内容如下:

using System;
using System.Windows;
using System.Windows.Controls;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace wpfbase
{
 public partial class PageUser : Page
 {
   private UserDBModel userdb;
   public PageUser()
   {
     InitializeComponent();
     userdb = new UserDBModel();
     datagrid.DataContext = userdb;
   }
   private void AddUser(object sender, RoutedEventArgs e) {
     int num = userdb.UserDB.Count+1;
     UserModel user = new UserModel((UInt32)num,
                                    "test"+num.ToString(),
                                    (UInt32)(1000000000+num),
                                    "passwd"+num.ToString(),
                                    (UInt64)(10000000000+num),
                                    "test@"+num.ToString()+".com",
                                    num%2==0);
     userdb.UserDB.Add(user);
   }
 }

 public class UserModel{
   public UInt32 UserID {get; set;}
   public string UserName {get; set;}
   public UInt32 UserAccount {get; set;}
   public string UserPasswd {get; set;}
   public UInt64 UserPhone {get; set;}
   public string UserEmail {get; set;}
   public bool UserSex {get; set;}
   public UserModel() {}
   public UserModel(UInt32 id,
                    string name,
                    UInt32 account,
                    string passwd,
                    UInt64 phone,
                    string email,
                    bool sex) {
     UserID = id;
     UserName = name;
     UserAccount = account;
     UserPasswd = passwd;
     UserPhone = phone;
     UserEmail = email;
     UserSex = sex;
   }
 }
 public class UserDBModel: INotifyPropertyChanged{
   public event PropertyChangedEventHandler PropertyChanged;
   public void OnPropertyChanged(PropertyChangedEventArgs e) {
     if (PropertyChanged != null)
       PropertyChanged(this, e);
     }
   private ObservableCollection<UserModel> userdb = new ObservableCollection<UserModel>();
   public ObservableCollection<UserModel> UserDB {
     get { return userdb; }
     set {
       userdb = value;
       OnPropertyChanged(new PropertyChangedEventArgs("UserDB"));
     }
   }
 }
}

在后台文件中,首先定义了两个类UserModel,UserDBModel。其中UserModel类就是前端所需的数据对象类型,而UserDBModel是前端所需的数据源对象类。写法与之前1篇提到的动态刷新LIstBox写法类似,要求UserDBModel继承自INotifyPropertyChanged,实现实时刷新。在界面类中实例化一个UserDBModel类型的成员userdb,作为数据源对象。在按钮响应函数AddUser中,我们构造一个UserModel对象user,并将user添加进userdb的UserDB成员。

如下图所示,点击添加用户按钮就可以往数据表中添加数据。

datagrid用法详解(datagrid控件详解)
备注1: 如果不需要实现刷新,那么直接创建一个List<UserModel>类型的列表,作为datagrid的ItemSource也可。

2.DataGrid样式设计

1.设计交替变换的样式

前端xaml文件修改为:

<Page ...>
 <Grid>
   ...
   <DataGrid Grid.Row="2" AlternationCount="2" ...>
     <DataGrid.RowStyle>
       <Style TargetType="{x:Type DataGridRow}">
         <Style.Triggers>
           <Trigger Property="AlternationIndex" Value="0">
             <Setter Property="Background" Value="#FFD9EEED"/>
           </Trigger>
           <Trigger Property="AlternationIndex" Value="1">
             <Setter Property="Background" Value="#FF84B3F9"/>
           </Trigger>
         </Style.Triggers>
       </Style>
     </DataGrid.RowStyle>
     ...
   </DataGrid>
 </Grid>
</Page>

如上,在DataGrid中设置属性AlternationCount的值,AlternationCount表示交替长度,我们设置交替长度为2;再添加DataGrid.RowStyle样式,如上,当交替索引为0时,触发第一种Trigger样式,当交替索引为1时,触发第二种Trigger样式。效果如下:
datagrid用法详解(datagrid控件详解)

2.禁止用户按列对表中内容进行排序

我们可以通过设置DataGrid属性CanUserSortColumns的值来控制是否允许用户按列对表中内容进行排序,默认情况下CanUserSortColumns属性的值为True,我们将这个属性的值设置为False即可禁止用户按列对表中内容进行排序。

3.禁止列排序、禁止列宽调整

我们可以通过设置DataGrid属性CanUserReorderColumns的值来控制是否允许用户对列排序,默认情况下CanUserReorderColumns属性的值为True,我们将这个属性的值设置为False即可禁止用户对列排序。

我们可以通过设置DataGrid属性CanUserResizeColumns的值来控制是否允许用户对列宽调整,默认情况下CanUserResizeColumns属性的值为True,我们将这个属性的值设置为False即可禁止用户对列宽调整。

4.设置固定排序规则对列表排序

DataGrid的固定排序可以利用CollectionViewSource实现,通过CollectionViewSource将数据源先进行排序,再作为新的数据源传给DataGrid。

前端xaml文件如下所示:

<Page ...
     xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase">
 <Page.Resources>
   <CollectionViewSource x:Key="SortUserDB" Source="{Binding UserDB}">
     <CollectionViewSource.SortDescriptions>
       <scm:SortDescription PropertyName="UserID" Direction="Descending"/>
     </CollectionViewSource.SortDescriptions>
   </CollectionViewSource>
 </Page.Resources>
 <Grid>
   ...
   <DataGrid ...ItemsSource="{Binding Source={StaticResource SortUserDB}}">
     ...
   </DataGrid>
 </Grid>
</Page>

原本后台数据源的数据UserDB是直接传送给DataGrid的ItemsSource进行数据绑定,现在改为了先将数据传送给页面静态资源CollectionViewSource的Source,而DataGrid的ItemsSource绑定的是静态资源SortUserDB,即CollectionViewSource资源。在CollectionViewSource中,我们通过设置<CollectionViewSource.SortDescriptions>实现对列表的排序,<scm:SortDescription PropertyName="UserID" Direction="Descending"/>这一行是按照属性UserID的值对数据源进行排序,Direction="Descending"是逆序,默认情况为正序!(这里可以设置多种排序,如在按照UserID排序后,可以在此基础上按照其它属性再排序,直接在下方按照同样的手法再加一行而已。)

后台cs文件需要修改传输的数据源方式,如下:

...
   public PageUser()
   {
     InitializeComponent();
     userdb = new UserDBModel();
     //datagrid.DataContext = userdb;
     this.DataContext = userdb;
   }
...

原本数据传输方式为datagrid.DataContext = userdb;

现在修改为this.DataContext = userdb;

效果如下:
datagrid用法详解(datagrid控件详解)

5.设置列宽为自适应宽度

只需要将列宽设置为Auto,就可以根据列表内容自适应宽度!

6.更换显示内容

在数据源中,我们通常采用bool类型来保存性别,但在前端,我们需要将性别显示为正常的男或女,要实现这个功能,有多种思路。第一种,从数据源头修改,即我们设置数据对象的UserSex属性值时,直接设置为"男"或"女";第二种,使用模板列(这个小编不会);第三种,触发后台修改,每次数据源更新时,触发后台函数,修改前端数据表性别的显示方法;第四种,采用数据源转换器,在Binding时,使用Converter转换器直接将数据源转换后传给目标。

我们介绍下第四种方法:

第一步,在后台cs文件中创建转换器类

...
namespace wpfbase
{
 ...
 public class SexConverter: IValueConverter {
   public object Convert(
       object value, Type targetType, object parameter,
       System.Globalization.CultureInfo culture) {
     if((bool)value) return "男";
     else return "女";
   }
   public object ConvertBack(
       object value, Type targetType, object parameter,
       System.Globalization.CultureInfo culture) {
     if((string)value == "男") return true;
     else return false;
   }
 }
}

在后台我们创建了一个继承至IValueConverter的SexConverter类,在这个类中我们必须覆盖两个接口函数,Convert和ConvertBack。Convert函数实现了从数据源到呈现目标的数据转换,其中true对应的是"男",false对应的是"女";ConvertBack函数实现了从呈现目标到数据源的转换,"男"对应的是true,"女"对应的是false。

第二步,在前端文件中使用转换器

<Page ...
     xmlns:local="clr-namespace:wpfbase"
     ...>
 <Page.Resources>
   <local:SexConverter x:Key="UserSexConverter"/>
   ...
 </Page.Resources>
 <Grid>
   ...
   <DataGrid ...>
     ...
     <DataGrid.Columns>
       ...
       <DataGridTextColumn Width="Auto" Binding="{Binding UserSex, Converter={StaticResource UserSexConverter}}" Header="性别"/>
     </DataGrid.Columns>
   </DataGrid>
 </Grid>
</Page>

首先引入转换器类的命名空间,由于我们实在项目的命名空间下wpfbase定义的类,不需要再引入命名空间。在页面的资源中添加转换器资源,<local:SexConverter x:Key="UserSexConverter"/>,SexConverter是后台文件中定义的类名,UserSexConverter是现在定义的转换器资源名称,在后面使用,这里注意,添加这行代码时编译器可能会提醒"命名空间中找不到此名称",不用在意这个,继续往下做。在性别那一列的绑定数据中,Binding="{Binding UserSex, Converter={StaticResource UserSexConverter}}"使用转换器资源实现数据内容的转换。效果如下:

datagrid用法详解(datagrid控件详解)

7.设置单元格区间范围,超出范围修改样式

3.DataGrid连接MySQL数据库显示数据表

使用datagrid控件将数据表展示在前端界面上。

前端xaml文件内容如下:

<Page ... Title="PageClient">
 <Grid>
   <Grid.RowDefinitions>
     <RowDefinition Height="20" />
     <RowDefinition Height="5"/>
     <RowDefinition Height="*"/>
   </Grid.RowDefinitions>
   <DataGrid Grid.Row="2" AlternationCount="2" AutoGenerateColumns="False"
             CanUserAddRows="False" CanUserDeleteRows="False"
             CanUserReorderColumns="False" CanUserResizeColumns="False"
             CanUserSortColumns="False"
             CanUserResizeRows="False" ColumnHeaderHeight="30"
             FontSize="16" GridLinesVisibility="Horizontal"
             HeadersVisibility="Column" IsReadOnly="True" Name="datagrid"
             RowHeight="28">
     <DataGrid.RowStyle>...</DataGrid.RowStyle>
     <DataGrid.Columns>
       <DataGridTextColumn Width="Auto" MinWidth="25" Binding="{Binding UserID}" Header=""/>
       <DataGridTextColumn Width="Auto" Binding="{Binding UserName}" Header="用户名"/>
       <DataGridTextColumn Width="Auto" Binding="{Binding UserAccount}" Header="帐号"/>
       <DataGridTextColumn Width="Auto" Binding="{Binding UserPasswd}" Header="密码"/>
       <DataGridTextColumn Width="Auto" Binding="{Binding UserPhone}" Header="电话"/>
       <DataGridTextColumn Width="Auto" Binding="{Binding UserEmail}" Header="邮箱"/>
       <DataGridTextColumn Width="Auto" Binding="{Binding UserSex}" Header="性别"/>
     </DataGrid.Columns>
   </DataGrid>
 </Grid>
</Page>

前端文件的内容基本不变,DataGrid的源ItemSource暂不绑定,采用第一大点中的备注1的方式确定数据源。

后端文件内容如下:

using System.Data;
using System.Windows.Controls;
using MySql.Data.MySqlClient;

namespace wpfbase
{
 public partial class PageClient : Page
 {
   MySqlConnection conn;
   MySqlDataAdapter msda;
   MySqlCommand cmd;
   public PageClient()
   {
     InitializeComponent();
     string connStr = "server=127.0.0.1;user=root;password=rootmysql; database=wpfbasedb;";
     conn = new MySqlConnection(connStr);
     conn.Open();
     string sql = "select * from usertable";
     cmd = new MySqlCommand(sql, conn);
     cmd.CommandType = CommandType.Text;
     DataTable dt = new DataTable();
     msda = new MySqlDataAdapter(cmd);
     msda.Fill(dt);
     datagrid.ItemsSource = dt.DefaultView; // 数据绑定
     conn.Close();
   }
 }
}

后台将从数据库查到的数据以DataTable.DefaultView的方式传给datagrid。
datagrid用法详解(datagrid控件详解)

样式和转换器的写法与之前相同!

4.DataGrid实时刷新MySQL数据库显示数据

如果要实时刷新数据库的状态,有两种方式,一种是定时轮询的方式访问数据库,另一种则是监控数据库的数据表,当数据表发生变化时,向客户端发送通知。SQL中有SqlDependency类可以实现通知功能,当数据表变化时,会触发OnChange。



本文地址:软件教程频道 https://www.eeeoo.cn/ruanjian/903191.html,嗨游网一个专业手游免费下载攻略知识分享平台,本站部分内容来自网络分享,不对内容负责,如有涉及到您的权益,请联系我们删除,谢谢!


软件教程
小编:小嗨整编
相关文章相关阅读
  • 我的世界不死图腾获取方式(我的世界不死图腾用法)

    我的世界不死图腾获取方式(我的世界不死图腾用法)

    我的世界不死图腾获取方式(我的世界不死图腾用法)我的世界不死图腾由召唤师掉落,使用林中鬼屋藏宝图找到林中鬼屋,然后进入林中鬼屋的房间里击杀召唤师才能获得。不过不死图腾的掉落率比较低,需要击杀许多召唤师才能获得。我的世界不死图腾用法移除玩家身...

  • ones刻录软件的用法(ones刻录软件怎么刻录数据光盘)?

    ones刻录软件的用法(ones刻录软件怎么刻录数据光盘)?

    ones刻录软件的用法(ones刻录软件怎么刻录数据光盘)?ones刻录软件是一款专业的光盘刻录软件,不仅软件体积小巧、占用内存少,操作简单便捷,而且ones光盘刻录软件功能全面,用户可以通过软件刻录多种格式的文件,轻松上手操作,为用户带来...

  • 什么是Linux系统中nc命令?nc命令的用法详解

    什么是Linux系统中nc命令?nc命令的用法详解

    这篇文章主要介绍了linux系统中nc命令的基本用法,nc命令非常之强大,这里先简单介绍它用来作端口扫描以及文件传输等的基础使用。功能说明:功能强大的网络工具,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。因为它短小...

  • 数据库的substr函数用法是什么

    数据库的substr函数用法是什么

    数据库的substr函数用法:1、【substr(str,pos,len)】从pos开始的位置,截取len个字符;2、【substr(str,pos)】pos开始的位置,一直截取到最后。数据库的substr函数用法:1、SUBSTR(st...

  • c语言中pow函数的用法是什么?

    c语言中pow函数的用法是什么?

    在c语言中pow()函数是用来求x的y次幂。x、y及函数值都是double型,其语法为“doublepow(doublex,doubley)”;其中参数“doublex”表示底数;参数“doubley”表示指数。pow()函数...

  • c语言中fun用法详解

    c语言中fun用法详解

    c语言中fun用法详解fun函数是自定义的C/C++语言函数,函数功能多样。该函数名为“函数”英文function的简写,一般在示例和试题中使用,通常在主函数中被调用。C/C++语言中,fun函数通常被主函数所调用。它是指用fun来定义一个...

  • matlab中zeros函数用法

    matlab中zeros函数用法

    matlab中zeros函数是用于返回一个double类零矩阵,其用法是:1、在命令行窗口中输入“b=zeros(5)”,按回车键可生成一个“5*5”的零矩阵;2、在命令行窗口中输入“b=zeros(3,4)”,并按回车键即可。zeros函...

  • jquery中select2的用法是什么

    jquery中select2的用法是什么

    在jquery中,select2用于优化select使其支持单选和多选,同时也支持分组显示、列表检索,是一款基于jquery的下拉列表插件,调用语法为“$(select).select2()”。本教程操作环境:windows10系统、jq...

  • 周排行
  • 月排行
  • 年排行

精彩推荐