C# WPF DataGrid获取单元格并改变背景色

01

概述

WPF 自带了一个表格控件datagrid,这个控件类似winfrom中的datagridview,在数据显示的时候也经常会用到,这节主要讲解如何从后台代码获取到单元格控件并改变其相关属性:背景色、前景色、字体等。

02


效果演示

3c80803f65729555fda08af206d1772e.gif

03


代码

后台cs:

using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;namespace Caliburn.Micro.Hello
{/// <summary>/// ShellView.xaml 的交互逻辑/// </summary>public partial class ShellView : UserControl{public ShellView(){InitializeComponent();}private void DG_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e){int colindex = -1;int rowindex = -1;//方法1//DataGridCellInfo info = new DataGridCellInfo(dg.Items[0], dg.Columns[2]);//方法2//foreach (DataGridCellInfo info in this.dgSourceData.SelectedCells)//{//    string str = ((TextBlock)info.Column.GetCellContent(info.Item)).Text;//    Console.WriteLine(str);//}//方案1var info = this.dgSourceData.SelectedCells.FirstOrDefault();var str = ((TextBlock)info.Column.GetCellContent(info.Item)).Text;//((TextBlock)info.Column.GetCellContent(info.Item)).Foreground = new SolidColorBrush(Colors.Red);//Console.WriteLine(str);//方案2colindex = this.dgSourceData.CurrentCell.Column.DisplayIndex;//获取选中单元格列号//rowindex = this.dgSourceData.SelectedIndex;//获取选中单元格行号for (int i = 0; i < ShellViewModel.StudentList.Count(); i++){if (ShellViewModel.StudentList[i] == this.dgSourceData.CurrentItem){//MessageBox.Show("当前选择的行是:" + i.ToString());rowindex = i;}}DataGridRow row = (DataGridRow)dgSourceData.ItemContainerGenerator.ContainerFromIndex(rowindex);//获取选中单元格所在行DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);//函数调用,获取行中所有单元格的集合DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(colindex);//锁定选中单元格(重点)if (cell != null){TextBlock tb = cell.Content as TextBlock;Console.WriteLine(tb.Text);dgSourceData.ScrollIntoView(row, dgSourceData.Columns[colindex]);//cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(colindex);cell.Focus();cell.Background = new SolidColorBrush(Colors.Red);//OK!问题解决,选中单元格变色cell.Foreground = new SolidColorBrush(Colors.Yellow);cell.FontSize = 20;}}private void dgSourceData_BeginningEdit(object sender, DataGridCellEditEndingEventArgs e){}/// <summary>/// 获取父可视对象中第一个指定类型的子可视对象/// </summary>/// <typeparam name="T">可视对象类型</typeparam>/// <param name="parent">父可视对象</param>/// <returns>第一个指定类型的子可视对象</returns>public static T GetVisualChild<T>(Visual parent) where T : Visual{T childContent = default(T);int numVisuals = VisualTreeHelper.GetChildrenCount(parent);for (int i = 0; i < numVisuals; i++){Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);childContent = v as T;if (childContent == null){childContent = GetVisualChild<T>(v);}if (childContent != null){ break; }}return childContent;}public void dgSourceData_SelectionChanged(object sender, SelectionChangedEventArgs e){MessageBox.Show(1111.ToString());//SelectionMode="Extended" SelectionUnit="Cell" 模式下触发不了}}
}

前台xaml:

<DataGrid Name="dgSourceData" AutoGenerateColumns="False" ItemsSource="{Binding StudentList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" ContextMenu="{Binding menu1}" RowHeaderWidth="30"  SelectedItem ="{Binding SelectedItems}" SelectionMode="Single" SelectionUnit="Cell"cal:Message.Attach="[Event SelectionChanged]=[GridControl_SelectionChanged($source,$eventArgs)];" SelectedCellsChanged="DG_SelectedCellsChanged" CellEditEnding="dgSourceData_BeginningEdit" SelectionChanged="dgSourceData_SelectionChanged" ><DataGrid.Columns><DataGridTextColumn Header="Name"  Binding="{ Binding Path=Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" MinWidth="68"/><DataGridTextColumn Header="Age" Binding="{ Binding Path=Age,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" MinWidth="68"/><DataGridTextColumn Header="Id"  Binding="{ Binding Path=Id,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" MinWidth="48"/></DataGrid.Columns></DataGrid>

04


解析

① 因为我需要绑定SelectedCellsChanged事件,所以前台将默认的行选中模式修改为单元格选中模式:

SelectionMode="Single" SelectionUnit="Cell"

这样修改后SelectionChanged这个事件将不再触发(只有在行选中模式下生效);

②获取选中单元格的值:

var info = this.dgSourceData.SelectedCells.FirstOrDefault();var str = ((TextBlock)info.Column.GetCellContent(info.Item)).Text;

③获取选中的列号:

colindex = this.dgSourceData.CurrentCell.Column.DisplayIndex;//获取选中单元格列号

④获取选中行的行号

在SelectionUnit="FullRow" 时候:

可以通过这样获取:

rowindex = this.dgSourceData.SelectedIndex;//获取选中单元格行号

在当SelectionUnit="Cell"时:

我是通过选中单元格对应行的信息和表格控件绑定的集合匹配获取行号的:

for (int i = 0; i < ShellViewModel.StudentList.Count(); i++){if (ShellViewModel.StudentList[i] == this.dgSourceData.CurrentItem){//MessageBox.Show("当前选择的行是:" + i.ToString());rowindex = i;}}

⑤获取选中单元格并改变字体颜色:

var info = this.dgSourceData.SelectedCells.FirstOrDefault();var str = ((TextBlock)info.Column.GetCellContent(info.Item)).Text;((TextBlock)info.Column.GetCellContent(info.Item)).Foreground = new SolidColorBrush(Colors.Red);

05


源码下载

网盘下载链接:https://pan.baidu.com/s/1TD2BT5hiT-z-_7Z2Bn3PVQ

提取码:添加小编微信获取

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全      

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

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

相关文章

PingingLab传世经典系列《CCNA完全配置宝典》-3.4 Trunk进阶配置

3.4 Trunk进阶配置实验目的&#xff1a;1、掌握Native vlan和Allow vlan的配置。2、理解Native vlan和Allow vlan的功能。实验拓扑&#xff1a;实验步骤&#xff1a;1、依据图中拓扑配置4台主机的IP地址&#xff0c;其中PC通过路由器模拟&#xff0c;配置如下&#xff1a;PC1(c…

python浮点数类型与数学_Python3标准库:decimal定点数和浮点数的数学运算

1. decimal定点数和浮点数的数学运算 decimal模块实现了定点和浮点算术运算&#xff0c;使用的是大多数人所熟悉的模型&#xff0c;而不是程序员熟悉的模式(即大多数计算机硬件实现的IEEE浮点数运算)。Decimal实例可以准确的表示如何数&#xff0c;对其上火其下取整&#xff0c…

业务功能中包含邮件发送,怎么测试?

前言网站开发中&#xff0c;经常碰到需要发送邮件的场景。比如&#xff0c;重置用户密码&#xff0c;需要执行下列流程&#xff1a;用户在重置页面输入邮箱地址进入邮箱&#xff0c;使用获得的重置链接打开重置页面输入新密码一般来说&#xff0c;重置链接都需要包含一个token值…

如何用CSS让一个容器水平垂直居中?

- 第一类&#xff08;被居中的元素有固定的宽高&#xff09; 效果&#xff1a; 第一种方法&#xff08;绝对定位 负margin&#xff09;<div class"div1"> <div class"div2"></div> </div><style type"text/css"&g…

和男朋友出去玩,该去哪里​?

1 当代熬夜人的脑回路&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 确实需要找一下眼珠子&#xff08;via.剪怪不怪&#xff0c;侵删&#xff09;▼3 原来是老师想太多&#xff08;via.万事屋纸纸酱&#xff0c;侵删&#xff09;▼4 有一个会英语的妈妈&#x…

查询表结构的语句总结

四种方式&#xff1a;① DESC 表名② DESCRIBE 表名③ SHOW COLUMNS FROM 表名④ SHOW CREATE TABLE 表名从以上图片结果中可以看出&#xff1a;show columns 和 desc 和 describe 的结果是一样的&#xff0c;即&#xff1a;会将查询的表的每个字段的具体信息列出来,查询的行数…

ch340串口驱动_关于串口下载问题和超时

串口下载适用于mini、精英、战舰、探索者、阿波罗429不适用于阿波罗767&#xff0c;H743&#xff0c;号令者1052保证板子在独立供电状态下&#xff0c;电源灯处于亮灯状态下&#xff0c;USB线接板子上USB_232&#xff0c;RXD 和 PA9(STM32 的 TXD)TXD 和 PA10(STM32的 RXD)通过…

tcpdump抓取HTTP包

http://blog.csdn.net/kofandlizi/article/details/8106841 cpdump -XvvennSs 0 -i eth0 tcp[20:2]0x4745 or tcp[20:2]0x4854 0x4745 为"GET"前两个字母"GE" 0x4854 为"HTTP"前两个字母"HT" 说明&#xff1a; 通常情况下:一…

cobbler工作流分析

官网 http://cobbler.github.io/ 介绍 Cobbler是一个快速网络安装linux的服务&#xff0c;而且在经过调整也可以支持网络安装windows。该工具使用python开发&#xff0c;小巧轻便&#xff0c;使用简单的命令即可完成PXE网络安装环境的配置&#xff0c;同时还可以管理DHCP、DNS、…

数学到底有多难难难难?看完这个,瞬间觉得智商都提高了!

▲ 点击查看数学家陈省身曾说过&#xff0c;我们每个人一生都花了很多时间学数学&#xff0c;但我们其实只是学会了计算&#xff0c;而不是数学。不知道你有没有听说过这样一句话&#xff1a;想要学好数学&#xff0c;就要靠刷题。尽管我们不得不承认&#xff0c;确实需要不断地…

matlab机械臂工作空间代码_【ROS-Moveit!】机械臂控制探索(3)——基于python的API示例代码分析...

本文参考Moveit!官方文档。系统&#xff1a;ubuntu 18.04 / 16.04ROS&#xff1a;Melodic / Kinetic概述基于python的运动组API是最简单的MoveIt!用户接口。其中提供了用户常用的大量功能封装&#xff0c;例如&#xff1a;设置目标关节控制或笛卡尔空间位置创建运动规划移动机器…

竟然有如何奇葩的如厕方式......

1 密集恐惧症一下子都好啦&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 请选择适合您的如厕方式&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 为什么当年的粉丝没有现在像这样互掐&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 怕什么…

crm开源系统 tp框架_八个开源的 Spring Boot 前后端分离项目,一定要收藏!

点击蓝色字关注我们前后端分离已经在慢慢走进各公司的技术栈&#xff0c;不少公司都已经切换到这个技术栈上面了。即使贵司目前没有切换到这个技术栈上面&#xff0c;也非常建议大家学习一下前后端分离开发&#xff0c;以免在公司干了两三年&#xff0c;SSH 框架用的滚瓜烂熟&a…

Spark运行原理剖析

http://ihoge.cn/2018/Spark%20Scheduler.html Apache Spark是一个开源的&#xff0c;强大的分布式查询和处理引擎。它提供MapReduce的灵活性和可扩展性&#xff0c;但速度明显更高。 Spark的核心是根据RDD来实现的&#xff0c;Spark Scheduler则为Spark核心实现的重要一环…

那些奇奇怪怪的男性用品......

1 原来浣熊竟是我自己&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 能不能对全靠运气&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 万万没想到是这个结局&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 真实版出猪车&#xff08;素材来…

.Net Minimal API 介绍

Minimal APIs 是.Net 6 中新增的模板&#xff0c;借助 C# 10 的一些特性以最少的代码运行一个 Web 服务。本文脱离 VS 通过 VS Code&#xff0c;完成一个简单的 Minimal Api 项目的开发。创建项目新建一个文件夹&#xff0c;用来管理我们的项目文件&#xff0c;文件夹内启动命令…

access 子窗体 鼠标滚动不工作_Python GUI项目实战(五)明细信息窗体的完善

前言上一节我们实现了明细窗体GUI的搭建&#xff0c;并且设置了查看、修改、添加三种不同的状态&#xff0c;框架搭建好了&#xff0c;内容并没有填充&#xff0c;本节我们继续完善这个项目&#xff0c;将学生信息填充进明细窗体中。一、填充当前学生信息1.需求目前我们已经实现…

弹性式分布数据集RDD——Pyspark基础 (二)

连载中&#xff1a;http://ihoge.cn/tags/pyspark/ title: 弹性式分布数据集RDD——Pyspark基础 &#xff08;二&#xff09; date: 2018-04-15 17:59:21 comments: true categories: - Spark tags: - pyspark RDD的内部运行方式 RDD不仅是一组不可变的JVM&#xff08;…

导师都有哪些“秘密”没有告诉你?

全世界只有3.14 % 的人关注了爆炸吧知识真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内心的格局&#xff0c;见识的深浅决定人生的深浅&#xff0c;格局的大小决定了人生之路是宽是窄。今天给大家推荐几个有深度、有想法的公众号&#xff0c;希望能够给你带…

2021年全球知名开源项目大更新

下面简单回顾 2021 年一些带来较大变化和影响的项目更新信息。PHP 8.1.0 正式发布枚举&#xff0c;只读属性&#xff0c;First-class 可调用语法&#xff0c;新的初始化器&#xff0c;纯交集类型&#xff0c;Never 返回类型&#xff0c;Final 类常量&#xff0c;显式八进制数字…