01

概述

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

02

效果演示

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编程大全

C# WPF DataGrid获取单元格并改变背景色相关推荐

  1. 【EasyUI】DataGrid 合并单元格 - 使用实例

    官方文档 - EasyUI 合并单元格 为了合并数据网格(datagrid)单元格,只需简单地调用 'mergeCells' 方法,并传入合并信息参数,告诉数据网格(datagrid)如何合并单元格. ...

  2. EasyUI DataGrid 合并单元格

    EasyUI DataGrid 合并单元格 1 function mergeCells(){ 2 var arr =[{mergeFiled:"field",premiseFile ...

  3. POI:根据单元格的自定义名获取单元格的位置

    在Excel单元格设置自定义名,利用代码就可以获取单元格具体的位置 // Setup code     String cellName = "TestName";     Work ...

  4. Swift之点击UITableView单元格动态改变cell高度

    基于上一篇文章,继续需要实现点击相应的表格单元格动态改变cell的高度(上一篇文章的地址Swift之动态适配UITableView的cell高度) 首先需要实现UITableView的tableVie ...

  5. POI获取单元格颜色与设置单元格颜色

    ExcelDTO @Data public class ExcelDto {String text;String color;public ExcelDto() {}public ExcelDto(S ...

  6. VBA操作Excel之获取单元格区域

    VBA操作Excel之获取单元格区域 一.VBA通过索引引用工作表 二.VBA获取单元格区域 三.VBA调用方法参数传值 参考文档 一.VBA通过索引引用工作表 VBA打开工作簿后,通常一个工作簿有若 ...

  7. Excel插件获取单元格批注以及设置批注

    Excel插件获取单元格批注以及设置批注 获取批注 设置批注 获取批注 CComQIPtr<Excel::Range> sRange(m_spExcelApp->GetActiveC ...

  8. 帆软报表获取单元格的值的几种方式,包括分页预览,填报预览,新填报预览

    帆软报表获取单元格的值的方式在分页预览,填报预览,新填报预览都是不同的,没有统一的方式,这给使用者带来一定的不便.现在总结一下. 分页预览: getCellValue: function (cellP ...

  9. C#Winform中DataGridView控件根据鼠标左右键获取单元格值或者行列

    有多种方法可以获取单元格的值或者行列,此处选用了两种方式去获取分别用了CurrentCell方法和Rows[].Cells[]的方法去获取行列值 鼠标左键获取单独行列值 此处获取左键行列值的触发条件是 ...

最新文章

  1. C++ .h(头文件) 与 .cpp(源文件) 的使用
  2. Web前端——字体规范
  3. CCNP张SIR的视频教程(完全可以下载)
  4. C语言hw,[c语言]EmailAddresses(for hw)
  5. 基于继承类的属性模版中无法绑定的原因和解决方法
  6. Android Broadcast广播机制分析
  7. Lua的继承(利用setmetatable)
  8. orika 映射非空字段_Orika:将JAXB对象映射到业务/域对象
  9. Javascript ECMA-1(数据类型,字符串操作)
  10. 使用planetaryjs插件实现3维地球仪效果
  11. 计算机转换外界信息原理,高级文秘及办公自动化教程-计算机基础
  12. 小白的python学习实录 基础篇(八)面向对象
  13. 学校选课网筛选器的设想
  14. ✨❤️CSDN标题党❤️,创意无极限,那不直接全网站都花的飞起?
  15. 2020年区块链行业十大趋势
  16. 古典概型——概率论与数理统计(宋浩)
  17. Python——字典类型理论及应用实例
  18. 手机APP开发之MIT Appinventor详细实战教程(十三),云服务器的数据遇到的问题和解决的方法,以及网页客户端的详细使用方法,WIFI通信,数据获取在one net平台的相关应用
  19. tensorboard命令报错:tensorboard.util has no attribute Retriev
  20. 字体设计符号组合多功能微信小程序源码 带流量主

热门文章

  1. MFC 直线 虚线 折线 圆 椭圆 矩形 弧形
  2. MySQL的四种不同查询的分析
  3. 解决ssh使用一段时间断开的问题
  4. 深入浅出理解索引结构
  5. [学习笔记]状压dp
  6. mac SecureCRT设置
  7. PHP和Mysql处理IP地址
  8. UVA-1045 - The Great Wall Game(二分图最佳匹配)
  9. Java 关于中文乱码处理的经验总结
  10. PostgreSQL表的行数统计