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

news2024/9/22 4:22:20

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.coloradmin.cn/o/2037240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Animetronic - hackmyvm

简介 靶机名称&#xff1a;Animetronic 难度&#xff1a;简单 靶场地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmAnimetronic 本地环境 虚拟机&#xff1a;vitual box 靶场IP&#xff08;Animetronic&#xff09;&#xff1a;192.168.130.188 windows_…

Golang 为何如此之快:性能分析

Golang 是一种相对年轻但很流行的语言&#xff0c;IBM 和 Google 等公司都在使用这种语言。在本文中&#xff0c;我们将了解 Golang 的特别之处。 Golang 被认为是世界上编译速度最快的语言之一。谷歌、Uber 和 Twitch 等科技公司都喜欢使用它&#xff0c;并依靠它进行内部开发…

HarmonyOS(50) 截图保存功能实现

componentSnapshot实现截图 前言权限配置和申请权限配置权限申请 componentSnapshot截图实现将PixelMap转换成图片格式保存截图到系统相册保存截图到应用沙箱全部源码参考资料 前言 HarmonyOS提供了componentSnapshot实现组件截图功能&#xff0c;可以将UI截图成为image.Pixel…

WMS助力企业数字化转型(七)

WMS系统可以帮助企业实现更精确的库存控制&#xff0c;避免库存积压和缺货现象。通过对历史数据的分析&#xff0c;企业可以预测需求趋势&#xff0c;优化库存结构&#xff0c;从而减少资金占用和运营成本。同时&#xff0c;WMS还支持与其他系统的无缝对接&#xff0c;如企业资…

限时营销与开源AI智能名片O2O商城小程序的深度融合:重塑线上促销策略的新视角

摘要&#xff1a;在数字化营销日益激烈的今天&#xff0c;限时促销活动作为吸引用户注意力、激发购买欲望的传统手段&#xff0c;面临着前所未有的挑战。随着线上营销活动的泛滥&#xff0c;消费者对传统折扣策略已逐渐产生疲劳与免疫。因此&#xff0c;探索一种更加高效、精准…

开放式耳机最不伤耳吗?舒适度高的几款精选蓝牙耳机

开放式耳机对耳朵的伤害相对较小&#xff0c;但不能说它是最不伤耳的耳机。 与传统入耳式耳机相比&#xff0c;开放式耳机的优点在于不会深入耳道&#xff0c;减少了对耳朵的压迫感和耳道内的压力&#xff0c;佩戴起来更加舒适。同时&#xff0c;开放式设计允许空气流通&#…

免费简单的制作3D卡通建模——Fuse软件和Readyplayer的使用介绍

最终效果 文章目录 最终效果一、使用Fuse软件去Steam下载安装捏人选择身体部位自定义人物细节参数换装贴图修改导出OBJ文件即可 二、使用ReadyplayerReadyplayer官网地址选择从模板开始&#xff0c;或者拍照选择图片进行捏脸将模型导入Unity通过Readyplayer官方插件导入模型通过…

白盒测试-发送请求-引出MockMvc源码类

白盒测试是什么&#xff1f; 一般是测开做白盒测试&#xff0c;研发做白盒 spring boot是和junit结合 原本是jmeter发请求&#xff0c;是看不到代码逻辑&#xff0c;有接口信息就可以实现 用测试代码发请求&#xff0c;能看到代码逻辑&#xff0c;比接口测试更全面&#xf…

大恒相机通过Line2或Line3直接给出3.3V触发,形成分时曝光

大恒相机通过Line2或Line3直接给出3.3V触发&#xff0c;形成分时曝光 一、分时曝光需求二、3.3V信号分时曝光设计 写在前面 上班了&#xff0c;没多少时间再去精度论文了&#xff0c;大多是项目上的事情。 一、分时曝光需求 一般的12V光源通过光源控制器与大恒相机Line1线连接…

PDF转换器推荐:轻松将图片批量转为PDF

高质量的图片与文档管理已经逐渐成为了我们日常工作中不可或缺的一部分。为了防止图片在传输的过程中被压缩&#xff0c;我经常将他们转换为PDF格式。这次我给你推荐几个我常用的图片转PDF的小工具吧。 1.福昕PDF转换大师 链接一下>>https://www.pdf365.cn/pdf2word/ …

关于自己部署AI大模型踩的坑(一)——硬件篇

最近一直在研究如何打算属于我自己的J.A.R.V.I.S.&#xff08;钢铁侠中的机器人管家&#xff09;。 上一篇写了我最近在部署自己的大模型&#xff0c;使用llama3.1&#xff0c; 和通义千问2。虽然最终结果也是成功了&#xff0c;过程却十分地坎坷。 所以这一篇文章一是总结其中…

keepalived基础

目录 1 高可用集群简介 1.1 高可用的概念 1.2 常见的 HA 集群 1.3 高可用集群软件 2 keepalived的功能与用途 2.1 LVS directors failover功能 2.2 LVS cluster nodes healthchecks功能 3 VRRP协议介绍 4 Keepalived 架构 5 原理总结 1 高可用集群简介 1.1 高可用的概念 高可…

数据埋点系列 5|数据驱动决策:形成数据驱动文化

在过去的几篇文章中&#xff0c;我们深入探讨了数据埋点、数据质量保证、数据分析和可视化等主题。现在&#xff0c;让我们站在更高的视角&#xff0c;讨论如何将这些技术和方法整合到实际的业务决策中&#xff0c;以及如何在组织中建立真正的数据驱动文化。 目录 1. 回顾&am…

Github 2024-08-14 C开源项目日报Top10

根据Github Trendings的统计,今日(2024-08-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10Objective-C项目1PHP项目1Python项目1PHP:流行的Web开发脚本语言 创建周期:4710 天开发语言:C, PHP协议类型:OtherStar数量:37340 …

【Pyspark-驯化】一文搞懂Pyspark修改hive表描述以及增加列使用技巧

【Pyspark-驯化】一文搞懂Pyspark修改hive表描述以及增加列使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获取 微…

C++11 STL中的Vector使用细节

容器 支持泛型 Vector常用成员函数示例迭代器操作插入和删除操作 与find 配合:vector 一些复杂操作 Vector 的内存管理策略压入对象 需要无参构造.压入对象指针 高效插入和删除 迭代器失效 代码优化: 二维及多维空间生成 容器 支持泛型 vector<int> vi;vector<double…

中国数据库的前世今生:披荆斩棘,乘风破浪

文章目录 前言国外数据库技术蓬勃发展中国信息化起步与发展&#xff08;数据库技术探索&#xff09;国外数据库商战策略解决燃眉之急学习先进技术 数据库技术的新格局雷声大雨点小的千年虫新型数据库的诞生国产数据库展露头脚 开源助力国产数据库弯道超车去“IOE”化大数据席卷…

使用OIDC登录kubesphere遇到的坑细节

1.通过代理telepresence到本地调试&#xff0c;使用默认账号密码&#xff0c;提示账号密码错误。 2.kubesphere在sso登录的时候&#xff0c;提示签名错误&#xff0c;其实这个错误不是很明确&#xff0c;所以要到本地调试&#xff0c;找到根本原因。 # 错误1 Tnauthorized: fa…

《Linux运维总结:基于ARM64架构CPU使用docker-compose一键离线部署etcd 3.5.15容器版分布式集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面对不同的客户部署业务系统&#xff0…

skywalking架构

1.整体架构 整个架构&#xff0c;分成上、下、左、右四部分&#xff1a; 在SkyWalking中&#xff0c;trace 数据和 metrics 数据是两种关键的监控数据类型&#xff0c;它们帮助你理解应用的运行状态、性能瓶颈和故障点 1.1Trace 数据 Trace 数据是分布式追踪数据&#xff0c;它…