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

01

概述

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

02


效果演示

890cbe29787ef90cb69e5d9437d9a20a.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);
            //}
            //方案1
            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);
            //Console.WriteLine(str);


            //方案2
            colindex = 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编程大全      

WPFDataGrid可以通过绑定来实现单元格字体颜色的改变。在XAML,可以通过在DataGrid的CellStyle设置Trigger来实现,如下所示: ``` xml <DataGrid> <DataGrid.CellStyle> <Style TargetType="{x:Type DataGridCell}"> <Style.Triggers> <DataTrigger Binding="{Binding Path=YourBindingProperty}" Value="YourValue"> <Setter Property="Foreground" Value="Red"/> <!-- 设置字体颜色为红色 --> </DataTrigger> <Style.Triggers> </Style> </DataGrid.CellStyle> </DataGrid> ``` 其,YourBindingProperty是绑定到DataGrid数据源的属性,当属性值等于YourValue时,就会触发Trigger的设置,将字体颜色设置为红色。这里只是简单的例子,实际情况可能需要根据不同属性设置不同的颜色。 另外,也可以通过继承DataGrid来自定义单元格样式。在自定义的DataGrid,可以重写GetCellContainer方法来获取单元格,然后通过设置单元格的Foreground属性来改变字体颜色,如下所示: ``` csharp public class MyDataGrid : DataGrid { protected override System.Windows.DependencyObject GetContainerForCellOverride() { return new MyDataGridCell(); } } public class MyDataGridCell : DataGridCell { protected override void OnBindingChanged(System.Windows.DependencyPropertyChangedEventArgs e) { base.OnBindingChanged(e); Brush foreground; // 根据不同的属性设置不同的颜色 if(/* Your condition */) { foreground = Brushes.Red; } else if(/* Your condition */) { foreground = Brushes.Green; } else { foreground = Brushes.Black; } // 设置字体颜色 this.Foreground = foreground; } } ``` 通过自定义DataGridCell,并重写OnBindingChanged方法实现根据不同属性设置不同颜色,然后通过设置字体颜色来改变单元格字体颜色。 以上是两种实现DataGrid单元格字体颜色改变的方法,可以根据实际需要选择使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值