- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[DEVEXPRESS] Chia sẽ class Helper tìm và đếm dữ liệu trùng lắp trên Gridview
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:
Ở 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:
- Tô màu dữ liệu trùng lắp, mỗi giá trị một màu riêng biệt
- 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!