C# WPF入门学习主线篇(十)—— DataGrid常见属性和事件

news2024/11/29 4:33:29

C# WPF入门学习主线篇(十)—— DataGrid常见属性和事件

欢迎来到C# WPF入门学习系列的第十篇。在前面的文章中,我们已经学习了 ButtonTextBoxLabelListBoxComboBox 控件。今天,我们将探讨 WPF 中的另一个重要控件——DataGrid。本文将详细介绍 DataGrid 的常见属性和事件,并通过示例代码展示其在实际应用中的使用。

一、DataGrid的基础知识

DataGrid 是一个非常强大的控件,用于显示和操作表格数据。它允许用户以表格形式查看数据,并支持排序、分组、筛选、编辑等功能。

DataGrid的基本定义

我们先来看看一个简单的 DataGrid 定义:

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid x:Name="myDataGrid" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>
    </Grid>
</Window>

在这个示例中,我们定义了一个 DataGrid 控件,并设置了 AutoGenerateColumns 属性为 True,这意味着列将自动根据数据源生成。

二、DataGrid的常见属性

1. ItemsSource

ItemsSource 属性用于绑定 DataGrid 的数据源。可以是数组、列表或任何实现了 IEnumerable 接口的集合。

<DataGrid x:Name="myDataGrid" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        myDataGrid.ItemsSource = new List<Person>
        {
            new Person { Name = "John Doe", Age = 30 },
            new Person { Name = "Jane Smith", Age = 25 }
        };
    }
}

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

在这里插入图片描述

2. AutoGenerateColumns

AutoGenerateColumns 属性决定是否自动生成列。设置为 False 时,需要手动定义列。

<DataGrid x:Name="myDataGrid" AutoGenerateColumns="False" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        <DataGridTextColumn Header="Age" Binding="{Binding Age}"/>
    </DataGrid.Columns>
</DataGrid>

3. ColumnHeaderHeight

ColumnHeaderHeight 属性设置列标题的高度。

<DataGrid x:Name="myDataGrid" ColumnHeaderHeight="40" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>

4. CanUserAddRows

CanUserAddRows 属性设置用户是否可以添加新行。

<DataGrid x:Name="myDataGrid" CanUserAddRows="False" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>

5. CanUserDeleteRows

CanUserDeleteRows 属性设置用户是否可以删除行。

<DataGrid x:Name="myDataGrid" CanUserDeleteRows="False" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>

6. IsReadOnly

IsReadOnly 属性设置 DataGrid 是否为只读。

<DataGrid x:Name="myDataGrid" IsReadOnly="True" AutoGenerateColumns="True" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>

示例

下面是一个包含以上常见属性的完整示例:

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid x:Name="myDataGrid" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="True" IsReadOnly="False"
                  ColumnHeaderHeight="40" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Age" Binding="{Binding Age}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
using System.Collections.Generic;
using System.Windows;

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            myDataGrid.ItemsSource = new List<Person>
            {
                new Person { Name = "John Doe", Age = 30 },
                new Person { Name = "Jane Smith", Age = 25 }
            };
        }
    }

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

三、DataGrid的常见事件

1. LoadingRow

LoadingRow 事件在行加载时触发。

XAML代码
<DataGrid x:Name="myDataGrid" AutoGenerateColumns="True" LoadingRow="MyDataGrid_LoadingRow" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>
后台代码
private void MyDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
    e.Row.Header = (e.Row.GetIndex() + 1).ToString();
}

2. SelectionChanged

SelectionChanged 事件在选择的项目发生更改时触发。

XAML代码
<DataGrid x:Name="myDataGrid" AutoGenerateColumns="True" SelectionChanged="MyDataGrid_SelectionChanged" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>
后台代码
private void MyDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    DataGrid dataGrid = sender as DataGrid;
    Person selectedPerson = dataGrid.SelectedItem as Person;
    if (selectedPerson != null)
    {
        MessageBox.Show($"Selected Person: {selectedPerson.Name}, Age: {selectedPerson.Age}");
    }
}

3. CellEditEnding

CellEditEnding 事件在单元格编辑即将结束时触发。

XAML代码
<DataGrid x:Name="myDataGrid" AutoGenerateColumns="True" CellEditEnding="MyDataGrid_CellEditEnding" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Height="300"/>
后台代码
private void MyDataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    MessageBox.Show("Cell editing is ending.");
}

示例总结

以下是一个包含所有三种常见事件的完整示例:

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <!-- 定义一个 Grid 容器,用于布局子控件 -->
    <Grid>
        <!-- 定义一个 DataGrid 控件 -->
        <DataGrid x:Name="myDataGrid"
                  AutoGenerateColumns="True" <!-- 自动生成列 -->
                  LoadingRow="MyDataGrid_LoadingRow" <!-- 行加载事件 -->
                  SelectionChanged="MyDataGrid_SelectionChanged" <!-- 选择更改事件 -->
                  CellEditEnding="MyDataGrid_CellEditEnding" <!-- 单元格编辑结束事件 -->
                  HorizontalAlignment="Left" VerticalAlignment="Top" <!-- 控件水平和垂直对齐 -->
                  Width="500" Height="300"/> <!-- 控件宽度和高度 -->
    </Grid>
</Window>
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent(); // 初始化组件

            // 初始化数据源并绑定到 DataGrid
            myDataGrid.ItemsSource = new List<Person>
            {
                new Person { Name = "John Doe", Age = 30 },
                new Person { Name = "Jane Smith", Age = 25 }
            };
        }

        // 行加载事件处理程序
        private void MyDataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            // 设置行头为行索引加一(从1开始)
            e.Row.Header = (e.Row.GetIndex() + 1).ToString();
        }

        // 选择更改事件处理程序
        private void MyDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // 获取触发事件的 DataGrid
            DataGrid dataGrid = sender as DataGrid;
            // 获取选中的项目并转换为 Person 类型
            Person selectedPerson = dataGrid.SelectedItem as Person;

            if (selectedPerson != null) // 如果有选中的项目
            {
                // 显示选中的人的名字和年龄
                MessageBox.Show($"Selected Person: {selectedPerson.Name}, Age: {selectedPerson.Age}");
            }
        }

        // 单元格编辑结束事件处理程序
        private void MyDataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
            // 显示单元格编辑结束消息
            MessageBox.Show("Cell editing is ending.");
        }
    }

    // 定义一个简单的 Person 类,用于数据绑定
    public class Person
    {
        public string Name { get; set; } // 名字属性
        public int Age { get; set; } // 年龄属性
    }
}

四、总结

本文详细介绍了 WPF 中 DataGrid 控件的常见属性和事件,通过具体的示例代码展示了如何使用这些属性和事件。通过本文的学习,读者应该能够掌握 DataGrid 的基本用法,并在实际项目中灵活运用这些知识。

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

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

相关文章

CHATGPT升级plus(已有账号前提下)

注册wildcard(虚拟卡) 注册号账号后先进行充值&#xff0c;充值后选择CHATGPT一键升级按照他的流程来即可 Wildcard网址&#xff1a;Wildcard跳转注册 填写邀请码充值时少两美金合计14&#xffe5; 邀请码&#xff1a;OL3QXTRH

Adobe Illustrator 矢量图设计软件下载安装,Illustrator 轻松创建各种矢量图形

Adobe Illustrator&#xff0c;它不仅仅是一个简单的图形编辑工具&#xff0c;更是一个拥有丰富功能和强大性能的设计利器。 在这款软件中&#xff0c;用户可以通过各种精心设计的工具&#xff0c;轻松创建和编辑基于矢量路径的图形文件。这些矢量图形不仅具有高度的可编辑性&a…

Codeforces Round 951 (Div. 2)

A - Guess the Maximum 直接暴力枚举 a i , a i 1 a_i,a_{i1} ai​,ai1​找最小的最大值 答案即为最小的最大值-1 code: #include<bits/stdc.h> #define endl \n #define fast() ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr) #define F first #…

skywalking学习

文章目录 前言一、skywalking单体安装部署1. 下载skywalking2. 部署oap和oap-ui服务3. 测试skywalking监控springboot应用 二、搭建swck(skywalking集群)1.安装k8s2.下载swck3.设置pod自动注入java agent 三、skywalking监控python四、skywalking监控cpp总结参考 前言 本文主要…

RTKLIB之RTKPLOT画图工具

开源工具RTKLIB在业内如雷贯耳&#xff0c;其中的RTKPLOT最近正在学习&#xff0c;发现其功能之强大&#xff0c;前所未见&#xff0c;打开了新的思路。 使用思博伦GSS7000卫星导航模拟器,PosApp软件仿真一个载具位置 1&#xff0c;RTKPLOT支持DUT 串口直接输出的NMEA数据并…

HCL模拟器下做M-LAG测试(以及和华为配置对比)-二层架构

1.简单二层架构 1.1 拓扑图 1.2 配置 1.2.1 Leaf1配置 system-mac必须配置&#xff0c;否则会有一个node处于unknown状态&#xff0c;即使配置主节点的mac&#xff0c;主节点也需要配置system-mac为自己的mac ## M-LAG配置[Leaf1] m-lag system-mac 0001-0001-0001 # 手动设…

MFC 教程-回车时窗口退出问题

【问题描述】 MFC窗口默认时&#xff0c;按回车窗口会退出 【原因分析】 默认调用OnOK() 【解决办法】 重写虚函PreTranslateMessage BOOL CTESTMFCDlg::PreTranslateMessage(MSG* pMsg) {// TODO: 在此添加专用代码和/或调用基类// 修改回车键的操作反应 if (pMsg->…

物理安全防护如何创新强化信息安全体系?

物理安全防护是信息安全体系的重要组成部分&#xff0c;它通过保护实体设施、设备和介质等&#xff0c;防止未授权访问、破坏、盗窃等行为&#xff0c;从而为信息系统提供基础的安全保障。要创新强化信息安全体系中的物理安全防护&#xff0c;可以从以下几个方面着手&#xff1…

企业数字化转型的测度难题:基于大语言模型的新方法与新发现

《经济研究》新文章《企业数字化转型的测度难题&#xff1a;基于大语言模型的新方法与新发现》运用机器学习和大语言模型构造一套新的企业数字化转型指标。理论分析和数据交叉验证均表明&#xff0c;构建的指标相对已有方法更准确&#xff1a; 1.第一步&#xff1a;选择“管理…

Redis常用命令——List篇

提到List&#xff0c;我们第一时间想到的就是链表。但是在Redis中&#xff0c;List更像是一种双端队列&#xff0c;例如C中的deque。它可以快速高效的对头部和尾部进行插入和删除操作。本片文章主要对List列表的相关命令进行详解&#xff0c;希望本篇文章会对你有所帮助。 文章…

js--hasOwnProperty()讲解与使用

@TOC 前言 hasOwnProperty(propertyName)方法 是用来检测属性是否为对象的自有属性 object.hasOwnProperty(propertyName) // true/false 讲解 hasOwnProperty() 方法是 Object 的原型方法(也称实例方法),它定义在 Object.prototype 对象之上,所有 Object 的实例对象都会继…

高考志愿选专业,如何分析自己的兴趣爱好?

之所以在选择专业的时候比较迷茫&#xff0c;就是对自己不够了解&#xff0c;没有分析过自己的兴趣爱好&#xff0c;所以也不知道如何选择适合自己的专业&#xff0c;但是他们又不得不做出更深入的了解&#xff0c;因为专业的选择将关系到未来的职业道路和生活方向。 对于绝大…

java 大型企业MES生产管理系统源码:MES系统与柔性化产线控制系统的关系、作用

MES定义为“位于上层的计划管理系统与底层的工业控制之间的面向车间层的管理信息系统”,它为操作人员/管理人员提供计划的执行、跟踪以及所有资源(人、设备、物料、客户需求等)的当前状态。 MES系统与柔性化产线控制系统的关系 MES&#xff08;制造执行系统&#xff09;是一种…

Apifox的使用

1、了解Apifox的工具特点和使用方法 2、使用Apifox辅助生成接口文档&#xff0c;尝试使用Apifox进行其他前后端调试。 Apifox IDEA 插件快速上手 | Apifox 帮助文档 Apifox IDEA 插件来啦&#xff01;是真的超好用&#xff01;_哔哩哔哩_bilibili 21分钟学会Apifox_哔哩哔哩…

Python 机器学习 基础 之 【实战案例】中药数据分析项目实战

Python 机器学习 基础 之 【实战案例】中药数据分析项目实战 目录 Python 机器学习 基础 之 【实战案例】中药数据分析项目实战 一、简单介绍 二、中药数据分析项目实战 三、数据处理与分析实战 1、数据读取 2、中药材数据集的数据处理与分析 2.1数据清洗 2.2、 提取别…

什么是大型语言模型 ?

引言 在本文[1]中&#xff0c;我们将从高层次概述大型语言模型 (LLM) 的具体含义。 背景 2023年11月&#xff0c;我偶然间听闻了OpenAI的开发者大会&#xff0c;这个大会展示了人工智能领域的革命性进展&#xff0c;让我深深着迷。怀着对这一领域的浓厚兴趣&#xff0c;我加入了…

计算机网络--计算机网络概念

计算机网络--计算机网络概念 计算机网络--物理层 计算机网络--数据链路层 计算机网络--网络层 计算机网络--传输层 计算机网络--应用层 0.计算机网络简介 0.2 计算机网络的功能简介 数据通信(连通性)资源共享&#xff1a; 软件硬件数据 分布式处理 多台计算机各自承担同…

每日一题——Python实现PAT甲级1015 Reversible Primes(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 is_prime函数分析&#xff1a; decimal_to_base函数分析&#xff1a; 主循…

Segment Anything

参考&#xff1a;【图像分割】Segment Anything&#xff08;Meta AI&#xff09;论文解读-CSDN博客 背景 提示分割任务&#xff1a;在给定任何分割提示下返回一个有效的分割掩码目标&#xff1a;开发一个可提示的图像分割的基础模型&#xff0c;在一个广泛的数据集上预训练&a…

【网络安全的神秘世界】在win11搭建pikachu靶场

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 下载pikachu压缩包 https://github.com/zhuifengshaonianhanlu/pikachu 下载好的pikachu放在phpstudy_pro/www目录下 创建pikachu数据库 打开phpstudy软件…