NEWS

[DEVEXPRESS] Chia sẽ class Helper tìm và đếm dữ liệu trùng lắp trên Gridview

[DEVEXPRESS] Chia sẽ class Helper tìm và đếm dữ liệu trùng lắp trên Gridview
Đăng bởi: Thảo Meo - Lượt xem: 4756 15:18:19, 02/07/2021C#   In bài viết

Xin chào các bạn, bài viết hôm nay mình sẻ tiếp tục chia sẻ đến các bạn class Helper dùng để tìm và đếm dữ liệu trùng lắp trên Gridview Devexpress C# Winform.

[DEVEXPRESS] Find and Count Duplicate Value in Gridview C# Winform

Với số lượng dữ liệu lên đến hàng nghìn, thậm chí hàng chục nghìn mà đôi lúc bạn thao tác nhầm thì rất có thể nó sẽ bị trùng lặp.

Chính vì thế mà tính năng tìm dữ liệu trùng lặp trong Gridview Duplicate value ra đời giúp người dùng có thể dễ dàng lọc dữ liệu trùng lặp trong phần mềm.

Giúp bạn dễ dàng loại bỏ những dữ liệu dư thừa ra khỏi ứng dụng.

Dưới đây là giao diện ứng dụng:

count_duplicate_value_gridview_devexpress

Ở hình trên các bạn thấy, mình đã tích hợp thêm chức năng Duplicate Value khi right click vào từng ô header trên Gridview thì nó sẽ thực hiện 2 công việc:

  1. Tô màu dữ liệu trùng lắp, mỗi giá trị một màu riêng biệt
  2. Thêm cột Count vào gridView và hiển thị số dữ liệu trùng.

Với chức năng này giúp cho các bạn kiểm tra dữ liệu một cách nhanh chóng.

Video demo ứng dụng:

Source code GridviewHelper.cs:

using DevExpress.Utils.Menu;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Menu;
using DevExpress.XtraGrid.Views.Grid;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FindDuplicateColumnValue
{
    class GridViewHelper
    {
        private static List<string> columnValues = new List<string>();
        public static void FindDuplicateAndCount(object sender, PopupMenuShowingEventArgs e, GridControl gridcontrol, GridView gridView, string FormName)
        {                  
            if (e.MenuType == GridMenuType.Column)
            {
                GridViewColumnMenu menu = e.Menu as GridViewColumnMenu;                
                if (menu.Column != null)
                {
                    var menu_duplicateValue = new DXMenuCheckItem("Duplicate Value");
                    menu_duplicateValue.ImageOptions.Image = Properties.Resources.ic_count;
                    menu.Items.Add(menu_duplicateValue);
                    menu_duplicateValue.Click += (ss, ee) =>
                    {
                        var nameColumnFindDuplicate = menu.Column.FieldName;
                        if (gridcontrol.DataSource is DataTable)
                        {
                            DataTable table = (gridcontrol.DataSource as DataTable);
                            var values = table.AsEnumerable().Select(x => x[nameColumnFindDuplicate].ToString());
                            columnValues = values.ToList();
                        }
                        else
                        {
                            var data = JsonConvert.SerializeObject(gridcontrol.DataSource);
                            JArray categories = JArray.Parse(data);
                            var values = categories.AsEnumerable().Select(x => x[nameColumnFindDuplicate].ToString());
                            columnValues = values.ToList();
                        }
                        JArray jArraydataSource;
                        var duplicates = new List<(string, int, Color)>();
                        if (gridcontrol.DataSource is DataTable)
                        {
                            DataTable table = (gridcontrol.DataSource as DataTable);
                            duplicates = table.AsEnumerable()
                                         .GroupBy(dr => dr[nameColumnFindDuplicate])
                                         .Where(g => g.Count() > 1)
                                         .Select(g => (g.First()[nameColumnFindDuplicate].ToString(), g.Count(), GetRandomColour()))
                                         .ToList();
                            var data = JsonConvert.SerializeObject(table);
                            jArraydataSource = JArray.Parse(data);
                        }
                        else
                        {
                            var data = JsonConvert.SerializeObject(gridcontrol.DataSource);
                            jArraydataSource = JArray.Parse(data);
                            duplicates = jArraydataSource
                                         .GroupBy(dr => dr[nameColumnFindDuplicate])
                                         .Where(g => g.Count() > 1)
                                         .Select(g => (g.First()[nameColumnFindDuplicate].ToString(), g.Count(), GetRandomColour()))
                                         .ToList();
                        }


                        GridColumn newColumn = new GridColumn();
                        var gridColumn = gridView.Columns.Where(x => x.FieldName == nameColumnFindDuplicate).FirstOrDefault();
                        gridView.Columns.Remove(gridView.Columns.ColumnByFieldName("Count"));
                        int index = gridView.Columns[nameColumnFindDuplicate].VisibleIndex;
                        newColumn.Caption = "Count";
                        newColumn.FieldName = "Count";
                        newColumn.Width = 45;
                        newColumn.UnboundDataType = typeof(int);
                        newColumn.Visible = true;


                        gridView.Columns.Insert(index + 1, newColumn);
                        newColumn.VisibleIndex = index + 1;

                        var hashsetData = new HashSet<HashsetDuplicate>();
                        duplicates.Select(x => hashsetData.Add(new HashsetDuplicate(x.Item1, x.Item2))).ToList();


                        gridView.CustomUnboundColumnData += (sss, eee) => { GridView1_CustomUnboundColumnData(sss, eee, nameColumnFindDuplicate, jArraydataSource, hashsetData); };
                        gridView.RowCellStyle += (sss, eee) => { GridView1_RowCellStyle(sss, eee, duplicates, nameColumnFindDuplicate); };
                        gridView.RefreshData();


                    };
                }
            }
        }

        public class HashsetDuplicate
        {
            public string Name { get; set; }
            public int Count { get; set; }
            public HashsetDuplicate(string name, int count)
            {
                this.Name = name;
                this.Count = count;
            }
        }

        public static void GridView1_CustomUnboundColumnData(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDataEventArgs e, string columnDuplicate, JArray jArraydataSource, HashSet<HashsetDuplicate> duplicates)
        {
            if ((sender as GridView).DataSource is DataView)
            {
                var name = (e.Row as DataRowView).Row[columnDuplicate].ToString();
                var categoriesText = duplicates.Where(c => c.Name.ToString() == name.ToString()).FirstOrDefault()?.Count;
                e.Value = categoriesText;
            }
            else
            {
                var curent = JsonConvert.SerializeObject(e.Row);
                JObject rss = JObject.Parse(curent);
                var name = rss[columnDuplicate];
                var categoriesText = duplicates.Where(c => c.Name.ToString() == name.ToString()).FirstOrDefault()?.Count;
                e.Value = categoriesText;
            }

        }

        public static void GridView1_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e, List<(string, int, Color)> duplicate, string nameColumnFindDuplicate)
        {
            if (duplicate == null)
            {
                if (e.Column.FieldName.Equals(nameColumnFindDuplicate))
                {

                    e.Appearance.BackColor = DevExpress.XtraEditors.XtraForm.DefaultBackColor;
                }
                return;
            }
            var val = (sender as GridView).GetRowCellValue(e.RowHandle, nameColumnFindDuplicate);
            if (val == null)
                return;
            string svalue = val.ToString();
            var datass = columnValues.Where(s => s.Equals(svalue)).ToList();
            if (columnValues.Where(s => s.Equals(svalue)).ToList().Count > 1)
            {
                if (e.Column.FieldName.Equals(nameColumnFindDuplicate))
                {
                    var color = duplicate.Where(x => x.Item1 == e.CellValue.ToString()).FirstOrDefault().Item3;
                    e.Appearance.BackColor = color;
                }

            }
        }

        public static List<Color> colors = new List<Color>();
        public static Random rand = new Random();
        public static Color GetRandomColour()
        {


            Color coltemp = Color.FromArgb(125, rand.Next(256), rand.Next(256), rand.Next(256));
            while (colors.Contains(coltemp))
            {
                coltemp = Color.FromArgb(125, rand.Next(256), rand.Next(256), rand.Next(256));
            }
            return coltemp;
        }
    }
}

Ở form main các bạn chỉ cần gọi sự kiện PopupMenuShowing là xong.

using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Grid;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace FindDuplicateColumnValue
{
    public partial class Form1 : DevExpress.XtraEditors.XtraForm
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            gridControl1.DataSource = CreateDataSourceObject();
            gridView1.PopupMenuShowing += (ss, ee) => { GridViewHelper.FindDuplicateAndCount(ss, ee, gridControl1, gridView1, this.Name); };
        }
        List<Employee> CreateDataSourceObject()
        {
            var dataTable = new List<Employee>();

            dataTable.Add(new Employee("Nguyễn Thảo", "05/06/2013 23:23:11", "Sinh viên",  "2013", new TimeSpan(4, 15, 40), true));
            dataTable.Add(new Employee("Nguyễn Đình Tuyên", "01/01/2013", "Giáo Viên", "2013", new TimeSpan(6, 15, 40), false));
            dataTable.Add(new Employee("Trịnh Quốc Khang", "09/05/2013", "Giảng Viên",  "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("Nguyễn Phương Nhi", "09/05/2013","Sinh viên", "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("Cái Trí Minh", "09/05/2013","Giáo sư", "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("Cái Trí Minh", "09/05/2013", "Tiến Sĩ", "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("Võ Sơn Băng", "09/05/2013","Sinh viên", "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("Hoàng Thị Thảo", "09/05/2013", "Giảng Viên", "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("Thảo Meo", "09/05/2013", "Giảng Viên", "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("Nguyễn Thị Cẩm Tú", "09/05/2013", "Giảng Viên", "60", new TimeSpan(4, 25, 40), true));
            dataTable.Add(new Employee("Nguyễn Thảo", "09/05/2013", "Giảng Viên", "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("Hoàng Dược Sư", "09/05/2013", "Tiến Sĩ", "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("Âu Dương Phong", "09/05/2013", "Tiến Sĩ", "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("Nguyễn Thảo", "09/05/2013", "Tiến Sĩ", "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("Tiểu Long Nữ", "09/05/2013", "Sinh viên", "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("Nguyễn Đình Tuyên", "09/05/2013", "Sinh viên", "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("CR7", "09/05/2013", "Sinh viên", "60", new TimeSpan(4, 25, 40), false));
            dataTable.Add(new Employee("CR7", "09/05/2013", "Sinh viên", "60", new TimeSpan(4, 25, 40), false));
            return dataTable;
        }
    }
}

class Employee
{
    static int _id;
    public int ID { get; private set; }
   
    public string Name { get; set; }
    public DateTime OrderDate { get; set; }
    public int StartYear { get; set; }
    public string Job { get; set; }
    public bool Ready { get; set; }
    public TimeSpan Time { get; set; }

    public Employee(){}

    public Employee(string name, string orderDate, string job, string startYear, TimeSpan time, bool ready)
    {
        ID = Interlocked.Increment(ref _id);
        Name = name; 
        OrderDate =Convert.ToDateTime(orderDate);
        StartYear = Convert.ToInt32(startYear);
        Job = job;
        Time = time;
        Ready = ready;
    }

}

Thanks for waching!

DOWNLOAD SOURCE

THÔNG TIN TÁC GIẢ

BÀI VIẾT LIÊN QUAN

[DEVEXPRESS] Chia sẽ class Helper tìm và đếm dữ liệu trùng lắp trên Gridview
Đăng bởi: Thảo Meo - Lượt xem: 4756 15:18:19, 02/07/2021C#   In bài viết

CÁC BÀI CÙNG CHỦ ĐỀ

Đọc tiếp
.