WPF篇(18)-DataGrid数据表格控件+ComboBox下拉框控件

DataGrid数据表格控件

DataGrid是一个可以多选的数据表格控件。所以,它继承一个支持多选的父类——MultiSelector。

public abstract class MultiSelector : Selector
{protected MultiSelector();public IList SelectedItems { get; }protected bool CanSelectMultipleItems { get; set; }protected bool IsUpdatingSelectedItems { get; }public void SelectAll();public void UnselectAll();protected void BeginUpdateSelectedItems();protected void EndUpdateSelectedItems();}

从上面的定义来看,DataGrid多选的结果会保存在SelectedItems 只读属性中,CanSelectMultipleItems 属性用来设置是否开启多选。

1. DataGrid属性分析

DataGrid提供了大量的依赖属性,合理充分利用这些属性,在开发ERP、CMS、报表等软件时可达到事半功倍的效果。这里我给大家只列出常用的和重要的,如果有想了解所有属性的,可以参考官网。

  • RowHeaderTemplate:获取或设置行标题的模板。(重要)
  • CanUserAddRows:是否可以添加新行。 (重要)
  • CurrentItem:当前选中行(一般指绑定的数据源的某一个元素。)(常用)
  • CanUserDeleteRows:是否可以删除行。 (重要)
  • RowHeaderStyle:获取或设置应用于所有行标题的样式。 (重要)
  • IsReadOnly:当前控件是否只读。(常用)
  • ColumnHeaderStyle:获取或设置所有列标题的样式。 (重要)
  • RowStyle:获取或设置应用到的所有行的样式。 (重要)
  • AlternatingRowBackground:获取或设置交替行上使用的背景画笔。 (重要)
  • VerticalGridLinesBrush:获取或设置用于绘制垂直网格线的画笔。 (常用)
  • Columns:获取一个集合中的所有列。 (常用)
  • CellStyle:获取或设置所有单元格的样式。 (常用)
  • FrozenColumnCount: 获取或设置非滚动列的数量。 (常用)
  • AutoGenerateColumns:获取或设置一个值,该值指示是否自动创建列。 (常用)
  • CanUserSortColumns:是否可以单击列标题来对列排序。 (常用)
  • SelectionMode:是否支持多选 。(重要)

在上述,Columns属性是DataGrid最基本的一个属性。它是一个ObservableCollection<DataGridColumn>类型的集合,表示DataGrid的列的集合。其实DataGridColumn只是一个抽象基类,我们真正在实例化时,是实例化DataGridColumn的子类,然后放到Columns属性中。

事件成员

  • Sorting 对列进行排序时发生。
  • AutoGeneratedColumns: 所有列的自动生成完成后发生。
  • AutoGeneratingColumn: 自动生成单独的列时出现。
  • ColumnHeaderDragDelta:每次鼠标位置发生更改时在用户拖动列标题时发生。
  • ColumnHeaderDragStarted: 当用户开始使用鼠标拖动列标题时发生。
  • ColumnHeaderDragCompleted: 当用户使用鼠标拖动后释放列标题时发生。
  • SelectedCellsChanged: 发生时 DataGrid.SelectedCells 集合更改。
  • ColumnReordering:在列移至的显示顺序中的新位置之前发生。
  • RowDetailsVisibilityChanged:当某一行的可见性详细信息元素更改时发生。
  • UnloadingRow:发生时 DataGridRow 对象将成为可供重用。
  • LoadingRowDetails:新的行的详细信息模板应用于行时发生。
  • InitializingNewItem:创建一个新项时出现。
  • PreparingCellForEdit:在单元格进入编辑模式时发生。
  • BeginningEdit:发生行或单元格进入编辑模式之前。
  • CurrentCellChanged:在 DataGrid.CurrentCell 属性的值更改后发生。
  • CellEditEnding:在单元格的编辑将在提交或取消前发生。
  • RowEditEnding:在提交或取消行编辑之前发生。
  • LoadingRow: 加载row时。
  • ColumnDisplayIndexChanged: 其中一个列更改属性时。
  • UnloadingRowDetails:行详细信息元素成为可供重用时发生。
  • AddingNewItem: 新项添加到DataGrid之前发生
  • CopyingRowClipboardContent: 默认行内容准备好之后发生。
  • ColumnReordered: 在列移至的显示顺序中的新位置时发生。

代码示例

前端代码

<Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width="200"/></Grid.ColumnDefinitions><DataGrid x:Name="datagrid" SelectionMode="Extended"IsReadOnly="True" SelectionChanged="datagrid_Selected"><DataGrid.Columns><DataGridTextColumn Header="姓名" Binding="{Binding Name}" /><DataGridTextColumn Header="年龄" Binding="{Binding Age}" /><DataGridTextColumn Header="地址" Binding="{Binding Address}" /></DataGrid.Columns></DataGrid><StackPanel Grid.Column="1"><StackPanel Orientation="Horizontal" Margin="5"><TextBlock Text="姓名:"/><TextBlock x:Name="_TextBlockName"/></StackPanel><StackPanel Orientation="Horizontal" Margin="5"><TextBlock Text="年龄:"/><TextBlock x:Name="_TextBlockAge"/></StackPanel><StackPanel Orientation="Horizontal" Margin="5"><TextBlock Text="地址:"/><TextBlock x:Name="_TextBlockAddress"/></StackPanel></StackPanel></Grid>

后端代码

 public class Person{public string Name { get; set; }public int Age { get; set; }public string Address { get; set; }}/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();datagrid.Items.Add(new Person { Name = "张三", Age = 22, Address = "广东省廉江市车板镇大坝村" });datagrid.Items.Add(new Person { Name = "李四", Age = 23, Address = "江西省景德镇市市辖区" });datagrid.Items.Add(new Person { Name = "王五", Age = 24, Address = "上海市虹口区" });}private void datagrid_Selected(object sender, RoutedEventArgs e){DataGrid datagrid = sender as DataGrid;if (datagrid == null) return;var person = datagrid.SelectedItem as Person;if (person == null) return;_TextBlockName.Text = person.Name;_TextBlockAge.Text = person.Age + "岁";_TextBlockAddress.Text = person.Address;}}

在这里插入图片描述
在这个例子中,我们尽量还原了与ListView控件一致的功能, 需要注意的是:我们将DataGrid的IsReadOnly="True",这是因为我们直接将数据元素一条一条的加入到DataGrid的Items属性中,而Items属性本身是一个只读属性,不支持写入。这样的话,当鼠标双击时会报错。

如果要解决这个问题,这就要用到ItemsControl基类中的ItemsSource数据源属性。

我们需要采用DataGrid另外一种赋值方式——数据源赋值。即把一个集合绑定到该属性上,这样在前端就可以编辑数据源,从而不会引发报错。

后端修改

List<Person> list = new List<Person>();list.Add(new Person { Name = "张三", Age = 22, Address = "广东省廉江市车板镇大坝村" });
list.Add(new Person { Name = "李四", Age = 23, Address = "江西省景德镇市市辖区" });
list.Add(new Person { Name = "王五", Age = 24, Address = "上海市虹口区" });datagrid.ItemsSource = list;

前端修改
AutoGenerateColumns属性设为不可自动创建列。

<DataGrid x:Name="datagrid" SelectionMode="Extended"IsReadOnly="False"AutoGenerateColumns="False"SelectionChanged="datagrid_Selected"><DataGrid.Columns><DataGridTextColumn Header="姓名" Binding="{Binding Name}" /><DataGridTextColumn Header="年龄" Binding="{Binding Age}" /><DataGridTextColumn Header="地址" Binding="{Binding Address}" /></DataGrid.Columns>
</DataGrid>

ComboBox下拉框控件

ComboBox表示带有下拉列表的控件,实际上可以把它看成两个部分组成,一个类似TextBox文本输入框,所以它有一个Text文本属性,用于获取ComboBox框的文本值,另一个是类似ListBox的列表框,用于显示ComboBox绑定的所有数据源。

ComboBox继承于Selector,所以,它只能是单选操作。

属性成员

  • ShouldPreserveUserEnteredPrefix:是否保留用户的输入,或者输入替换匹配项。
  • IsEditable:是否启用或禁用编辑文本框中文本
  • Text:获取或设置当前选定项的文本。
  • IsReadOnly:文本内容是否只读
  • SelectionBoxItem:获取在选择框中显示的项。
  • MaxDropDownHeight:获取或设置一个组合框下拉列表的最大高度。
  • SelectionBoxItemStringFormat:指定选择框中文本的显示格式。
  • StaysOpenOnEdit:在编辑输入框文本时,希望下拉框保持打开,则为true。
  • IsSelectionBoxHighlighted:是否突出显示SelectionBoxItem。
  • IsDropDownOpen:是否打开组合框下拉列表。
  • SelectionBoxItemTemplate:获取选择框内容的项模板。

ComboBox示例

<Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width="200"/></Grid.ColumnDefinitions><StackPanel><ComboBox x:Name="combobox1" IsEditable="True"  Height="30" Margin="20,10" TextBoxBase.TextChanged="combobox1_TextChanged"/><ComboBox x:Name="combobox2" StaysOpenOnEdit="True" VerticalAlignment="Top" SelectionChanged="combobox2_SelectionChanged"Height="30" Margin="20,10" DisplayMemberPath="Name"></ComboBox></StackPanel><StackPanel Grid.Column="1"><StackPanel Orientation="Horizontal" Margin="5"><TextBlock Text="电话:"/><TextBlock x:Name="_TextBlockTel"/></StackPanel><StackPanel Orientation="Horizontal" Margin="5"><TextBlock Text="姓名:"/><TextBlock x:Name="_TextBlockName"/></StackPanel><StackPanel Orientation="Horizontal" Margin="5"><TextBlock Text="年龄:"/><TextBlock x:Name="_TextBlockAge"/></StackPanel><StackPanel Orientation="Horizontal" Margin="5"><TextBlock Text="地址:"/><TextBlock x:Name="_TextBlockAddress"/></StackPanel></StackPanel></Grid>

后端代码

namespace WpfTest01
{public class Person{public string Name { get; set; }public int Age { get; set; }public string Address { get; set; }}public partial class MainWindow : Window{        public MainWindow(){InitializeComponent();List<Person> list = new List<Person>();list.Add(new Person { Name = "张三", Age = 22, Address = "广东省廉江市车板镇大坝村" });list.Add(new Person { Name = "李四", Age = 23, Address = "江西省景德镇市市辖区" });list.Add(new Person { Name = "王五", Age = 24, Address = "上海市虹口区" });combobox2.ItemsSource = list;}private void combobox1_TextChanged(object sender, TextChangedEventArgs e){_TextBlockTel.Text = combobox1.Text;}private void combobox2_SelectionChanged(object sender, SelectionChangedEventArgs e){ComboBox combobox = sender as ComboBox;if (combobox == null) return;var person = combobox.SelectedItem as Person;if (person == null) return;_TextBlockName.Text = person.Name;_TextBlockAge.Text = person.Age + "岁";_TextBlockAddress.Text = person.Address;}}
}

在这里插入图片描述

我们在xaml中实例化了两个ComboBox,第一个直接当成了TextBox来使用;第二个则绑定了一个数据源,并在Xaml中指定了DisplayMemberPath属性显示Person的Name,最后在后端代码中,依然使用SelectedItem 属性获取当前选中项,转化成Person,以获取实际的选中数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/402668.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习day16-类与对象

这里写目录标题 类示例 成员方法self关键字 类与对象构造方法其他类内置方法&#xff08;魔术方法&#xff09;_str_符号_Lt_符号le小于等于比较eq比较运算小结 类 在Python中&#xff0c;class&#xff08;类&#xff09;是一种用于创建对象的模板或蓝图。它封装了数据&#…

基于Django的停车场车辆出入管理系统,可识别车牌图片

研究背景 随着城市化进程的加快&#xff0c;车辆数量不断增加&#xff0c;停车场的管理成为一个日益重要的课题。传统的停车场管理系统依赖人工登记和监控&#xff0c;不仅效率低下&#xff0c;而且容易出现疏漏和错误&#xff0c;难以满足现代社会对停车场管理智能化、高效化…

STM32标准库学习笔记-3.外部中断

参考教程&#xff1a;【STM32入门教程-2023版 细致讲解 中文字幕】 中断 中断含义&#xff1a;在计算机执行主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&…

2024 国内自闭症学校排名榜:突破边界,创造无限可能

在 2024 年&#xff0c;当家长们面对国内自闭症学校的排名榜时&#xff0c;心中或许充满了期待与困惑。然而&#xff0c;这些排名榜虽然能提供一定的参考&#xff0c;但绝不能成为选择学校的唯一依据。家长们更需要深入了解每所学校的真实情况&#xff0c;通过线下考察&#xf…

python及pycharm安装配置

PS&#xff1a;这篇是对于初学者的python以及pycharm配置教程&#xff0c;配置完成后可以直接看我的python学习笔记来进行python全套学习&#xff0c;现在已更新第一部分。 Python学习笔记&#xff08;一&#xff09;-CSDN博客 目录 一、python以及pycharm的安装配置 1.1 py…

Nuxt3:构建的时候报错Search string not found: “for (const existingRoot of buildInfoVersionMap.roots)

我们完成初步页面开发后&#xff0c;需要构建下项目生成我们需要的页面&#xff0c;在执行构建的时候报错&#xff1a; 找了很多资料&#xff0c;这个问题是由于 vue-tsc v1 版本引起&#xff0c;只需要将 vue-tsc 升级到v2 即可 我们在执行删除的时候&#xff0c;结果发现它…

【MySQL】数据库约束

系列文章目录 第一章 数据库基础 第二章 数据库基本操作 文章目录 系列文章目录前言约束关键字一览NOT NULLUNIQUEDEFAULTPRIMARY KEY自增主键 FOREIGN KEY总结 前言 在学习了数据库的增删改查操作之后&#xff0c;接下来就需要进阶的学习关键字来完善SQL语句的条件。学习数据…

数据结构----链表

一丶概念 链表又称单链表、链式存储结构&#xff0c;用于存储逻辑关系为“一对一”的数据。 和顺序表不同同&#xff0c;使用链表存储数据&#xff0c;不强制要求数据在内存中集中存储&#xff0c;各个元素可以分散存储在内存中。 二丶特点 特点&#xff1a;内存不连…

DolphinScheduler集群部署问题(趟坑)总结

目录 官方文档 官方项目地址 问题解决 官方文档 DolphinScheduler | 文档中心 (apache.org) 官方项目地址 部署及使用过程中的问题可以参见项目Issue:Issues apache/dolphinscheduler GitHub GitHub - apache/dolphinscheduler at 3.2.2-release 问题解决 1、JVM在运…

Simple RPC - 05 从零开始设计一个客户端(下)_ 依赖倒置和SPI

文章目录 Pre概述依赖倒置原则与解耦设计与实现1. 定义接口来隔离调用方与实现类2. 实现类DynamicStubFactory3. 调用方与实现类的解耦 依赖注入与SPI的解耦依赖注入SPI&#xff08;Service Provider Interface&#xff09; 总结 Pre Simple RPC - 01 框架原理及总体架构初探 …

网络编程:OSI协议,TCP/IP协议,IP地址,UDP编程

目录 国际网络通信协议标准&#xff1a; 1.OSI协议&#xff1a; 2.TCP/IP协议模型&#xff1a; 应用层 &#xff1a; 传输层&#xff1a; 网络层&#xff1a; IPV4协议 IP地址 IP地址的划分&#xff1a; 公有地址 私有地址 MA…

dotnet常用命令详解

命令预览 基础命令 new&#xff1a;创建项目 restore&#xff1a;恢复依赖 build&#xff1a;编译项目 publish&#xff1a;生成项目需要的文件准备发布项目 run&#xff1a;运行项目 test&#xff1a;测试项目 vstest&#xff1a;从指定的程序集中运行测试 pack&#…

升级阿里云linux服务器上的php版本

查看已安装的php软件包 [rootiZbp13pl2v34qj0thwq9aiZ ~]# rpm -qa|grep php php74-php-common-7.4.26-1.el7.remi.x86_64 oniguruma5php-6.9.7.1-1.el7.remi.x86_64 php74-php-gd-7.4.26-1.el7.remi.x86_64 php74-php-opcache-7.4.26-1.el7.remi.x86_64 php74-php-json-7.4.2…

记录|Git工具——下载GitHub项目

目录 前言一、Step 1. 下载Git二、Step2. 用Git Bash 下载到本地更新时间 前言 参考文章&#xff1a; 1、如何使用Git将Github项目拉到本地 2、git 安装、创建仓库、上传项目、克隆下载、常用命令 – 一篇文章总结&#xff08;适用github / gitee&#xff09; 3、Git的使用【入…

政策驱动,科技引领,漫途信息化监测方案守护农村饮水安全!

近日&#xff0c;山西省人民政府正式发布《山西省农村供水高质量发展规划》&#xff0c;明确到2030年&#xff0c;全面实现农村24小时供水&#xff0c;县域农村饮水安全标准化建设达标率力争达到80%&#xff0c;基本实现农村供水城市化、城乡供水均等化。 现阶段部分地区受…

ArcGIS简单介绍

ArcGIS体系结构 &#xff08;1&#xff09;GIS Server 宿主各种GIS资源&#xff0c;将他们封装为服务提供给客户端应用。GIS Server分为两部分&#xff1a;Server Object Manager&#xff08;SOM&#xff09;和Server Object Containers&#xff08;SOCs&#xff09;。一个SO…

Java语言程序设计——篇十三(4)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

仪表板展示|DataEase看中国:2024巴黎奥运会中国体育代表团战绩报告

背景介绍 北京时间2024年8月12日凌晨&#xff0c;巴黎奥运会闭幕。在本届奥运会中&#xff0c;我们不仅见证了许多新世界纪录的诞生&#xff0c;更看到了中国体育的强大实力与无限潜力。中国运动健儿们卓越的表现和顽强的拼搏精神&#xff0c;不但让国人为之自豪&#xff0c;也…

Windows 11 Build 27686 上手体验:2TB FAT32、更好的沙盒等功能

Windows 11 Build 27686 现已在 Insider Program 的 Canary 频道发布&#xff0c;其中包含一些有趣的内容。该版本确认了微软更改 FAT32 大小限制的计划&#xff0c;并将其大小限制从 32GB 提高到 2TB。与此同时&#xff0c;沙盒也得到了改进。让我们来详细了解一下此次更新。 …

【卡码网Python基础课 16.出现频率最高的字母】

目录 题目描述与分析描述2.分析 一、哈希表二、代码编写 题目描述与分析 描述 题目描述&#xff1a; 给定一个只包含小写字母的字符串&#xff0c;统计字符串中每个字母出现的频率&#xff0c;并找出出现频率最高的字母&#xff0c;如果最高频率的字母有多个&#xff0c;输出…