DataGrid小扩展

     因为WPF中的DataGrid达不到开发中的要求,所以就试着改了一下。改后感觉效果不错,整理后发出来,希望大家多多批评指教。

    主要修改如下。

    1。增加合计单元格功能。

    2。每行有一个CheckBox,表示选择该行。

PopupInfo.xaml(用作显示合计数)

<sc:Popup x:Class="Controls.PopupInfo"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             xmlns:sc="clr-namespace:System.Windows.Controls.Primitives;assembly=PresentationFramework" >
    <sc:Popup.Child>
        <StackPanel >
            <Border BorderBrush="Silver" BorderThickness="1" Background="#FF47BBF2">
                <TextBlock x:Name="TotalLB" Margin="6,3" ></TextBlock>
            </Border>
        </StackPanel>
    </sc:Popup.Child>
</sc:Popup>

PopupInfo.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Controls.Primitives;

namespace Controls
{
    /// <summary>
    /// PopupInfo.xaml 的交互逻辑
    /// </summary>
    public partial class PopupInfo : Popup
    {
        public PopupInfo()
        {
            InitializeComponent();
        }

        public void Display(string mess)
        {
            this.TotalLB.Text = mess;
            this.IsOpen = true;
        }

        public void Hide()
        {
            this.IsOpen = false;
        }
    }
}

DataGridEx.xaml

<smc:DataGrid   x:Class="Controls.DataGridEx"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                mc:Ignorable="d" 
                xmlns:smc="clr-namespace:System.Windows.Controls;assembly=PresentationFramework"
                xmlns:my="clr-namespace:Controls" 
                CanUserAddRows="False" CanUserDeleteRows="False"
                SelectionUnit="CellOrRowHeader"
                MouseUp="DataGridEx_MouseUp"
                MouseDoubleClick="DataGrid_MouseDoubleClick">
    <smc:DataGrid.Resources>
        <my:PopupInfo x:Key="popupInfoKey" Placement="Mouse"></my:PopupInfo>
    </smc:DataGrid.Resources>

</smc:DataGrid>

DataGridEx.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Controls
{
    /// <summary>
    /// DataGridEx.xaml 的交互逻辑
    /// </summary>
    public partial class DataGridEx : DataGrid
    {
        public DataGridEx()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(DataGridEx_Loaded);
        }
        private PopupInfo pInfo = null;

        void DataGridEx_Loaded(object sender, RoutedEventArgs e)
        {
            pInfo = this.FindResource("popupInfoKey") as PopupInfo;

            DataGridCheckBoxColumn seleCol = new DataGridCheckBoxColumn();
            seleCol.Header = "选择";
            this.Columns.Insert(0, seleCol);

            this.Loaded -= DataGridEx_Loaded;
        }

        //显示合计
        private void DataGridEx_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (this.SelectedCells.Count > 1)
            {
                try
                {
                    decimal total = 0;
                    foreach (DataGridCellInfo cell in this.SelectedCells)
                    {
                        TextBlock cellTB = cell.Column.GetCellContent(cell.Item) as TextBlock;
                        total += Convert.ToDecimal(cellTB.Text);
                     }
        this.pInfo.Display("合计:"+total);
                     return;
                }
                catch
                {

                }
            }
            pInfo.Hide();
        }

        public bool DoubleClickCheckItem { get; set; }

        //双击选中CheckBox
        private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if ( this.CurrentCell != null)
            {
                this.SelectedItem = this.CurrentCell.Item;
                if (DoubleClickCheckItem)
                {    
                    CheckBox cc = (this.Columns[0].GetCellContent(this.CurrentCell.Item)) as CheckBox;
                    if (cc != null)
                    {
                        cc.IsChecked = !cc.IsChecked;
                    }
                }
            }
        }

        //返回选中项
        public List<object> CheckedItems()
        {
            List<object> result = new List<object>();

            foreach (object item in this.Items)
            {
                CheckBox cc = (this.Columns[0].GetCellContent(item)) as CheckBox;
                if (cc.IsChecked == true)
                {
                    result.Add(item);
                }
            }

            return result;
        }

        //全选
        public void CheckAll()
        {
            foreach (object item in this.Items)
            {
                CheckBox cc = (this.Columns[0].GetCellContent(item)) as CheckBox;
                cc.IsChecked = true;
            }
        }

        //取消全选
        public void ClearAllChecked()
        {
            foreach (object item in this.Items)
            {
                CheckBox cc = (this.Columns[0].GetCellContent(item)) as CheckBox;
                cc.IsChecked = false;
            }
        }

    }
}

调用方法与一般的DataGrid一样。调用CheckAll全选,调用ClearAllChecked取消全选,CheckedItems返回选中项。DoubleClickCheckItem=true时双击单元格时选中该记录。

------------------------------------------------------------
如非注明都是原创,如需转载请注出处。
原文地址:https://www.cnblogs.com/Ivan83/p/2133584.html